たまたまpSLCの存在を知って、そこからいろいろ情報を集めて知ったものです。
もしかしたらまた知見が必要になるかもしれないので、備忘録として置いておきます。
一度pSLC化すると、元のMLCやTLCの状態に戻すことはできません。
この記事を参考に操作を行う場合は、自己責任で進めていただければと思います。
pSLC?
pSLC(Pseudo SLC: 疑似SLC) modeは、本来はひとつのセルに複数bitのデータをprogramできるMLC NANDやTLC NANDにおいて、1bit分のみのデータをprogramするmodeを指します。つまり、本来は複数bitのデータが使用できるNANDを疑似的にSLC NANDとして使用することからpSLCと呼ばれています。
このような制御方法をおこなうと、記憶容量としては減少してしまいますが、セル内部の電荷密度及び注入頻度も減ることから、高寿命が期待できる信頼性の高い使用方法になります。
容量を犠牲に信頼性があげられるみたいです。
設定に使用した環境
- Raspberry Pi 4
- Raspberry Pi OS Lite (64bit)
- emmc (FEMDNN064G-A3A56)
-
E2M2 064G
というSteamDeckで使われているらしいストレージから取り外しています。
-
emmcの準備
SteamDeckで使用されているemmcが手に入ったので、基板から剥がして変換基板に載せました。
基板のガーバーデータはここのものを使用しています。
ラズパイをUSB経由で起動
emmcの操作をする場合ラズパイ本体のSDカードスロット経由で接続する必要があるため、OSはSDカード以外から起動する必要があります。
私はこのページを参考に設定しました。
emmcの設定変更
必要なパッケージの取得
$ sudo apt update && sudo apt install -y mmc-utils
emmcの情報の確認
$ sudo mmc extcsd read /dev/mmcblk0 | grep -A1 MAX_ENH_SIZE_MULT
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x00099a
i.e. 20135936 KiB
このemmcの場合、最大約20GB前後のサイズの領域を用意できるようです。
設定
今回は全領域をpSLCとして設定したいので、上で確認した最大容量を入力して設定をします。
ここで入力する数字を間違えるとやり直しができないみたいなので、注意してください。
(mmcコマンドを使ったパーティション設定をこの後も行う場合、-y
オプションを使うと追加設定ができなくなるようです。追加設定をする予定がある場合はmmc help
等で詳細を確認してください。)
$ sudo mmc enh_area set -y 0 20135936 /dev/mmcblk0
Enhanced User Data Area Size [ENH_SIZE_MULT]: 0x00099a
i.e. 20135936 KiB
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x00099a
i.e. 20135936 KiB
Done setting ENH_USR area on /dev/mmcblk0
setting OTP PARTITION_SETTING_COMPLETED!
Setting OTP PARTITION_SETTING_COMPLETED on /dev/mmcblk0 SUCCESS
Device power cycle needed for settings to take effect.
Confirm that PARTITION_SETTING_COMPLETED bit is set using 'extcsd read' after power cycle
$ sudo mmc extcsd read /dev/mmcblk0 | grep PARTITION_SETTING_COMPLETED
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x01
設定の確認
データが入ったまま設定変更しても、パーティション等の情報はそのままみたいですね。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 14.8G 0 disk
|-sda1 8:1 1 256M 0 part /boot
`-sda2 8:2 1 14.6G 0 part /
mmcblk0 179:0 0 19.2G 0 disk
|-mmcblk0p1 179:1 0 256M 0 part
`-mmcblk0p2 179:2 0 18.9G 0 part
mmcblk0boot0 179:32 0 4M 1 disk
mmcblk0boot1 179:64 0 4M 1 disk
パーティションを雑に弄ってfdiskを叩いて情報表示するとこうなりました。
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 19.2 GiB, 20619198464 bytes, 40271872 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: 0x64561452
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 2048 40271871 40269824 19.2G 83 Linux
速度比較
ここを参考にベンチマークをしてみました。
設定前
Seq-Read 41.916
Seq-Write 40.236
Rand-Read-512K 40.459
Rand-Write-512K 37.611
Rand-Read-4K 15.575
Rand-Write-4K 12.635
Rand-Read-4K-QD32 22.944
Rand-Write-4K-QD32 25.661
設定後
Seq-Read 42.564
Seq-Write 41.253
Rand-Read-512K 41.514
Rand-Write-512K 39.643
Rand-Read-4K 15.548
Rand-Write-4K 13.34
Rand-Read-4K-QD32 23.003
Rand-Write-4K-QD32 25.481
気持ち書き込み速度が増えています。
さいごに
今回はmicroSD化したemmcをラズパイに繋いで設定を調整しました。
実際の耐久性は正直分からないですが、今回準備したemmcにはとりあえず家のhomebridgeサーバの一部として働いてもらいます。
参考にしたページ
EnhancedAreaSizeの設定はここを参考にしました。
https://www.embeddedartists.com/wp-content/uploads/2020/04/Working_with_eMMC.pdf