RaspiのSDカードは512MByteのFAT領域があり、その後ろはSDカードの最後までext4のパーティションとなっています。
どのようなサイズのSDカードであっても自動的に拡張してext4を最大化し、Linuxのファイル用に最大の領域が使えるようになっています。
これはすごい仕組みなのですが、ユーザが第3のパーティションを作りたくてもできなくなってしまいます。
そこで、本記事ではRaspiのSDカードにユーザ用の第3パーティションを作る方法を説明します。
① Raspi Imagerでカードを作った後
Raspi ImagerでSDカードを作ると512MByteのbootfsと、数GByteのex4tの第2パーティションができ、その後ろは未使用領域となります。
(Raspi OSなら5GByte、Raspi OS Liteなら2.3GByte)
Linuxでは自分自身のパーティションを拡大することはできますが、縮小することはできません。別のLinuxマシンを使って縮小することになります。
Linuxが動く別のマシン・・・というのはWindowsで動くWSL2でも大丈夫です!
② WSL2でマウントして読んでみる
Raspi Imagerで作成したRaspi OSのSDカードをusbipdでアタッチしてWSL2でマウントします。
そして、WSL上のUbuntuからfdisk -lで見てみます。

512MByteのLinux領域と2.1GBのLinux領域がありました。
SDカードは32GBのものなので後ろはすべて未使用領域です。
また、全部で61896704セクタ(=31,691,112,448バイト)あるということがわかります。
次に、
sudo fdisk /dev/sde3
で、このディスクを編集します。

使ったコマンドは、
n
p
3
開始セクタ
終了セクタ
t
3
c
w
q
です。
解説すると、nは新規パーティションを作ることを意味し、pはプライマリのパーティション、3は3番目のパーティション、開始セクタは40925184としています。
次の終了セクタは何も数字を書かずENTERを押せば自動的に末尾までいきます。
それから、t 3 cは、パーティションのフラグをMS-DOSにすることを意味します。
最後にwコマンドでディスクへの変更を書き込みます。
この40925184という数字はどこから出てきたかというと、SDカードの末尾に10GByteのパーティションを作りたい場合、全パーティションが61896704セクタで、10GByteは10×1024×1024×1024÷512=20971520なので、61896704-20971520を開始セクタにすれば末尾の10GByteを取ることができます。
これでパーティションを見てみると・・

となって、2番目のパーティションの後ろに5390336~40925184セクタの広大な未使用領域があり、末尾の10GByteをFAT32で取れていることがわかります。
usbipdでdetachをしてSDカードを抜き、Raspiに挿します。
③ Raspiを起動してparted
Raspiの最初の起動時には自動的にパーティションの拡大が行われるのですが、細工をしたSDカードでは自動拡大が行われないようでした。
そこで、手動でパーティションの拡大を行います。まず、
sudo parted /dev/mmcblk0
で現状のSDカードの状態を見て、パーティションを書き換えます。
sudo parted /dev/mmcblk0
(parted) u s
(parted) p free
Number Start End Size Type File system Flags
63s 16383s 16321s Free Space
1 16384s 1064959s 1048576s primary fat32 lba
2 1064960s 5390335s 4325376s primary ext4
5390336s 40925183s 35534848s Free Space
3 40925184s 61896703s 20971520s primary lba
(parted) resizepart 2
40925183
こんな感じです。
partedでp freeとすると未使用パーティションも含めて一覧を見ることができます。
ext4の第2パーティションは1064960~5390335セクタまでで、5390336~40925183までは空いています。
なので、partedの中でresizepart 2と打って、第二パーティションの末尾を40925183に設定することでFree Spaceを詰めます。
なお、WSLのUbuntuにはデフォルトではpartedは入っていませんが、Raspiには入っています。パーティションの拡大はRaspi上でやったほうが楽です。
詰めた後はもうfreeのspaceはありません。きっちりと、fat32(537MB)→ext4(20GB)→fat32(10GB)と埋まりました。

③ Resize2fsを行う
パーティションのサイズとファイルシステムのサイズは整合が取れていなければならないそうです。
そのため、パーティションを拡大したらRaspi上で
sudo resize2fs /dev/mmcblk0p2
と打ち、ファイルシステムのサイズを現在のパーティションのサイズに合わせて拡大します。
④ mkfs.vfatでフォーマットする
第3パーティションは作ったばかりなので、mkfs.vfatを使ってフォーマットします。
sudo mkfs.vfat -F 32 /dev/mmcblk0p3
⑤ /etc/fstabに書く
/etc/fstabにmmcblk0p3のことを書いて自動的にマウントできるようにします。
/dev/mmcblk0p3 /var/storage vfat uid=1000,gid=1000,umask=000,relatime,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 0 0
ここで、uid=1000,gid=1000,umask=000が結構重要で、rootでない一般ユーザやUSBメモリとして使う場合に書き込みができるようにするにの必要です。
まとめ
RaspiのSDカードを自分でパーティションを分けて、Windowsからファイル共有できるための下地ができました。
最近のコメント