ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Ultra96向けのBSP&PetaLinuxで作ったrootfsへの差し替え

スポンサーリンク

前回のUltra96ネタではUltra96用のBSPとPetaLinuxを使って自前でビルドしたBOOT.BINを使ってボード上にbitファイルを読み込み、Linux側からアクセスが可能なことを確認した。

www.tech-diningyo.info

次はドライバでも、、と書いたのだが、前回は少しサボってマイクロSDはUltra96付属の物をそのまま使ったため

という状態だった。今回は新しくマイクロSDを用意したので、そこに前回ビルドしたデータ一式を展開して同様のことが出来ることを確認していこうと思う。

SDカードの準備

早速ではあるがSDカードの準備から。必要になるパーティションは以下の2つ

ブートの際の順番の関係上、boot用のパーティションがSDの先頭に来るようにしておく必要がある点は注意。

SDカードのパーティション作成

まずはパーティション作成から。とりあえずSD挿した後にdmesgとかを使って場場所を確認

$ dmesg
[ 6809.926432] sd 9:0:0:0: Attached scsi generic sg3 type 0
[ 6810.170779] sd 9:0:0:0: [sdd] 30375936 512-byte logical blocks: (15.6 GB/14.5 GiB)
[ 6810.173198] sd 9:0:0:0: [sdd] Write Protect is off
[ 6810.173203] sd 9:0:0:0: [sdd] Mode Sense: 23 00 00 00
[ 6810.175367] sd 9:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 6810.185126]  sdd:
[ 6810.190807] sd 9:0:0:0: [sdd] Attached SCSI removable disk

上記で調べたSDを指定してfdisk使ってパーティションを作成

$ sudo fdisk /dev/sdd

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (1-4, default 1): 1
First sector (2048-30375935, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-30375935, default 30375935): +1024M

Created a new partition 1 of type 'Linux' and of size 1 GiB.

コマンド (m でヘルプ): t
Selected partition 1
Partition type (type L to list all types): b
Changed type of partition 'Linux' to 'W95 FAT32'.

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (2-4, default 2): 2
First sector (2099200-30375935, default 2099200): 2099200
Last sector, +sectors or +size{K,M,G,T,P} (2099200-30375935, default 30375935): 

Created a new partition 2 of type 'Linux' and of size 13.5 GiB.

コマンド (m でヘルプ): wq

上記の'W95 FAT32'がboot用のパーティションになる。

このfdiskの書き込みが完了すると/devの下に以下の様にマイクロSDに対応したsddに数字がついたファイルが生成される。

$ ls /dev/sdd* -l
brw-rw---- 1 root disk 8, 48  1月  6 23:24 /dev/sdd
brw-rw---- 1 root disk 8, 49  1月  6 23:25 /dev/sdd1 # boot用
brw-rw---- 1 root disk 8, 50  1月  6 23:24 /dev/sdd2 # rootfs用

ファイルシステムの作成

次はファイルシステムの作成。

ファイルシステムを作成する。1番目のパーティションはvfat固定だが、2番目のrootfs用のパーティションについてはUltra96のPetaLinuxの生成物の中にはext3/ext4向けのデータが含まれているので、この辺はまあお好みで。 #他にもディレクトリ構造を保持した状態で固めたtarファイルとかもあるから何でも良い気がする。

$ sudo mkfs.vfat /dev/sdd1 -n boot
mkfs.fat 3.0.28 (2015-05-16)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows

-nオプションはボリュームの名前をつけるオプション。

こちらはmkfs.ext4を使用する。ラベルをつけるオプションが異なるので注意。

$ sudo mkfs.ext4 -L rootfs /dev/sdd2 
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 3534592 4k blocks and 884736 inodes
Filesystem UUID: e596b5af-9adb-4499-94ff-9cb87ee691a6
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done  

因みに以前にも使っていたファイルシステムが残っているのが検出された場合、以下のようなメッセージが表示される。問題なければyを入力して先に進もう。

$ sudo mkfs.ext4 -L rootfs /dev/sdd2 
mke2fs 1.42.13 (17-May-2015)
/dev/sdd2 contains a ext4 file system
    last mounted on / on Sun Jan  6 23:14:29 2019
Proceed anyway? (y,n) y

データの書き込み

SDの設定が終了したので、後は既にビルド済みのイメージをSDに展開すればそれで準備は完了となる。

ブート用パーティションへのデータのコピー

ここは前回と同様なので、先日の記事から引用。

マイクロSD認識させて"boot"というパーティションに以下の2つのファイルをコピーする

  • <自分のPetaLinuxプロジェクト>/imges/linux/BOOT.BIN
  • <自分のPetaLinuxプロジェクト>/imges/linux/image.ub

rootfsの展開

次はrootfsの展開。自分のビルドしたPetaLinuxプロジェクトのimages/linux/以下に複数のrootfsという名前が入ったファイルが生成されているはずだ。筆者の環境だと以下のような感じ。

$ ls rootfs.*
-rw-r--r-- 1 1000 1000 1141345792 12月 29 01:06 rootfs.cpio
-rw-r--r-- 1 1000 1000  357363543 12月 29 01:06 rootfs.cpio.bz2
-rw-r--r-- 1 1000 1000  404942175 12月 29 01:06 rootfs.cpio.gz
-rw-r--r-- 1 1000 1000  404942239 12月 29 01:06 rootfs.cpio.gz.u-boot
-rw-r--r-- 1 1000 1000 1630629888 12月 29 01:06 rootfs.ext3
-rw-r--r-- 1 1000 1000  359294137 12月 29 01:06 rootfs.ext3.bz2
-rw-r--r-- 1 1000 1000 1630629888 12月 29 01:06 rootfs.ext4
-rw-r--r-- 1 1000 1000  408489496 12月 29 01:07 rootfs.ext4.gz
-rw-r--r-- 1 1000 1000  536346624 12月 29 01:07 rootfs.jffs2
-rw-r--r-- 1 1000 1000      74522 12月 29 01:05 rootfs.manifest
-rw-r--r-- 1 1000 1000  357618745 12月 29 01:05 rootfs.tar.bz2
-rw-r--r-- 1 1000 1000  406125713 12月 29 01:06 rootfs.tar.gz
-rw-r--r-- 1 1000 1000     302812 12月 29 01:05 rootfs.testdata.json

この中の適当なデータをそれぞれのファイルに合った適当な方法で先ほど作ったSDのrootfsパーティションに展開すればそれでOKとなる。

"rootfs.ext4"を使った方法

ここは使う元データによって色々方法があるみたい。とりあえず筆者は"rootfs.ext4"を直接SDのパーティションに展開する方法を使った。

$ sudo sh -c "cat ./rootfs.ext4 > /dev/sdd2 

Ultra96のサイトの手順だと、以下の様にddコマンドで展開する手順となっていた。

$ sudo dd if=rootfs.ext4 of=/dev/sdd2

うん、そういやこんな方法あったね。そしてこっちのほうがいいや。要するに"rootfs.ext4"はrootfsのイメージをそのファイルシステムのままバイナリデータにしたものなので、それをパーティションの先頭からきちんと展開すれば問題ない。

書き込んだ後にsyncコマンドを発行して、きちんとデータが書かれるようにしておこう。 # きちんと手順踏んでSDを取り外せば大丈夫なはずだけど、一応。

$ sudo sync

"rootfs.tar.bz2"/"rootfs.tar.gz"を使う方法

先ほどのext4のファイルはデータを全てバイナリに変換して物になってるが、この2つのファイルはrootfsをディレクトリ構造もそのままtarで固めた様な状態になっている。

そのためこのファイルを使う場合はrootfsをマウントしておき、tarコマンド等でデータを展開すればOK。

$ sudo tar zxvf rootfs.tar.gz -C /media/rootfs/
$ sudo sync

こっちもきちんとsyncを終えてからSDを抜くか、きちんとマウントを解除してからSDを取り外すかしておこう。 # tarで展開するとコマンド終わってもきちんと書き込み終わってないことがあるので。。

上記の要領で書き込んだrootfsを入れたマイクロSDカードでLinuxが起動してログインが可能なことは確認が出来た。

PetaLinux 2018.2 xilinx-ultra96-reva-2018_2 /dev/ttyPS0

xilinx-ultra96-reva-2018_2 login: root
Password: 
Last login: Fri Dec 28 16:06:32 UTC 2018 on ttyPS0
root@xilinx-ultra96-reva-2018_2:~# 

ただ、なんかBluetooth周りでファームがダウンロード出来ないというエラーが出ている。あとGPUどうの、、てのいうのも。この辺はとりあえず今は関係ないので放置。後で付属のマイクロSDと比較して見るくらいはしてみようかな。

[   31.206431] Bluetooth: hci0: send command d
[   31.210999] Bluetooth: hci0: download firmware failed, retrying...           
[2797:2797:1228/160607:ERROR:gl_factory.cc(48)] Requested GL implementation is .
[2797:2797:1228/160607:ERROR:gpu_child_thread.cc(348)] Exiting GPU process due n
[   31.753959] Bluetooth: hci0: change remote baud rate command in firmware     
[2494:2713:1228/160610:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed t.
[2494:2713:1228/160610:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed t.
[   36.518405] Bluetooth: hci0 command 0xff05 tx timeout           
[   44.518399] Bluetooth: hci0: send command failed           
[   44.523011] Bluetooth: hci0: download firmware failed, retrying...           
[   45.210467] Bluetooth: hci0: change remote baud rate command in firmware     

これでUltra96のBSP+PetaLinux2018.2で構築したrootfsも一部問題はありそうだが、とりあえず使えそうな感じであることは確認できた。

次こそは簡単なデバイスドライバ書いてPL領域へのメモリアクセスを確認しようと思う。