Raspbian - 自動の領域拡張をいじる | ちゃつみん の酔ったいきおい?w

Raspbian - 自動の領域拡張をいじる

ラズパイの財団推奨OSであるRaspbianは、SDカードに書き込んで初回起動すると自動的にパーティションのサイズをカードいっぱいの領域に拡張する。
この領域拡張をいじってみたいと思う。

- ハードウェア: Raspberry Pi 4B+ (RAM:4GB)
- OS: Raspbian Buster Lite 2020-02-05

・領域拡張を無効にする
・初回起動時の領域拡張のサイズを変更する
・raspi-config の Expand Filesystem を実行したときの領域拡張のサイズを変更する

何にために必要か
この記事を読んでくださっているということは、カードいっぱいに領域拡張されると困る理由があると思う。
自分の場合、これについて調べようと思ったきっかけは、SDカードのバックアップを取っても、同じサイズのカードにリストアできない場合があるということを知ったからだ。
具体的には、16GBのSDカードでいろいろと環境を作成し「DD for Windows」などでまるごとバックアップのファイルを作成する。しかし16GBのSDカードといってもメーカーによって、もしくは同じメーカーのカードでも記録できる容量が少しずつ異なるので、リストア先のカードの容量の方が大きければ問題はないが、小さいとデータが欠損する恐れがある。カード全体のバックアップを取ったとき、末尾に未割り当ての領域があれば、リストア先のカードの容量が少なくて完全なリストアができないとしてもパーティションの欠損は免れることができる。

・領域拡張を無効にする
RaspbianのイメージをSDカードに書き込むと2つのパーティションに分かれる。1つめのパーティションはFAT32なのでWindowsでも編集可能。
SDカードのcmdline.txtをメモ帳などのエディタで開く。

console=serial0,115200 console=tty1 root=PARTUUID=56cd6262-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh

このうち、最後の init=/usr/lib/raspi-config/init_resize.sh が領域拡張のシェルスクリプトを起動する部分なので、まるっと削除することで領域拡張が行われなくなる。
また、その前の quiet も消すと起動時のログが出るようになるので人によっては安心感が得られるかも。

・初回起動時の領域拡張のサイズを変更する
前項で述べたとおり初回起動時の領域拡張は /usr/lib/raspi-config/init_resize.sh で行っている。
ただし、このファイルはSDカードの2つめのパーティションにあるので、FATではなくLinuxのパーティション(ext4)にアクセスできる環境で行う。
UbuntuなどのLinux環境や、Windowsでext4パーティションにアクセスできる環境でも良いが、ここでは既にラズパイで別のRaspbianが起動できている環境にターゲットのSDカードを接続する。
既存のRaspbianのGUIが、ターゲットのSDカードを以下のようにマウントしたとする。
SDカードの1つめのパーティション(FAT32)→ /media/pi/boot/
SDカードの2つめのパーティション(ext4)→ /media/pi/rootfs/

対象となるファイルの編集には管理者権限が必要なので、nanoエディタで以下のように開く

sudo nano /media/pi/rootfs/usr/lib/raspi-config/init_resize.sh

58行目あたり(行番号の表示は Alt+Shift+3 で切り替えができる)

 TARGET_END=$((ROOT_DEV_SIZE - 1))

でカードいっぱいのサイズを指定しているので、例えば90%のサイズを終端にする場合は

  TARGET_END=$((ROOT_DEV_SIZE * 9 / 10))

に修正する。32GBのカードに約8GBの領域を作りたい場合は

  TARGET_END=$((ROOT_DEV_SIZE * 9 / 40))

という指定もできると思う。

なお、計算ではなく直接の値を指定したい場合、ROOT_DEV_SIZE が512バイト単位のセクタ数であることに注意が必要。
例えば10GiBをパーティションの終端にしたい場合は、10*1024*1024*1024/512 = 20971520 という感じで指定する

  TARGET_END=20971520

・raspi-config の Expand Filesystem を実行したときの領域拡張のサイズを変更する

初回起動時の領域拡張を抑制し、raspi-configで領域拡張しようとすると、ここでも最大領域に拡張されてしまう。
raspi-config はシェルスクリプトなので予め修正しておいてから raspi-config の Expand Filesystem を実行する。
修正には管理者権限が必要。ターゲットとなるSDカードのパーティションが /media/pi/rootfs/ にマウントされている場合は、以下のように管理者権限でnanoエディタを起動する

sudo nano /media/pi/rootfs/usr/bin/raspi-config

ターゲットとなるSDカードで起動している場合は

sudo nano /usr/bin/raspi-config

171行目あたりで、上の行が $PART_START 、下の行が p となっている空白の行がある。
入力を省略した場合は最大サイズになるので、ここに終端となるセクタの位置を書く。例えば16GBのSDカードだと、16GiBの容量を持つことはまず無い。16GiBの90%程度の容量以上であることがほとんどだが、念の為85%を下回る切の良い数値にする。16*1024*1024*1024/512*.85=28521267 なので 28000000 を空行の値として指定する

 $PART_START
 
 p

 $PART_START
 28000000
 p