1: 2019-06-29 (土) 07:27:42 yuji ソース
Line 1: Line 1:
 +* ネットワークブート [#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


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