Petalinux等をZynq上でSDカードブートするためには、事前にSDカードのフォーマットやファイルシステムを作成しておく必要があります。
設定方法がややこしく毎回忘れるので、こちらの記事に残しておくことにします。
環境構築
SDカードのフォーマットやパーティションの作成時にext4のファイルシステムを扱う必要があるため、Windows PCのみでは作業を進めるのが難しいです。
Windowsからext4を扱うためのフリーソフトも存在するようですが、私の場合は手持ちのUSB-HDD上に「Ubuntu Live USB」を作成し、そこで起動したUbuntuからSDカードを扱うようにしました。
Ubuntu Live USBの作成方法についてはこちらのページを参考にしました。
何らかの方法でext4を扱える環境が準備できればOKです。
SDカードの設定
Linuxが起動したらPCにSDカードを差し込み、lsblkコマンド等でSDカードが認識されているかを確認します。もしSDカードがマウントされているようであれば、予め全てアンマウントしておきます。
$ sudo umount /dev/sdX1 # Xには「a」や「b」などのアルファベットが入ります
$ sudo umount /dev/sdX2
...
パーティションの作成
fdiskコマンドを使ってSDカード上にパーティションを作成していきます。
$ sudo fdisk /dev/sdX # Xには「a」や「b」などのアルファベットが入ります
- 「d」でパーティションをすべて削除
- 「p」で正しく初期化されたかディスクの状態を確認しておく
- 「n」でパーティションを作成
- 「p」で「基本パーティション」を選択
- パーティション番号を「1」に設定
- First Sectorの設定は「Enter」で既定値のまま
- Last sectorの設定は「+512M」でパーティション1を512MiBに設定
- 「n」でパーティションを作成
- 「p」で「基本パーティション」を選択
- パーティション番号を「2」に設定
- First Sectorの設定は「Enter」で既定値のまま
- Last sectorの設定は「Enter」で残りの領域すべてをパーティション2に設定
- 「t」でパーティションのタイプを変更
- 「1」でパーティション1を選択
- 「c」でパーティションタイプをW95 FAT32 (LBA)に変更
- 「a」で起動フラグを設定
- 「1」でパーティション1にブートフラグを設定
- 「p」で正しく設定できたかディスクの状態を確認
- 「w」で保存して終了
パーティション2のタイプはデフォルトで「Linux」に設定されているはずなので、特に変更の必要はありません
16GBのSDカードを設定した場合、最終的なディスクの状態は以下のようになりました。
ファイルシステムの作成
mkfsコマンドでファイルシステムを作成します。
$ sudo mkfs.vfat -n boot /dev/sdX1 # Xには「a」や「b」などのアルファベットが入ります
$ sudo mkfs.ext4 -L root /dev/sdX2
SDカードの先頭512MBをFAT32で「boot」というラベルを付けてフォーマットし、残りの全領域をext4で「root」というラベルを付けてフォーマットしました。これで、SDカードの準備としては完了です。
SDカードを使用する際には、ブート関連のバイナリやスクリプトはFAT32領域へコピーし、Linuxのルートファイルシステムはext4領域へコピーするようにします。
$ cp images/linux/BOOT.bin <path_to_fat32>
$ cp images/linux/boot.scr <path_to_fat32>
$ cp images/linux/image.ub <path_to_fat32>
$ cp images/linux/rootfs.tar.gz <path_to_ext4>