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アドレス | + | |
- | 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 -a | + | |
- | # 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 | + | |
- | # 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 | + |