1: 2019-06-29 (土) 07:27:42 yuji ソース 現: 2020-12-26 (土) 16:08:05 yuji ソース
Attached file: u-boot.bin, Deleted an attach file: u-boot.bin at 2019-06-30 (日) 22:01:44
Line 1: Line 1:
 +#freeze
* ネットワークブート [#bfc56539] * ネットワークブート [#bfc56539]
-Raspberry Piでネットワークにロードするファイル(カーネルやルートファイル)を置いて,それをロードしてブートさせてみる。+ストレージをもたないコンピュータや,ストレージを何らかの理由で使いたくないなどの理由で,サーバ上に用意したOSイメージを使用して起動出来るものをネットワークブートと呼んでいる。~
-Pi,Pi2B,Pi zeroでネットワークブートさせるには,U-Bootを使う方法があります。~ +ローカルネットワークにあるサーバー上にRaspberry Piがロードするファイル(カーネルやルートファイル)を置いて,Raspberry Piがブート時にそれをロードしてRaspbianを起動させるネットワークブートができるようにしてみる。
-SDカードのFAT/FAT32パーテーションにu-boot.binを置いて,通常はkernel.imgをロード・実行する代わりにU-Bootを実行して,ネットワーク越しにカーネルやルートファイルを読み込むことで,Raspbianを起動させる。+
-普通のPXEブートでは,tftpでカーネルをロードして実行させるようにするらしいが,tftpだとロードは出来たが実行できなかったので,カーネルもルートファイルシステムもnfsでロードするようにしてみた。+Raspberry PiはOSをSDカードに書き込んで利用しているため,数ヶ月から1年程度でMicroSDカードやSDカードが寿命で使えなくなってしまう。~ 
 +この対策としてもネットワークブートは有用。~
-* U-Bootの用意 [#def4f8a2] +ネットワークブートの仕組みの一つに[[PXE(Preboot eXecution Environment)>https://ja.wikipedia.org/wiki/Preboot_Execution_Environment]]がある。これは,インテルが考えた仕組みでネットワークブートの代表的なものらしい。~
-U-Bootをデフォルトのブートローダーの代わりに使ってみます。+
-使用しているRaspbianが入ったMicroSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。~+Raspberry Piでネットワークブートするには,モデルによりいくつかの方法がある。~ 
 +- Pi,Pi2B,Pi zeroでネットワークブート~ 
 +以下のような2種類の方法があります。どちらかの方法で実現出来る。~ 
 +-- 対応したbootcode.binを使う~ 
 +SD/MicroSDカードのFAT/FAT32パーテーションのbootcode.binに,ネットワークブート(PXEブート)可能な物を使用する。~ 
 +いつからかは不明だがラズベリー財団が提供する2ndステージブートローダーであるbootcode.bin(ソースコードは公開されていない)が,ネットワーク対応になっているみたい。 
 +-- U-Bootを使用する~ 
 +SDカードのFAT/FAT32パーテーションに汎用ブートローダーのU-Bootを入れて,最終ブートステージであるLinuxカーネルを読み込む代わりに使う方法。 
 +- Pi3B,3B+でネットワークブート~ 
 +以下のような3種類の方法があります。どれかの方法でネットワークを実現出来る。~ 
 +-- GPUのfirmwareのブートローダーを使う~ 
 +Raspberry Pi3B,3B+のGPUのfirmwareに,ネットワークブートやUSBストレージからのブートが出来る機能が入っている。~ 
 +GPUのOTP-ROMの設定を書き換えることで,このfirmwareによるネットワークブート機能が使えるようになる。(もとに戻すことは不可能)~ 
 +-- 対応したbootcode.binを使う~ 
 +上記と同様。~ 
 +-- U-Bootを使用する~ 
 +上記と同様。 
 +- Pi4Bでネットワークブート~ 
 +Pi4BではブートにEEPROMのブートローダーを使用するように変更されました。~ 
 +以下のような方法があります。~ 
 +-- EEPROMでのネットワークブート~ 
 +今までのRaspberry PiのGPU firmwareでのブート機能の代わりに,新たに実装されたEEPROMのブートローダーを使用する。~ 
 +Pi4B発売直後の現時点ではネットワークブートやUSB機器からのブートには,まだ対応されていない。~ 
 +今後の更新で対応されるとのこと。 
 +-- U-Bootを使用する~ 
 +上記と同様。
-/boot/config.txtで,u-boot.binを使うように変更します。/boot/config.txtの最後の変に, +** ネットワークブートの構築 [#j4d250e5
- kernel=u-boot.bin +- [[U-Bootでネットワークブート>./U-Bootでネットワークブート]] 
-を追加する。~ +-- [[RPi用U-Bootをビルド>./U-Bootでネットワークブート/RPi用U-Bootをビルド]] 
- +- [[Raspberry Pi3でPXEネットワークブート>./Raspberry Pi3でPXEネットワークブート]]
-これでリブートすると,デフォルトだとkernel.img(Raspberry PiBの場合)をロードされる代わりにU-Bootがブートローダーとして起動するようになる。 +
- +
-** U-Bootスクリプトファイルを作成 [#h234f4f2+
-''uboot.scr''を作成する。 +
- set serverip 192.168.24.XXX                      <-- nfsサーバーのIPアドレス +
-&nbsp;set rootpath /var/exports/raspbian +
- set kernelfile /boot/kernel.img +
- set fbwidth 1824 +
- set fbheight 984 +
- +
- set autoload "no" +
- set bootfile "${rootpath}${kernelfile}" +
- set bootarg_def "dma.dmachans=0x7f35 bcm2708_fb.fbwidth=${fbwidth} \ +
- bcm2708_fb.fbheight=${fbheight} bcm2708.boardrev=0x10 smsc95xx.macaddr=${usbethaddr} \ +
- bcm2708.disk_led_gpio=47 bcm2708.disk_led_active_low=0 sdhci-bcm2708.emmc_clock_freq=250000000 \ +
- vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000" +
- set bootarg_opt "dwc_otg.lpm_enable=0 ip=dhcp console=ttyAMA0,115200 console=tty1 \ +
- kgdboc=ttyAMA0,115200 root=/dev/nfs nfsroot=${serverip}:${rootpath} \ +
- elevator=deadline rootwait" +
- set bootargs "${bootarg_def} ${bootarg_opt}" +
- +
- set net_start "usb start; dhcp" +
- set load_kernel "nfs" +
- +
- run net_start +
- run load_kernel +
- usb stop +
- bootz +
-このようにして,nfsサーバーからkernel.imgをロードするようにして,カーネルにルートファイルシステムの場所をパラメータで渡すようにする。 +
- +
-作成したboot.scrをU-Bootが認識できるファイルに変換します。~ +
-これには,mkimageコマンドを使います。U-Bootをビルドした時にこのコマンドもビルドされる。~ +
- $ sudo mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "MMC Boot" -d boot.scr boot.scr.uimg +
- +
-作成された''boot.scr.uimg''をMicroSDカードの/bootにコピーする。 +
- +
-これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するはず。 +
- +
-* nfsサーバーの設定 [#q82ea898] +
-/etc/exportsでNFSエクスポートの設定をする。~ +
-/etc/exportsファイルに追加する。~ +
- /var/exports/raspbian          *(rw,no_root_squash,no_subtree_check) +
- +
-nfsを再起動する。 +
- +
-/var/exports/raspbianには,Raspbianの/にあるファイルをすべてコピーする。(mmcblk0p1とmmcblk0p2の両方)~ +
-どうにかして,Piのmmcblk0p2を/var/exports/raspbianにコピーする。 +
- +
-** カーネルとルートファイルを用意する [#s9323785] +
-nfsを使ってサービスするカーネルとルートファイルをなんとかして用意する。 +
- +
-イメージファイルからコピーする場合は,以下のようにする。 +
- +
-現在のPiのMicroSDカードを,ディスクイメージにバックアップする。 +
- backupxxxx.img +
-これをNFSサーバにコピーする。 +
- +
-NFSのexportするディレクトリを作成する。 +
- # mkdir /var/exports/raspbian +
- +
-loopデバイスで空いているループバックデバイスを探す。 +
- # losetup -+
-&nbsp;# losetup -f +
- /dev/loop0 +
- +
-/dev/loop0が空いているのがわかる。空きが無い場合は,modprobeコマンドで増やす。 +
- # modprobe loop max_loop=32 +
- +
-/dev/loop0にイメージファイルを割り当てる。 +
- # losetup /dev/loop0 /temp/backupxxxx.img +
- +
-kpartx -aを使って,イメージファイルのパーティションを識別する。 +
- #kpartx -a /dev/loop0 +
-/dev/mapperに,loop0p1とloop0p2が出来ている。 +
- +
-/dev/loop0p2を,/mnt/raspberrypiにマウントする。 +
- # mount /dev/loop0p2 /mnt/raspberrypi +
- +
-/mnt/raspberrypiの中身をrsyncでコピーする。 +
- # rsync -xa /mnt/raspberrypi /var/exports/raspbian +
- +
-/mnt/raspberrypiをアンマウントする。 +
- # umount /mnt/raspberrypi +
- +
-次に,/dev/loop0p1を,/mnt/raspberrypiにマウントする。 +
- # mount /dev/loop0p1 /mnt/raspberrypi +
- +
-/mnt/raspberrypiの中身をrsyncでコピーする。 +
- # rsync -xa /mnt/raspberrypi /var/exports/raspbian/boot +
- +
-/mnt/raspberrypiをアンマウントする。 +
- # umount /mnt/raspberrypi +
- +
-/dev/loop0を削除する。 +
- # kpartx -d /dev/loop0 +
-&nbsp;# losetup -d /dev/loop0 +
- # losetup -a +
- +
-*** コピーしたRaspbianの中身を少し書き換える [#s1d8329f] +
-SDカードのパーテーションをマウントしているところを削除する。 +
-この設定をするため,/var/exports/raspbian/etc/fstab を編集。 +
-''/var/exports/raspbian/etc/fstab''~ +
- proc            /proc          proc    defaults          0      0 +
- #/dev/mmcblk0p1  /boot          vfat    defaults          0      2 +
- #/dev/mmcblk0p2  /              ext4    defaults,noatime  0      1 +
- /dev/nfs        /              rootfs  defaults,rw      0      0+


トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 2178, today: 1, yesterday: 1