1: 2019-06-29 (Sat) 07:27:42 yuji source Cur: 2020-12-26 (Sat) 15:08:05 yuji source
Attached file: u-boot.bin, Deleted an attach file: u-boot.bin at 2019-06-30 (日) 22:01:44
Line 1: Line 1:
* ネットワークブート [#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+


Front page   Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 1955, today: 1, yesterday: 0