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に移すことにした。

# <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


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

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

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

$ 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



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

$ 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



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

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

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

$ 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

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

$ 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

メモ: この後でresize2fsが必要?



試しにmountしてみる。

$ 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



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

$ 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



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

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

## /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



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

$ sudo reboot
$ Connection to starfive.local closed by remote host.



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

$ 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



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

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

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

続く。

リンク

RISC-V, VisionFive-2

Posted by ず@沖縄