|
1: 2019-06-29 (土) 07:27:42 yuji |
| + | * ネットワークブート [#bfc56539] |
| + | Raspberry Piでネットワークにロードするファイル(カーネルやルートファイル)を置いて,それをロードしてブートさせてみる。 |
| | | |
| + | Pi,Pi2B,Pi zeroでネットワークブートさせるには,U-Bootを使う方法があります。~ |
| + | SDカードのFAT/FAT32パーテーションにu-boot.binを置いて,通常はkernel.imgをロード・実行する代わりにU-Bootを実行して,ネットワーク越しにカーネルやルートファイルを読み込むことで,Raspbianを起動させる。 |
| + | |
| + | 普通のPXEブートでは,tftpでカーネルをロードして実行させるようにするらしいが,tftpだとロードは出来たが実行できなかったので,カーネルもルートファイルシステムもnfsでロードするようにしてみた。 |
| + | |
| + | * U-Bootの用意 [#def4f8a2] |
| + | U-Bootをデフォルトのブートローダーの代わりに使ってみます。 |
| + | |
| + | 使用しているRaspbianが入ったMicroSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。~ |
| + | |
| + | /boot/config.txtで,u-boot.binを使うように変更します。/boot/config.txtの最後の変に, |
| + | kernel=u-boot.bin |
| + | を追加する。~ |
| + | |
| + | これでリブートすると,デフォルトだと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 |