U-Boot (aarch64) on Qemu を動作させたい (10)
ほそぼそと開発を続けていたのですが、ようやく eMMC (実態は SDHC デバイス) の実装がある程度まともに動作するようになり、 U-Boot から ext2 パーティションをマウントできるようになりました。
仕事で使用しているカスタムボードは eMMC から kernel をブートするので、 PCIe よりも優先して対応していました。
コード対応はコミットを見ればわかるけど、 qemu の起動引数での emmc ファイルイメージの指定方法や、そもそも emmc イメージファイルにパーティション+ファイルシステムを作成する手順をまとめておく。
emmc ファイルイメージファイルを作成する
### truncate コマンドを使用する場合 $ truncate -s 4GiB emmc.img
サイズは適当に。
イメージファイルにパーティション+ファイルシステムを作成する
### 開いているループバックデバイスを調べてファイルを割り当てる $ sudo losetup -f /dev/loop0 $ sudo losetup /dev/loop0 emmc.img ### パーティションを作成する $ sudo parted /dev/loop0 GNU Parted 2.3 /dev/loop0 を使用 GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。 (parted) mkpart primary ext2 1024KiB 100% (parted) print モデル: Loopback device (loop) ディスク /dev/loop0: 4295MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 1049kB 4295MB 4294MB primary (parted) q ### ext1 パーティションを作成 $ sudo mkfs.ext2 /dev/loop0p1 ### ループバックデバイスの割り当てを解除 $ sudo losetup -d /dev/loop0
なんか、パーティションの開始セクタは開けておかないと 警告: 操作の結果できるパーティションはアライメントが正しくないためにパフォーマンスがでません。
という警告が出たので、 fdisk
で初期化した時に作成される隙間と同じサイズを開けている。
一応、 parted コマンドでもファイルシステムを作れるけど、 mkfs
サブコマンドを実行すると
警告: ファイルシステムに対して parted による操作(mkfs)を行おうとしています。 parted のファイルシステム操作コードは、e2fsprogs のようなファイルシステム専 用のものほど堅固に作られていません。可能なかぎり parted をパーティションテー ブルの操作だけに用いることをお勧めします。ほとんどのファイルシステムに 対するほとんどの操作は今後のリリースで削除される予定です。
ってでるので、あとから mkfs コマンドを実行している。
fdisk
を使わずに parted
コマンドでパーティションを作成しているのは、 parted
はパーティション作成後に自動で /dev/loop0p1 デバイスファイルを作成してくれるから。 (fdisk
使っても手動でデバイスファイルは作れるんだろうけど、未調査)
仮想マシンにイメージファイルをマウントする
### drive オプション (種別は SD) でファイルをマウントする $ qemu-system-aarch64 \ -machine ls1046ardb \ -smp 4 \ -m 2046M \ -kernel u-boot.elf \ -drive if=sd,cache=unsafe,format=raw,file=emmc.img \ -nographic \
仮想マシン上から読み込む
### ファイルの確認と、内容の確認 => mmc dev 0 switch to partitions #0, OK mmc0 is current device => mmc part Partition Map for MMC device 0 -- Partition Type: DOS Part Start Sector Num Sectors UUID Type 1 2048 8386560 3bc514ae-01 83 => ext2ls mmc 0:1 / <DIR> 4096 . <DIR> 4096 .. <DIR> 16384 lost+found 5 test.txt => ext2load mmc 0:1 80000000 /test.txt 5 bytes read in 26 ms (0 Bytes/s) => md.b 80000000 8 80000000: 74 65 73 74 0a 00 00 00 test....
ホスト PC 上でイメージにファイルを追加する
開発は docker 上で行っているが、 docker コンテナで parted の自動デバイス割り当てが動作しなかった (udevadm が動作しない) ので、こちらの手順は fdisk で行っている。
### パーティションの位置を確認する $ fdisk -l ../../emmc.img Disk ../../emmc.img: 4 GiB, 4294967296 bytes, 8388608 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x3bc514ae Device Boot Start End Sectors Size Id Type ../../emmc.img1 2048 8388607 8386560 4G 83 Linux ### パーティションの先頭をオフセットにしてマウントする $ sudo mount -o loop,offset=$((2048*512)) emmc.img /mnt
ということで、無事に emmc イメージファイル上のファイルを仮想マシン上で読み込むことができた。
次は kernel ブートを試してみる。