Starfive VisonFive2(RISC-V SBC) で遊ぶ – その4 rootをM.2 SSDにする

2023/01/09RISC-V, VisionFive-2

microSDをrootデバイスとして使うのは、耐久性に不安がある。rootをNVMe SSDに変更したい。しかし、現状ではSSD bootはできない。しかたがないので、 /boot はSDに残して、他を NVMe に移すことにした。



そもそもの発端

VisionFive2でやねうら王をコンパイルしてたら途中でずっこけた。sshが切れて、pingにも応答しない。何これ?

Timeout, server starfive.local not responding.

とりあえずUSB扇風機で冷やした後に再起動。しかし起動しない。DHCPも取りに来ないので、debianが動いていないようだ。
microSDを書き直したら何事もなかったように動いているので、ハードウェアの問題ではなさそう。 このトラブルはRaspberry Piでも経験したことがある。VisionFive2でもmicroSDになるべく書き込まないようにしないといけないようだ。

初期設定だと atime が有効になっている。この場合、ファイルアクセスのたびに書き込みが発生するので、microSDでは使うべきではない。 /tmp も頻繁に書き込みがあるので、microSD にあるのは良くない。

M.2 NVMeを挿してみた

パソコン工房の年末年始セールで、WesternDigitalのWDS500G3B0Cを安売りしていたので購入。500GBのM.2 (M Key)なSSD。M.2スロットに挿したらちゃんと見えた。

fstab に下記の設定を追加。この状態でコンパイル程度では死ななくなったが、 /home2 という名前は美しくないし、microSDを常用するのも怖い。現在microSDにある root をNVMeに移すことにした。

[code lang="shell"]
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mmcblk1p2 /boot vfat defaults 0 2
/dev/mmcblk1p3 / ext4 errors=remount-ro,noatime 0 1
/dev/nvme0n1p2 /home2 ext4 errors=remount-ro 0 3
tmpfs /var/tmp tmpfs nodev,nosuid,size=128M 0 0
/home2/swapfile none swap sw 0 0 0
[/code]

microSDカードの / をNVMeにコピーする

まず、ダウンロードした debian Image-69 の / をNVMeにコピーします。圧縮されたままではディスクとして扱えないので、作業前にgunzipで展開しておきます。

展開したmicroSDカードのイメージをloopbackデバイスに登録。

[code lang="shell"]
$ ungzip starfive-jh7110-VF2_515_v2.5.0-69.img.gz
$ sudo partx -v -a starfive-jh7110-VF2_515_v2.5.0-69.img
partition: none, disk: starfive-jh7110-VF2_515_v2.5.0-69.img, lower: 0, upper: 0
Trying to use '/dev/loop0' for the loop device
/dev/loop0: partition table type 'gpt' detected
range recount: max partno=3, lower=0, upper=0
/dev/loop0: partition #1 added
/dev/loop0: partition #2 added
/dev/loop0: partition #3 added

$ sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0
0 0 0 0 /home/shin/starfive-jh7110-VF2_515_v2.5.0-69.img
0 512
[/code]


イメージファイルがデバイスとして見えます。

[code lang="shell"]
$ sudo fdisk -lu /dev/loop0
Disk /dev/loop0: 15.63 GiB, 16777216000 bytes, 32768000 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: gpt
Disk identifier: B3E6F05B-DFC8-47B7-9C2B-F4762387709C

Device Start End Sectors Size Type
/dev/loop0p1 2048 34815 32768 16M Linux filesystem
/dev/loop0p2 34816 239615 204800 100M EFI System
/dev/loop0p3 239616 32765918 32526303 15.5G Linux filesystem
[/code]


NVMeは事前にpartedで領域の設定をして、mkfs.ext4でファイルシステムを作っておきます。

領域の大きさはどう設定するのが良いのでしょうね。わからないので、最初の方はmicroSDに合わせて、残りを / と /home 用に確保してみました。

debianの更新を考えると、 / を2つ作って新旧を切り替えるのが良いのかもしれません。後で検討します。

[code lang="shell"]
$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: WD Blue SN570 500GB
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: gpt
Disk identifier: D6A1FDEF-D692-4D71-B2C1-D44037704F85

Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 34815 32768 16M Linux filesystem
/dev/nvme0n1p2 34816 239615 204800 100M EFI System
/dev/nvme0n1p3 239616 244514815 244275200 116.5G Linux filesystem
/dev/nvme0n1p4 244514816 976773134 732258319 349.2G Linux filesystem
[/code]

その後、loopbackに登録済みのイメージの / を  NVMe にコピー。

[code lang="shell"]
$ sudo e2image -ra -p /dev/loop0p3 /dev/nvme0n1p3
e2image 1.46.5 (30-Dec-2021)
Scanning inodes…
Copied 3119747 / 3119747 blocks (100%) in 00:09:44 at 20.87 MB/s
[/code]
メモ: この後でresize2fsが必要?



試しにmountしてみる。

[code lang="shell"]
$ sudo mount /dev/nvme0n1p3 /mnt/tmp
$ ls -l /mnt/tmp
合計 84
drwxr-xr-x 2 root root 4096 12月 19 13:35 bin
drwxr-xr-x 4 root root 4096 12月 19 13:03 dev
drwxr-xr-x 97 root root 4096 12月 20 11:08 etc
drwxr-xr-x 3 root root 4096 12月 19 15:50 home
drwxr-xr-x 13 root root 4096 12月 19 13:24 lib
drwx—— 2 root root 16384 12月 19 13:39 lost+found
drwxr-xr-x 2 root root 4096 12月 19 13:03 media
drwxr-xr-x 2 root root 4096 12月 19 13:03 mnt
drwxr-xr-x 3 root root 4096 12月 20 11:07 opt
drwxr-xr-x 2 root root 4096 1月 19 2022 proc
drwx—— 3 root root 4096 12月 19 15:50 root
drwxr-xr-x 6 root root 4096 12月 19 13:12 run
drwxr-xr-x 2 root root 4096 12月 19 13:23 sbin
drwxr-xr-x 2 root root 4096 12月 19 13:03 srv
drwxr-xr-x 2 root root 4096 1月 19 2022 sys
drwxrwxrwt 3 root root 4096 12月 20 11:06 tmp
drwxr-xr-x 11 root root 4096 12月 19 13:03 usr
drwxr-xr-x 11 root root 4096 12月 19 13:03 var
[/code]


/etc/fstab を編集してNVMeを / にする。 その他、変更が必要なファイルはこのタイミングで直しておくと楽です (/etc/ssh/sshd_configなど)。

[code lang="shell"]
$ sudo vi /mnt/tmp/etc/fstab
$ cat /mnt/tmp/etc/fstab
(略)
<file system> <mount point> <type> <options> <dump> <pass>
/dev/mmcblk1p2 /boot vfat defaults 0 2
#/dev/mmcblk1p3 / ext4 errors=remount-ro,noatime 0 1
/dev/nvme0n1p3 / ext4 errors=remount-ro 0 3
tmpfs /var/tmp tmpfs nodev,nosuid,size=128M 0 0
[/code]


以下、この手順で本当に正しいのか不明。

/boot/boot/extlinux/extlinux.conf を編集。直接編集するな! (Do not edit this file manually) と書かれているけど、直接編集してしまいました。本来はどうすべきでしょうか?

[code lang="shell"]
## /boot/extlinux/extlinux.conf
##
## IMPORTANT WARNING
##
## The configuration of this file is generated automatically.
## Do not edit this file manually, use: u-boot-update

default l0
menu title U-Boot menu
prompt 0
timeout 50

label l0
menu label Debian GNU/Linux bookworm/sid 5.15.0-starfive
linux /boot/vmlinuz-5.15.0-starfive
initrd /boot/initrd.img-5.15.0-starfive
fdtdir /boot/dtbs/
append root=/dev/nvme0n1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0
# append root=/dev/mmcblk1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0

label l0r
menu label Debian GNU/Linux bookworm/sid 5.15.0-starfive (rescue target)
linux /boot/vmlinuz-5.15.0-starfive
initrd /boot/initrd.img-5.15.0-starfive
fdtdir /boot/dtbs/
append root=/dev/nvme0n1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0 single
# append root=/dev/mmcblk1p3 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0 single
[/code]


あとはrebootすれば、NVMeが / になります。このままrebootすると、初期設定のままですので rootでssh loginできません。必要なら/etc/ssh/sshd_conigをreboot前に変更しておきます。

[code lang="shell"]
$ sudo reboot
$ Connection to starfive.local closed by remote host.
[/code]


再ログインして、正しくマウントできているか確認。

[code lang="shell"]
$ ssh root@starfive.local
(略)
# df -kh
Filesystem Size Used Avail Use% Mounted on
udev 1.7G 0 1.7G 0% /dev
tmpfs 390M 3.1M 387M 1% /run
/dev/nvme0n1p3 115G 13G 102G 12% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk1p2 100M 22M 78M 23% /boot
[/code]


うまく動いているようです。この状態で問題ないか、しばらく慣らし運転してみます。しかし、debianの更新が今後も入るはずだし、どんな設定が良いのだろうか悩みますね。

TODO: emmcを試してみたい。どこで買えるかな。

追記: M.2 SSDを固定するネジは付属していないので買ってくる必要があります。

続く。

リンク

RISC-V, VisionFive-2

Posted by ず@沖縄