アルテラSoC FPGAチップに基づいたデバイスでLinuxを更新し、Windowsサーバーの共有リソースにアクセスする





Terasicは最近 、非常に興味深いDE0-Nano-SoCキットの販売を開始しました。 非常に手頃な価格で、統合されたデュアルコアARM Cortex-A9プロセッサを備えたアルテラCyclone V SoC FPGAチップに基づく非常に強力で機能豊富な開発者キットが提供されるという点で興味深いです。 さらに、ボードを完成させたメーカーは、MicroSDメモリカードに展開されるLinuxを提供しています。



しかし、このボードを自由に使用できるようになったとき、LinuxはYocto Projectのソースからコンパイルされていたため、すぐにいくつかの問題に遭遇しました。 基本的に、すべての問題は、不足しているコンポーネントをシステムに追加できるパブリックリポジトリの不足に関連していました。 たとえば、ネットワーク経由でこのデバイスからWindowsサーバーの共有リソースにアクセスするために、カーネルにはCifsファイルシステムサポートモジュールがありませんでした。



したがって、まず、カーネルを更新し、Yoctoをより使い慣れたDebian Wheezyに置き換え、Windowsサーバーの共有リソースにアクセスするために必要なすべてを再インストールすることにしました。



組み立てプロセスは私によって研究され、 この記事の推奨に従って実行されました。著者のDes333に感謝します。



完全な変更は私の計画に含まれていなかったため、ボードに付属のLinux 3.13イメージから、ブートローダーをカードに残すことにしました。 タイプA2のセクションでは、まったく触れないことにしました。



タスク





カーネルアセンブリ



私の人生の主な作業環境はWindowsであるため、Linuxを構築するためのすべての手順は、仮想マシンにインストールされたLinux Mint 17.2 Cinnamon OSから実行されました。



1.ターミナルを起動してルートモードに入ります-毎回sudoコマンドを入力しないようにします。

sudo -i
      
      





この場合、/ rootがホームディレクトリになります-その中のすべてを行います。



2.アルテラSoCエンベデッドデザインスイート(EDS)パッケージに含まれるクロスコンパイラを使用して、カーネルをコンパイルします。 したがって、最新のアルテラSoC EDSパッケージをダウンロードしてインストールしてください。 アルテラSoC EDSは現在バージョン15.0です。 このパッケージは、アルテラのWebサイトから直接ダウンロードできます。



アルテラSoC EDSは、/ root / altera / 15.0ディレクトリにインストールされます。



3. build-essentialをインストールします。

 apt-get install build-essential
      
      





4. libncursesをインストールします。

 apt-get install libncurses5-dev
      
      





5.アルテラリポジトリからlinux-socfpgaソースをダウンロードし、ホームディレクトリに展開します。





その結果、Linuxカーネルバージョン4.1のソースコードを含むディレクトリ/root/linux-socfpga-4.1が表示されます。



修正 (2016年2月11日):

マスターではなくタグではなくsocfpga- * brandiesを使用する必要があります

たとえば、 socpfga-4.3

これは、必要なSoC機能を備えたパッチが適用される場所です。

したがって、ソースについては、 ここにアクセスする必要がありますヒントについてはDes333に感謝します!



6. Alterスクリプトを実行します。これにより、新しいBASHが起動され、その中のいくつかの環境変数(PATHなど)が修正されます。 このBASHを離れることなく、すべてのコンパイルアクションを実行します。

 cd /root/altera/15.0/embedded ./embedded_command_shell.sh
      
      





7.いくつかの環境変数を作成します。

 export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000
      
      





8. socfpgaのデフォルト構成を作成します。

 cd /root/linux-socfpga-4.1 make socfpga_defconfig
      
      





これにより、ARMでのコンパイル用にシャープ化された.config構成ファイルが作成されます。



9.不足しているコンポーネントをカーネル構成に追加します(または余分なコンポーネントを削除します)。

 make menuconfig
      
      





これにより、メニューのある擬似グラフィックウィンドウが開きます。






共有ネットワークリソースにアクセスできるようにするために、 CIFSファイルシステムドライバーを追加する必要があります。 システムにドライバーを追加するには、カーネルに直接追加する方法と外部プラグインとして追加する方法の2つがあります。



パスファイルシステム->ネットワークファイルシステムに沿って進み、 CIFSサポートに立ち、スペースバーを押します-文字MCIFSサポートポートの反対側に表示されます-つまり、プラグイン外部モジュールが使用されます。 後で個別にコンパイルし、外部モジュールのディレクトリに配置する必要があります。 もう一度スペースバーを押すと、文字Mがアスタリスク記号に変わります。これは、ドライバーがカーネルに直接組み込まれることを意味します。



:後で、システムの操作性を確認すると、共有Windowsサーバーディスクからファイルをコピーしようとすると、外部cifsモジュールがクラッシュすることが判明しました。 カーネルに組み込まれたcifsドライバーは完璧に機能しました。 他のバージョンのカーネル(3.19など)で外部モジュールを使用する場合、このような問題は発生しませんでした。 私は何が起こったのか理由を見つけることができませんでした。



また、 HighMemサポートを有効にする必要があります。有効にしないと、システムは256 MBのRAMを使用できません。 これを行うには、 Kernel Features-> High Memory Supportのパスに沿って移動し、スペースバーを押します。



メニューを終了します-終了するまでEXITを押します。 質問に対して-設定を保存する必要がありますか- はいと答えます。



10.カーネルをコンパイルします。

 make uImage
      
      





私の場合、仮想マシンに与えられたコアは1つだけでした。 コンパイルプロセスには約20分かかりました。 複数のコアを備えたマシンでコンパイルを実行する場合、速度を上げるために、コンパイルプロセスを複数のコアに並列化することができます。 これを行うには、 -jオプションを使用してコアの数を明示的に設定する必要があります。 たとえば、3つのコアの力によるコンパイルの場合:

 make -j 3 uImage
      
      





11.デバイスに対応するdtbファイルをコンパイルします。 古いdtbファイルを使用すると、起動時にデバイスがハングするか、作業中にひどいグリッチが発生します。





コンパイルの結果、次の2つのファイルが作成されました。

 /root/linux-socfpga-4.1/arch/arm/boot/zImage /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb
      
      





12.構成段階で外部モジュールを使用するオプションを選択した場合は、それらをコンパイルする必要があります。

CIFSモジュールのコンパイル:

 make M=fs/cifs
      
      





暗号化モジュールのコンパイル-共有Windowsリソースをマウントするときに必要になります。

 make M=crypto
      
      





13.カーネルとdtbファイルをカードにコピーします。 最初に、カーネルとDTBファイルが別のFAT32パーティションに置かれるように、カードがカットされました。 これらのファイルを書き込みます。 唯一の注意:DTBファイルの名前を変更する必要があります-そのため、カードのFAT32セクションに既にあるものと同じ名前が付けられます。





ファイルシステムアセンブリ



このサブセクションでは、 この記事に書かれていることをほぼ繰り返しますが、将来的にはこのマニュアルを使いやすくするため、完全に説明します。



Debian 7 Wheezyを収集します:



1.ファイルシステムの構築に必要なパッケージをインストールします。

 apt-get install debootstrap qemu-user-static binfmt-support
      
      





2.ディレクトリを作成し、必要なファイルをすべてそこにロードします。

 cd /root mkdir debian7 debootstrap --arch armel --foreign wheezy debian7 http://ftp.debian.org/debian
      
      





3. ARMアーキテクチャ用に構築されたアプリケーションを実行するには、 qemu staticを使用します 。 これを行うには、ファイルをdebian7ディレクトリにコピーします。

 cp /usr/bin/qemu-arm-static debian7/usr/bin/
      
      





4.新しいファイルシステムに移動します。

 chroot debian7 /bin/bash
      
      





5.インタプリタのプロンプトが「名前がありません!@Hostname:/#」に変更された場合、すべてがうまくいきました。

組み立てプロセスを完了します。

 /debootstrap/debootstrap --second-stage
      
      





6. / etc / inittabに次の行残します。

 /etc/inittab id:5:initdefault: si::sysinit:/etc/init.d/rcS ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin S:2345:respawn:/sbin/getty 115200 console
      
      





7.ルートアカウントのパスワードを設定します。

 passwd
      
      





8.新しいファイルシステムをアーカイブにパックします。

 tar -cpzf debian7.tar.gz --exclude=debian7.tar.gz /
      
      





9. chrootを終了します。

 exit
      
      





10.カードのext3パーティションをアンマウントしてからフォーマットします(カーネルアセンブリの条項13のパーティションの名前を参照)。

 umount /dev/sdb2 mkfs.ext3 /dev/sdb2
      
      





11. ext3パーティションをマウントします。

 mount /dev/sdb2 /mnt/
      
      





12. ext3セクションのカードのファイルシステムでアーカイブを解凍します。

 tar -xzf /root/debian7/debian7.tar.gz -C /mnt/
      
      





13.カーネルアセンブリ中に外部モジュールを使用するオプションを選択した場合、カーネルアセンブリプロセスのステップ12でコンパイルした外部モジュールをカードに書き込む必要があります。

 cd /mnt/lib mkdir modules mkdir modules/4.1.0 mkdir modules/4.1.0/extra mkdir modules/4.1.0/kernel mkdir modules/4.1.0/kernel/crypto cp /root/linux-socfpga-4.1/fs/cifs/cifs.ko ./modules/4.1.0/extra/ cp /root/linux-socfpga-4.1/crypto/*.ko ./modules/4.1.0/kernel/crypto/
      
      





14.セクションをアンマウントします。

 umount /dev/sdb1 umount /dev/sdb2
      
      





それだけです-カードの準備ができたら、デバイスにインストールして起動できます。



最終的な改良



デバイスをロードした後、所定の場所で画像をシャープにします。



1.組み込みのシリアルポート経由でデバイスに接続して、デバイスのDebianにログインします。



2.カーネルのアセンブリ中に外部モジュールを使用するオプションが選択された場合、カーネルの外部モジュールに関する情報を含むファイルを生成する必要があります。

 depmod -a
      
      





3. Debian 7リポジトリをリポジトリのリストに追加します(ドイツ語のサーバーを追加しました):

 echo "deb http://ftp.de.debian.org/debian wheezy main" > /etc/apt/sources.list
      
      





4.デバイスをイーサネットネットワークに接続します。 DHCP経由でアドレスを取得します。

 dhclient -4 eth0
      
      





5.間違った時間では共有リソースをマウントできないため、NTPを上げます。

 apt-get update apt-get install ntp
      
      





6.タイムゾーンを設定します。

 dpkg-reconfigure tzdata
      
      





7.すべてがうまくいったことを確認するには、サーバーボールをマウントします。 たとえば、私の場合、次のようにしました。

 mount //192.168.48.4/distrib /mnt -o username=jok40
      
      





8. SSHサーバーをインストールします。 シリアルポートを使用するのは不便です。シリアルポートを使用すると、入力したコマンドが列80に達した後、行の先頭まで表示されるためです。

 apt-get install openssh
      
      





9. eth0インターフェースに静的アドレスを割り当てます-将来的にはSSH経由でデバイスに接続しやすくなります。 これを行うには、interfacesファイルを編集します。

 nano /etc/network/interfaces
      
      





私の場合、次のようになり始めました。

 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.48.27 netmask 255.255.255.0 gateway 192.168.48.1 network 192.168.48.0 broadcast 192.168.48.255 auto eth0
      
      





10. resolv.confファイルを編集して、DNSクライアントが正常に機能するようにします。

 nano /etc/resolv.conf
      
      





次の行を追加します。

 nameserver 192.168.48.1 nameserver 8.8.8.8
      
      





11.デバイスを再起動します。



12.すべてが正しく行われたことを確認するには

イーサネット経由でSSH経由でデバイスに接続します。






ご清聴ありがとうございました!



All Articles