上野家のホームページ
ナーマル,マリン,ココ
[
新規
|
一覧
|
検索
|
最新
|
ヘルプ
]
PC/RaspberryPi/ネットワークブート/U-Bootでネットワークブート
をテンプレートにして作成
資料室
PC/RaspberryPi/ネットワークブート/U-Bootでネットワークブート をテンプレートにして作成
[
差分
|
バックアップ
|
リロード
]
[ ]
開始行:
* U-Bootでネットワークブート
Raspberry Piでネットワークブートする場合に全モデルで共通...
実際にRaspberry Piで利用できるRaspbian以外のいくつかのOS...
ネットワークブートする方法としては,通常の[[ブートシーケ...
Raspberry PiにはRAMがあまり実装されていないので,直接ネッ...
ローカルネットワークのサーバーにRaspberry Piがロードする...
* U-Bootの用意
ブート時に本来最後にKernelをロードする代わりにU-Bootをロ...
SD/MicroSDカードの''/boot/config.txt''を編集して,u-boot....
これには,/boot/config.txtの最後のあたりに,
kernel=u-boot.bin
と追加する。~
これでRaspberry Piをブートすると,start.elfによるkernel.i...
この時のブートシーケンスは以下のようになると思われる。~
- ROMブートローダが起動し,L2 Cacheに2番目のブートローダ...
- 2番目のブートローダbootcode.binが起動し,SDRAMを有効に...
- start.elfが起動し,SD/MicroSDカードにあるDevice Tree xx...
-- Displayに虹色画面(テスト画像)を表示する。~
-- config.txtを読み込んでoverlay情報をFDTに適用する。~
-- FDT情報をパラメータとしてu-bootをロードする。~
cmdline.txtもKernelパラメータとして渡されると思う。しかし...
- start.elfがkernel.imgの代わりにu-boot.binをロードする。~
- u-bootを起動し,ネットワーク上のKernelをRAMにロードする...
boot.scr.uimgに記載されている処理を行っていく。~
-- Ethernetの初期化を行う。~
-- DHCPを使ってネットワークの初期化を行う。~
-- Kernelをロードする。~
-- FDTをロードする。~
ロードしたDevice Tree xxxxx.dtbとstart.elfでロードされたc...
つまりSD/MicroSDカードのconfig.txtで設定を行っておく必要...
//start.elfによってSD/MicroSDカードからロードし作成したFD...
//本来,u-bootはxxxxx.dtbとoverlay情報をダウンロードしてF...
//このためstart.elfがロード・作成したFDTをダウンロードし...
//つまりSD/MicroSDカードのxxxxx.dtbとoverlay情報が使われ...
-- Kernelパラメータを用意する。~
- u-bootがKernelを起動する。~
FDT情報とKernelパラメータを指定してKernelを起動する。~
- Kernelがルートファイルシステムをマウントする。~
initramfs等を使用せずnfsを使用して直接ルートファイルシス...
- /sbin/initを起動する。~
** U-Bootスクリプトファイルを作成
U-Bootの処理を自動化するために,''boot.txt''を作成する。~
#code(bash,,nonumber){{
setenv serverip 192.168.XXX.xxx
setenv rootpath /var/exports/raspbian
setenv kernelfile kernel.img
setenv fdtfile bcm2708-rpi-b.dtb
setenv fbwidth 1824
setenv fbheight 984
setenv bootarg_def "dma.dmachans=0x7f35 bcm2708_fb.fbwidt...
setenv bootarg_opt "dwc_otg.lpm_enable=0 console=ttyAMA0,...
setenv bootargs "${bootarg_def} ${bootarg_opt}"
usb start
dhcp ${kernel_addr_r} ${kernelfile}
tftp ${fdt_addr_r} ${fdtfile}
bootz ${kernel_addr_r} - ${fdt_addr_r}
}}
usb startはEthernetの初期化を行う。Raspberry PiのEthernet...
dhcpコマンドで,ネットワークの設定を行いkernel.img(Kerne...
tftpコマンドで,tftpサーバーからdevice treeファイルをRAM...
Kernelに渡すoptionで,ルートファイルシステムの場所とnfsを...
kernel.imgとdevice treeもnfsを使ってロードすることも出来...
serverip(tftpサーバーのIP Address)やrootpath(ルートフ...
最後にbootzコマンドでKernelを起動している。~
作成した''boot.txt''を&ref(mkimage.zip,mkimageコマンド);...
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n...
作成された''boot.scr.uimg''をSD/MicroSDカードの第1パーテ...
これで,Raspberry Pi側の設定は完了。~
* サーバー側の設定
tftpを使ってブートファイルをダウンロード出来るようにして...
Raspbianのブートファイルやルートファイルシステムを用意す...
またサーバーマシンには,このWEBサービスも行っているCentOS...
** dhcpdの設定
ローカルネットワークでのDHCPサーバーを使って,ネットワー...
''/etc/dhcp/dhcpd.conf''ファイルの編集。
#code(bash,,nonumber){{
:
host rpi {
hardware ethernet B8:27:EB:XX:XX:XX; # RPi...
fixed-address 192.168.xx.yyy; # RPi...
next-server 192.168.xx.xxx # tft...
option root-path "/var/exports/raspbian"; # nfs...
}
:
}}
このように編集した。~
DHCPサーバーを再起動する。~
# systemctl restart dhcpd
** tftpサーバーの用意
[[tftp>https://ja.wikipedia.org/wiki/Trivial_File_Transfe...
# yum install tftp-server
/etc/xinetd.d/tftpを編集する。~
server_args = -s /var/exports/raspbian/boot
disable no
tftpサーバーはxinet経由でサービスされる。~
server_argsでtftpサーバーのファイル場所のルートを設定して...
これは,nfsでマウントするルートファイルシステムの/bootと...
xinetdを再起動しtftpサーバを起動する。~
# systemctl restart xinetd
# systemctl enable xinetd
** tftpサーバーにファイルを用意する
/var/exports/raspbian/bootに,Raspbianのkernelファイル(...
*** ブートファイル類
上記で設定した''/var/exports/raspbian/boot''に,ブートフ...
とりあえず以下のようにした。~
# mkdir -p /var/exports/raspbian/boot
公式のraspbianのimgファイルをmountしてコピーしてみた。~
まずraspbianのimgファイルを確認する。~
# fdisk -l -u 2020-02-13-raspbian-buster-lite.img
Disk 2020-02-13-raspbian-buster-lite.img: 1849 MB, 18496...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x738a4d67
デバイス ブート 始点 ...
2020-02-13-raspbian-buster-lite.img1 8192 ...
2020-02-13-raspbian-buster-lite.img2 532480 ...
2つのパーテーションがあり,始点がオフセットになっている。...
なので,そのオフセット分を追加すれば,mountコマンドでマウ...
# mount -t vfat -o loop,offset=4194304 2020-02-13-raspbi...
# cp -rp /mnt/rpi/* /var/exports/raspbian/boot
# umount /mnt/rpi
// # scp -r yuji@192.168.24.xxx0:/boot/* /var/lib/tftpboot/
このようにファイルを用意した
// /var/lib/tftpboot
// /start.elf
// :
// /bootcode.bin
** nfsサーバーの用意
[[nfs>https://ja.wikipedia.org/wiki/Network_File_System]]...
インストールされていなければ,
yum install nfs-utils
として,パッケージ管理ツールでインストールできる。
nfsの共有ディレクトリを作成する。
# chown -R nfsnobody:nfsnobody /var/exports
nfs設定ファイル''/etc/exports''を編集する。~
/var/exports/raspbian 192.168.XXX.0/255.255.255.0(rw,no_...
ローカルネットワークに限定している。~
nfsを再起動する。
# systemctl restart nfs
# systemctl enable nfs
*** ルートファイルシステムをnfsでexportする場所に用意する
上記で設定した/var/exports/raspbianに,ルートファイルシス...
今回はブートファイルと同様に,公式のraspbianのimgファイル...
オフセット値は,532480 * 512 = 272629760。~
# mount -t ext4 -o loop,offset=272629760 2020-02-13-rasp...
# cp -rp /mnt/rpi/* /var/exports/raspbian
# umount /mnt/rpi
//イメージファイルからコピーする場合は,以下のようにする。~
//現在のRPiのSDカードを,ディスクイメージにバックアップす...
// backupxxxx.img
//これをNFSサーバにコピーする。
//
//NFSのexportするディレクトリを作成する。
// # mkdir /var/exports/raspbian
//
//loopデバイスで空いているループバックデバイスを探す。
// # losetup -a
// # losetup -f
// /dev/loop0
//
///dev/loop0が空いているのがわかる。空きが無い場合は,mod...
// # 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の中身を少し書き換える
Kernelが起動時にブートとルートファイルシステムを直接nfsマ...
''/var/exports/raspbian/etc/fstab''ファイルを編集する。~
proc /proc proc defaults ...
#/dev/mmcblk0p1 /boot vfat defaults ...
#/dev/mmcblk0p2 / ext4 defaults,noatim...
//192.168.xxx.xxx:/var/exports/raspbian/boot /boot nfs de...
///dev/nfs / nfs defaults,vers=4...
* Raspbianを起動
Raspberry Piを電源ONすると,U-Bootが起動してkernelがロー...
終了行:
* U-Bootでネットワークブート
Raspberry Piでネットワークブートする場合に全モデルで共通...
実際にRaspberry Piで利用できるRaspbian以外のいくつかのOS...
ネットワークブートする方法としては,通常の[[ブートシーケ...
Raspberry PiにはRAMがあまり実装されていないので,直接ネッ...
ローカルネットワークのサーバーにRaspberry Piがロードする...
* U-Bootの用意
ブート時に本来最後にKernelをロードする代わりにU-Bootをロ...
SD/MicroSDカードの''/boot/config.txt''を編集して,u-boot....
これには,/boot/config.txtの最後のあたりに,
kernel=u-boot.bin
と追加する。~
これでRaspberry Piをブートすると,start.elfによるkernel.i...
この時のブートシーケンスは以下のようになると思われる。~
- ROMブートローダが起動し,L2 Cacheに2番目のブートローダ...
- 2番目のブートローダbootcode.binが起動し,SDRAMを有効に...
- start.elfが起動し,SD/MicroSDカードにあるDevice Tree xx...
-- Displayに虹色画面(テスト画像)を表示する。~
-- config.txtを読み込んでoverlay情報をFDTに適用する。~
-- FDT情報をパラメータとしてu-bootをロードする。~
cmdline.txtもKernelパラメータとして渡されると思う。しかし...
- start.elfがkernel.imgの代わりにu-boot.binをロードする。~
- u-bootを起動し,ネットワーク上のKernelをRAMにロードする...
boot.scr.uimgに記載されている処理を行っていく。~
-- Ethernetの初期化を行う。~
-- DHCPを使ってネットワークの初期化を行う。~
-- Kernelをロードする。~
-- FDTをロードする。~
ロードしたDevice Tree xxxxx.dtbとstart.elfでロードされたc...
つまりSD/MicroSDカードのconfig.txtで設定を行っておく必要...
//start.elfによってSD/MicroSDカードからロードし作成したFD...
//本来,u-bootはxxxxx.dtbとoverlay情報をダウンロードしてF...
//このためstart.elfがロード・作成したFDTをダウンロードし...
//つまりSD/MicroSDカードのxxxxx.dtbとoverlay情報が使われ...
-- Kernelパラメータを用意する。~
- u-bootがKernelを起動する。~
FDT情報とKernelパラメータを指定してKernelを起動する。~
- Kernelがルートファイルシステムをマウントする。~
initramfs等を使用せずnfsを使用して直接ルートファイルシス...
- /sbin/initを起動する。~
** U-Bootスクリプトファイルを作成
U-Bootの処理を自動化するために,''boot.txt''を作成する。~
#code(bash,,nonumber){{
setenv serverip 192.168.XXX.xxx
setenv rootpath /var/exports/raspbian
setenv kernelfile kernel.img
setenv fdtfile bcm2708-rpi-b.dtb
setenv fbwidth 1824
setenv fbheight 984
setenv bootarg_def "dma.dmachans=0x7f35 bcm2708_fb.fbwidt...
setenv bootarg_opt "dwc_otg.lpm_enable=0 console=ttyAMA0,...
setenv bootargs "${bootarg_def} ${bootarg_opt}"
usb start
dhcp ${kernel_addr_r} ${kernelfile}
tftp ${fdt_addr_r} ${fdtfile}
bootz ${kernel_addr_r} - ${fdt_addr_r}
}}
usb startはEthernetの初期化を行う。Raspberry PiのEthernet...
dhcpコマンドで,ネットワークの設定を行いkernel.img(Kerne...
tftpコマンドで,tftpサーバーからdevice treeファイルをRAM...
Kernelに渡すoptionで,ルートファイルシステムの場所とnfsを...
kernel.imgとdevice treeもnfsを使ってロードすることも出来...
serverip(tftpサーバーのIP Address)やrootpath(ルートフ...
最後にbootzコマンドでKernelを起動している。~
作成した''boot.txt''を&ref(mkimage.zip,mkimageコマンド);...
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n...
作成された''boot.scr.uimg''をSD/MicroSDカードの第1パーテ...
これで,Raspberry Pi側の設定は完了。~
* サーバー側の設定
tftpを使ってブートファイルをダウンロード出来るようにして...
Raspbianのブートファイルやルートファイルシステムを用意す...
またサーバーマシンには,このWEBサービスも行っているCentOS...
** dhcpdの設定
ローカルネットワークでのDHCPサーバーを使って,ネットワー...
''/etc/dhcp/dhcpd.conf''ファイルの編集。
#code(bash,,nonumber){{
:
host rpi {
hardware ethernet B8:27:EB:XX:XX:XX; # RPi...
fixed-address 192.168.xx.yyy; # RPi...
next-server 192.168.xx.xxx # tft...
option root-path "/var/exports/raspbian"; # nfs...
}
:
}}
このように編集した。~
DHCPサーバーを再起動する。~
# systemctl restart dhcpd
** tftpサーバーの用意
[[tftp>https://ja.wikipedia.org/wiki/Trivial_File_Transfe...
# yum install tftp-server
/etc/xinetd.d/tftpを編集する。~
server_args = -s /var/exports/raspbian/boot
disable no
tftpサーバーはxinet経由でサービスされる。~
server_argsでtftpサーバーのファイル場所のルートを設定して...
これは,nfsでマウントするルートファイルシステムの/bootと...
xinetdを再起動しtftpサーバを起動する。~
# systemctl restart xinetd
# systemctl enable xinetd
** tftpサーバーにファイルを用意する
/var/exports/raspbian/bootに,Raspbianのkernelファイル(...
*** ブートファイル類
上記で設定した''/var/exports/raspbian/boot''に,ブートフ...
とりあえず以下のようにした。~
# mkdir -p /var/exports/raspbian/boot
公式のraspbianのimgファイルをmountしてコピーしてみた。~
まずraspbianのimgファイルを確認する。~
# fdisk -l -u 2020-02-13-raspbian-buster-lite.img
Disk 2020-02-13-raspbian-buster-lite.img: 1849 MB, 18496...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x738a4d67
デバイス ブート 始点 ...
2020-02-13-raspbian-buster-lite.img1 8192 ...
2020-02-13-raspbian-buster-lite.img2 532480 ...
2つのパーテーションがあり,始点がオフセットになっている。...
なので,そのオフセット分を追加すれば,mountコマンドでマウ...
# mount -t vfat -o loop,offset=4194304 2020-02-13-raspbi...
# cp -rp /mnt/rpi/* /var/exports/raspbian/boot
# umount /mnt/rpi
// # scp -r yuji@192.168.24.xxx0:/boot/* /var/lib/tftpboot/
このようにファイルを用意した
// /var/lib/tftpboot
// /start.elf
// :
// /bootcode.bin
** nfsサーバーの用意
[[nfs>https://ja.wikipedia.org/wiki/Network_File_System]]...
インストールされていなければ,
yum install nfs-utils
として,パッケージ管理ツールでインストールできる。
nfsの共有ディレクトリを作成する。
# chown -R nfsnobody:nfsnobody /var/exports
nfs設定ファイル''/etc/exports''を編集する。~
/var/exports/raspbian 192.168.XXX.0/255.255.255.0(rw,no_...
ローカルネットワークに限定している。~
nfsを再起動する。
# systemctl restart nfs
# systemctl enable nfs
*** ルートファイルシステムをnfsでexportする場所に用意する
上記で設定した/var/exports/raspbianに,ルートファイルシス...
今回はブートファイルと同様に,公式のraspbianのimgファイル...
オフセット値は,532480 * 512 = 272629760。~
# mount -t ext4 -o loop,offset=272629760 2020-02-13-rasp...
# cp -rp /mnt/rpi/* /var/exports/raspbian
# umount /mnt/rpi
//イメージファイルからコピーする場合は,以下のようにする。~
//現在のRPiのSDカードを,ディスクイメージにバックアップす...
// backupxxxx.img
//これをNFSサーバにコピーする。
//
//NFSのexportするディレクトリを作成する。
// # mkdir /var/exports/raspbian
//
//loopデバイスで空いているループバックデバイスを探す。
// # losetup -a
// # losetup -f
// /dev/loop0
//
///dev/loop0が空いているのがわかる。空きが無い場合は,mod...
// # 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の中身を少し書き換える
Kernelが起動時にブートとルートファイルシステムを直接nfsマ...
''/var/exports/raspbian/etc/fstab''ファイルを編集する。~
proc /proc proc defaults ...
#/dev/mmcblk0p1 /boot vfat defaults ...
#/dev/mmcblk0p2 / ext4 defaults,noatim...
//192.168.xxx.xxx:/var/exports/raspbian/boot /boot nfs de...
///dev/nfs / nfs defaults,vers=4...
* Raspbianを起動
Raspberry Piを電源ONすると,U-Bootが起動してkernelがロー...
ページ名:
Counter: 0, today: 0, yesterday: 0
Copyright©2008 Yuji Ueno All Rights Reserved.
ログイン
ユーザ名:
パスワード:
IDとパスワードを記憶
パスワード紛失
メインメニュー
ホーム
でぶlog
資料室
最新ページ一覧
全ページ一覧
ヘルプ
フォーラム
お問い合わせ