TinkerBoardのイメージバックアップを小さくできました
先日、microSDのセクタ数はバラバラで型名など揃えても無駄だということが分かりました。
ということは、イメージバックアップをせっかく取ってあっても、買ってきたmicroSDに書き込めないという事態が(私のように何種類も持っていなければ)生じがちだということです。これは困ります。
それで、TinkerBoardのバックアップイメージそのものを縮小する方法を探してみたところ、ありがたいことに、次のところに主要なポイントが書かれていきました:
ddで作ったイメージのサイズを概ね実容量まで小さくする方法 · GitHub
また、こちらに書かれている内容も参考にさせて頂きました(これらはmicroSDに書き込んでから縮小しておられます):
Raspberry Piで最小サイズのバックアップを作成する | Developers.IO
時羽金也の技術帳: resize2fs と fdisk で ext4 のパーティションを縮小する
それでは、自分のやった手順を残しておくことにします。2台目のTinkerBoard(tb02, Debian 9.12)を使って1台目のバックアップを加工しました。 手打ちした部分を太字にしておきます。
buffaloのNASに置いてある"/mnt/common/work/tb01-32GB.img"を加工していきます。
ファイルのあるフォルダへ移動
cd /mnt/common/work
サイズの確認、ディスク上では30GBでした
ls -l tb01-32GB.img
-rwxr-xr-x 1 root root 31624003584 4月 9 08:47 tb01-32GB.img
ls -hl tb01-32GB.img
-rwxr-xr-x 1 root root 30G 4月 9 08:47 tb01-32GB.img
利用可能な最初のループバックデバイスを見つける
sudo losetup -f
/dev/loop0
ここにループデバイスを作成する
sudo losetup --partscan /dev/loop0 ./tb01-32GB.img
できたか確認、OKです
sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
/dev/loop0 0 0 0 0 /mnt/common/work/tb01-32GB.img 0
縮小したいところはloop0p2の29.4GBです
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
├─loop0p1 259:0 0 64M 0 loop
└─loop0p2 259:1 0 29.4G 0 loop
mmcblk0 179:0 0 29.5G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 29.4G 0 part /
一度マウントして、未使用ブロックを解放しようとして、エラーが出てしまいました。ここはパスします
sudo mount /dev/loop0p2 /mnt
sudo fstrim -v /mnt
fstrim: /mnt: FITRIM ioctl failed: 入力/出力エラーです
sudo umount /mnt
ファイルシステムを確認しておきます。問題なし。使用ブロック数は1035864
sudo e2fsck -f -y -v -C 0 /dev/loop0p2
e2fsck 1.43.4 (31-Jan-2017)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
88812 inodes used (4.70%, out of 1888000)
132 non-contiguous files (0.1%)
79 non-contiguous directories (0.1%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 74857/49
1035864 blocks used (13.45%, out of 7703296)
0 bad blocks
1 large file
68601 regular files
6163 directories
54 character device files
25 block device files
0 fifos
5 links
13926 symbolic links (13785 fast symbolic links)
34 sockets
------------
88808 files
tune2fsでブロックサイズと使用ブロック数を確認します。が、結果として使いません(汗
sudo tune2fs -l /dev/loop0p2 |grep 'Block count'
Block count: 7703296
sudo tune2fs -l /dev/loop0p2 |grep 'Free block'
Free blocks: 6667432
sudo tune2fs -l /dev/loop0p2 |grep 'Block size'
Block size: 4096
(Block count) - (Free blocks) = 1035864, e2fsckの結果と一致
使用済みサイズ 4096 * 1035864 = 4242899 byte ~ 3.95 GB
これをメモしつつ、resize2fsで必要サイズを見積もります
sudo resize2fs -P /dev/loop0p2
resize2fs 1.43.4 (31-Jan-2017)
Estimated minimum size of the filesystem: 1075235
上記の使用済みサイズよりも数%多く、4.1GBは必要のようです。実際、次のコマンドで4Gを指定すると蹴られました。
キリの良いところで(相当余裕を見て)5GBにしておきます。
sudo resize2fs -p /dev/loop0p2 5G
resize2fs 1.43.4 (31-Jan-2017)
Resizing the filesystem on /dev/loop0p2 to 1310720 (4k) blocks.
Begin pass 2 (max = 431067)
Relocating blocks XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 236)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 6781)
Updating inode references XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0p2 is now 1310720 (4k) blocks long.
1310720 * 4096 / 1024^3 = 5.0 GBになりました。
正直、この発想がありませんでした。中身は消さずにメタ情報だけ書き換えるわけですね。その中身は、先にresize2fsで5GB以内に入っているはずです。
パーティションサイズは更に余裕を見て6GBにしておきます。
sudo fdisk /dev/loop0
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 61765631 61626368 29.4G 83 Linux
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-61765631, default 2048): 139264
Last sector, +sectors or +size{K,M,G,T,P} (139264-61765631, default 61765631): +6G
Created a new partition 2 of type 'Linux' and of size 6 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N ← ここが肝心
Command (m for help): p
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 12722175 12582912 6G 83 Linux
Command (m for help): w ← よく確認してから
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
sudo resize2fs /dev/loop0p2
resize2fs 1.43.4 (31-Jan-2017)
Resizing the filesystem on /dev/loop0p2 to 1572864 (4k) blocks.
The filesystem on /dev/loop0p2 is now 1572864 (4k) blocks long.
1572864 * 4096 / 1024^3 = 6.0 GBちょうどです
びくびくしながら作業してきたので、壊していないか確認します
lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
mmcblk0 179:0 0 29.5G 0 disk
mmcblk0p1 179:1 0 64M 0 part /boot
mmcblk0p2 179:2 0 29.4G 0 part /
loop0p1 259:4 0 64M 0 loop
loop0p2 259:5 0 6G 0 loop
おぉ、6Gだ
sudo e2fsck -f -y -v -C 0 /dev/loop0p2
e2fsck 1.43.4 (31-Jan-2017)
Pass 1: Checking inodes, blocks, and sizes
Inode 26 extent tree (at level 1) could be narrower. Fix? yes
Inode 1783 extent tree (at level 2) could be narrower. Fix? yes
Pass 1E: Optimizing extent trees
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0p2: ***** FILE SYSTEM WAS MODIFIED *****
88812 inodes used (23.13%, out of 384000)
342 non-contiguous files (0.4%)
79 non-contiguous directories (0.1%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 74725/180/1
941059 blocks used (59.83%, out of 1572864)
0 bad blocks
1 large file
68601 regular files
6163 directories
54 character device files
25 block device files
0 fifos
5 links
13926 symbolic links (13785 fast symbolic links)
34 sockets
------------
88808 files
2カ所の修正が入ったためだと思いますが、使用ブロック数がいつの間にか1035864から941059に減りました。
ただ、e2fsckの前は確認していませんので、本当にここかどうかはよく分かりません(汗
最終セクタを確認して、それ+αまでddでファイルに出力します
sudo fdisk -l /dev/loop0
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 sectors
Units: sectors of 1 * 512 = 512 bytes
(略)
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 12722175 12582912 6G 83 Linux
最終セクタは12,722,175 すなわち 6,513,753,600 byte, 6,361,088 kbyte, 6212 Mbyte でした。
microSDのセクタ512byteに合わせたブロックサイズで出力すれば計算は簡単ですが、おそらく時間がかかるので、ここではブロックサイズ16Mで少し余裕を持たせて書き込みます。6212 / 16 = 388.25 より、390 ブロックで 6240 Mbyteにします。
ここで、同一デバイス上(NAS上)に出力したところ最初から非常に遅く、じきに"IOエラー"が出てハングアップしてしまいました(残っていたファイルは62MBで、loop0p1終盤の加工していない部分で固まっていました)。
そのため、まずは別デバイス(というか作りたいmicroSD)に出します。
microSDを挿したUSBカードリーダーをTinkerBoardへ挿してから、lsblkで処理するmicroSDが/dev/sdaだと確認します
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
├─loop0p1 259:0 0 64M 0 loop
└─loop0p2 259:1 0 6G 0 loop
sda 8:0 1 28.9G 0 disk ← 先日の確認で最も小さかったmicroSD
└─sda1 8:1 1 28.9G 0 part /media/linaro/ADATA1807
mmcblk0 179:0 0 29.5G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 29.4G 0 part /
書き込みます。先ほど計算した通りファイルはブロックサイズ16Mで390ブロックにする予定なので、
microSDへは512byteセクタをブロックとして390 * 16 * 1024^2 / 512 = 12779520カウントにしました。
sudo dd if=/dev/loop0 of=/dev/sda bs=512 count=12779520 status=progress
今度はすんなり書けました。
NASにも保存しておきたいので、続いてmicroSDからNASへ書き出します
sudo dd if=/dev/sda of=/mnt/common/work/tb01-7G.img bs=16M count=390 status=progress
出力フォルダを確認してみます
ls -l tb01*
-rwxr-xr-x 1 root root 31624003584 4月 9 11:57 tb01-32GB.img
-rwxr-xr-x 1 root root 6543114240 4月 9 13:24 tb01-7G.img
ls -hl tb01*
-rwxr-xr-x 1 root root 30G 4月 9 11:57 tb01-32GB.img
-rwxr-xr-x 1 root root 6.1G 4月 9 13:24 tb01-7G.img
ちゃんとできているようです。
ループデバイスを外し、無くなっていることを確認し、シャットダウン
sudo losetup -d /dev/loop0
sudo losetup -l
sudo shutdown -h now
先ほど作ったmicroSDで、ちゃんと起動しました。各種情報を確認します
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 6G 0 part /
28.9GBのディスクに64M+6Gしかない、という狙った通りの状態です
df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 5.9G 2.7G 3.0G 48% /
devtmpfs 943M 0 943M 0% /dev
tmpfs 1007M 0 1007M 0% /dev/shm
tmpfs 1007M 17M 990M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1007M 0 1007M 0% /sys/fs/cgroup
/dev/mmcblk0p1 63M 14M 50M 21% /boot
tmpfs 202M 4.0K 202M 1% /run/user/1000
ファイルシステムも狙い通り展開されています。では、パーティションを目一杯広げます
sudo fdisk /dev/mmcblk0
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/mmcblk0: 28.9 GiB, 31037849600 bytes, 60620800 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/mmcblk0p2 139264 12722175 12582912 6G 83 Linux
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-60620799, default 2048): 139264
Last sector, +sectors or +size{K,M,G,T,P} (139264-60620799, default 60620799):
Created a new partition 2 of type 'Linux' and of size 28.9 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N
Command (m for help): p
Disk /dev/mmcblk0: 28.9 GiB, 31037849600 bytes, 60620800 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/mmcblk0p2 139264 60620799 60481536 28.9G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: デバイスもしくはリソースがビジー状態です
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
いったん再起動
sudo reboot
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 28.9G 0 part /
元のバックアップでは29.4Gだったところが、少し小さなmicroSDで28.9Gに収まっています。
ファイルシステムを目一杯広げます
sudo resize2fs /dev/mmcblk0p2
resize2fs 1.43.4 (31-Jan-2017)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mmcblk0p2 is now 7560192 (4k) blocks long.
これで、無事完了しました!
9-1. パーティションを削除して同じフォーマットで再確保するだけならWindows用のGUIを備えたツール(この辺り)でできるんじゃないかと思ったのですが、ものの見事に内容が消えてしまいました。
9-2. microSD上でシュリンクする方法も試したのですが、ddで出力する段階で(約2GBのところで)エラーが出てしまいました。ただ、この段階ではまだよく分かっていなくて、失敗していたかも知れません。
9-3. TinkerBoard 近影
これで、microSDのサイズを細かく気にする必要がなくなりました。少々面倒ですが!
参考になれば幸いです。
パドラッパ from MacBook Air (2017)
ということは、イメージバックアップをせっかく取ってあっても、買ってきたmicroSDに書き込めないという事態が(私のように何種類も持っていなければ)生じがちだということです。これは困ります。
それで、TinkerBoardのバックアップイメージそのものを縮小する方法を探してみたところ、ありがたいことに、次のところに主要なポイントが書かれていきました:
ddで作ったイメージのサイズを概ね実容量まで小さくする方法 · GitHub
また、こちらに書かれている内容も参考にさせて頂きました(これらはmicroSDに書き込んでから縮小しておられます):
Raspberry Piで最小サイズのバックアップを作成する | Developers.IO
時羽金也の技術帳: resize2fs と fdisk で ext4 のパーティションを縮小する
それでは、自分のやった手順を残しておくことにします。2台目のTinkerBoard(tb02, Debian 9.12)を使って1台目のバックアップを加工しました。 手打ちした部分を太字にしておきます。
1. イメージファイルをループバックデバイスにする
buffaloのNASに置いてある"/mnt/common/work/tb01-32GB.img"を加工していきます。
ファイルのあるフォルダへ移動
cd /mnt/common/work
サイズの確認、ディスク上では30GBでした
ls -l tb01-32GB.img
-rwxr-xr-x 1 root root 31624003584 4月 9 08:47 tb01-32GB.img
ls -hl tb01-32GB.img
-rwxr-xr-x 1 root root 30G 4月 9 08:47 tb01-32GB.img
利用可能な最初のループバックデバイスを見つける
sudo losetup -f
/dev/loop0
ここにループデバイスを作成する
sudo losetup --partscan /dev/loop0 ./tb01-32GB.img
できたか確認、OKです
sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
/dev/loop0 0 0 0 0 /mnt/common/work/tb01-32GB.img 0
縮小したいところはloop0p2の29.4GBです
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
├─loop0p1 259:0 0 64M 0 loop
└─loop0p2 259:1 0 29.4G 0 loop
mmcblk0 179:0 0 29.5G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 29.4G 0 part /
2. ファイルシステムを詰める
一度マウントして、未使用ブロックを解放しようとして、エラーが出てしまいました。ここはパスします
sudo mount /dev/loop0p2 /mnt
sudo fstrim -v /mnt
fstrim: /mnt: FITRIM ioctl failed: 入力/出力エラーです
sudo umount /mnt
ファイルシステムを確認しておきます。問題なし。使用ブロック数は1035864
sudo e2fsck -f -y -v -C 0 /dev/loop0p2
e2fsck 1.43.4 (31-Jan-2017)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
88812 inodes used (4.70%, out of 1888000)
132 non-contiguous files (0.1%)
79 non-contiguous directories (0.1%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 74857/49
1035864 blocks used (13.45%, out of 7703296)
0 bad blocks
1 large file
68601 regular files
6163 directories
54 character device files
25 block device files
0 fifos
5 links
13926 symbolic links (13785 fast symbolic links)
34 sockets
------------
88808 files
tune2fsでブロックサイズと使用ブロック数を確認します。が、結果として使いません(汗
sudo tune2fs -l /dev/loop0p2 |grep 'Block count'
Block count: 7703296
sudo tune2fs -l /dev/loop0p2 |grep 'Free block'
Free blocks: 6667432
sudo tune2fs -l /dev/loop0p2 |grep 'Block size'
Block size: 4096
(Block count) - (Free blocks) = 1035864, e2fsckの結果と一致
使用済みサイズ 4096 * 1035864 = 4242899 byte ~ 3.95 GB
これをメモしつつ、resize2fsで必要サイズを見積もります
sudo resize2fs -P /dev/loop0p2
resize2fs 1.43.4 (31-Jan-2017)
Estimated minimum size of the filesystem: 1075235
上記の使用済みサイズよりも数%多く、4.1GBは必要のようです。実際、次のコマンドで4Gを指定すると蹴られました。
キリの良いところで(相当余裕を見て)5GBにしておきます。
sudo resize2fs -p /dev/loop0p2 5G
resize2fs 1.43.4 (31-Jan-2017)
Resizing the filesystem on /dev/loop0p2 to 1310720 (4k) blocks.
Begin pass 2 (max = 431067)
Relocating blocks XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 236)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 6781)
Updating inode references XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0p2 is now 1310720 (4k) blocks long.
1310720 * 4096 / 1024^3 = 5.0 GBになりました。
3. パーティションを削除し、同じ場所に小さく確保し直す
正直、この発想がありませんでした。中身は消さずにメタ情報だけ書き換えるわけですね。その中身は、先にresize2fsで5GB以内に入っているはずです。
パーティションサイズは更に余裕を見て6GBにしておきます。
sudo fdisk /dev/loop0
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 61765631 61626368 29.4G 83 Linux
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-61765631, default 2048): 139264
Last sector, +sectors or +size{K,M,G,T,P} (139264-61765631, default 61765631): +6G
Created a new partition 2 of type 'Linux' and of size 6 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N ← ここが肝心
Command (m for help): p
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 12722175 12582912 6G 83 Linux
Command (m for help): w ← よく確認してから
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
4. ファイルシステムをパーティションに合わせる
sudo resize2fs /dev/loop0p2
resize2fs 1.43.4 (31-Jan-2017)
Resizing the filesystem on /dev/loop0p2 to 1572864 (4k) blocks.
The filesystem on /dev/loop0p2 is now 1572864 (4k) blocks long.
1572864 * 4096 / 1024^3 = 6.0 GBちょうどです
5. ファイルシステムの確認
びくびくしながら作業してきたので、壊していないか確認します
lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
mmcblk0 179:0 0 29.5G 0 disk
mmcblk0p1 179:1 0 64M 0 part /boot
mmcblk0p2 179:2 0 29.4G 0 part /
loop0p1 259:4 0 64M 0 loop
loop0p2 259:5 0 6G 0 loop
おぉ、6Gだ
sudo e2fsck -f -y -v -C 0 /dev/loop0p2
e2fsck 1.43.4 (31-Jan-2017)
Pass 1: Checking inodes, blocks, and sizes
Inode 26 extent tree (at level 1) could be narrower. Fix? yes
Inode 1783 extent tree (at level 2) could be narrower. Fix? yes
Pass 1E: Optimizing extent trees
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0p2: ***** FILE SYSTEM WAS MODIFIED *****
88812 inodes used (23.13%, out of 384000)
342 non-contiguous files (0.4%)
79 non-contiguous directories (0.1%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 74725/180/1
941059 blocks used (59.83%, out of 1572864)
0 bad blocks
1 large file
68601 regular files
6163 directories
54 character device files
25 block device files
0 fifos
5 links
13926 symbolic links (13785 fast symbolic links)
34 sockets
------------
88808 files
2カ所の修正が入ったためだと思いますが、使用ブロック数がいつの間にか1035864から941059に減りました。
ただ、e2fsckの前は確認していませんので、本当にここかどうかはよく分かりません(汗
6. 縮小したイメージファイルの出力
最終セクタを確認して、それ+αまでddでファイルに出力します
sudo fdisk -l /dev/loop0
Disk /dev/loop0: 29.5 GiB, 31624003584 bytes, 61765632 sectors
Units: sectors of 1 * 512 = 512 bytes
(略)
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/loop0p2 139264 12722175 12582912 6G 83 Linux
最終セクタは12,722,175 すなわち 6,513,753,600 byte, 6,361,088 kbyte, 6212 Mbyte でした。
microSDのセクタ512byteに合わせたブロックサイズで出力すれば計算は簡単ですが、おそらく時間がかかるので、ここではブロックサイズ16Mで少し余裕を持たせて書き込みます。6212 / 16 = 388.25 より、390 ブロックで 6240 Mbyteにします。
ここで、同一デバイス上(NAS上)に出力したところ最初から非常に遅く、じきに"IOエラー"が出てハングアップしてしまいました(残っていたファイルは62MBで、loop0p1終盤の加工していない部分で固まっていました)。
そのため、まずは別デバイス(というか作りたいmicroSD)に出します。
microSDを挿したUSBカードリーダーをTinkerBoardへ挿してから、lsblkで処理するmicroSDが/dev/sdaだと確認します
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 29.5G 0 loop
├─loop0p1 259:0 0 64M 0 loop
└─loop0p2 259:1 0 6G 0 loop
sda 8:0 1 28.9G 0 disk ← 先日の確認で最も小さかったmicroSD
└─sda1 8:1 1 28.9G 0 part /media/linaro/ADATA1807
mmcblk0 179:0 0 29.5G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 29.4G 0 part /
書き込みます。先ほど計算した通りファイルはブロックサイズ16Mで390ブロックにする予定なので、
microSDへは512byteセクタをブロックとして390 * 16 * 1024^2 / 512 = 12779520カウントにしました。
sudo dd if=/dev/loop0 of=/dev/sda bs=512 count=12779520 status=progress
今度はすんなり書けました。
NASにも保存しておきたいので、続いてmicroSDからNASへ書き出します
sudo dd if=/dev/sda of=/mnt/common/work/tb01-7G.img bs=16M count=390 status=progress
出力フォルダを確認してみます
ls -l tb01*
-rwxr-xr-x 1 root root 31624003584 4月 9 11:57 tb01-32GB.img
-rwxr-xr-x 1 root root 6543114240 4月 9 13:24 tb01-7G.img
ls -hl tb01*
-rwxr-xr-x 1 root root 30G 4月 9 11:57 tb01-32GB.img
-rwxr-xr-x 1 root root 6.1G 4月 9 13:24 tb01-7G.img
ちゃんとできているようです。
7. ひとまずお片付け
ループデバイスを外し、無くなっていることを確認し、シャットダウン
sudo losetup -d /dev/loop0
sudo losetup -l
sudo shutdown -h now
8. 確認作業
先ほど作ったmicroSDで、ちゃんと起動しました。各種情報を確認します
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 6G 0 part /
28.9GBのディスクに64M+6Gしかない、という狙った通りの状態です
df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 5.9G 2.7G 3.0G 48% /
devtmpfs 943M 0 943M 0% /dev
tmpfs 1007M 0 1007M 0% /dev/shm
tmpfs 1007M 17M 990M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1007M 0 1007M 0% /sys/fs/cgroup
/dev/mmcblk0p1 63M 14M 50M 21% /boot
tmpfs 202M 4.0K 202M 1% /run/user/1000
ファイルシステムも狙い通り展開されています。では、パーティションを目一杯広げます
sudo fdisk /dev/mmcblk0
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/mmcblk0: 28.9 GiB, 31037849600 bytes, 60620800 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/mmcblk0p2 139264 12722175 12582912 6G 83 Linux
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-60620799, default 2048): 139264
Last sector, +sectors or +size{K,M,G,T,P} (139264-60620799, default 60620799):
Created a new partition 2 of type 'Linux' and of size 28.9 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N
Command (m for help): p
Disk /dev/mmcblk0: 28.9 GiB, 31037849600 bytes, 60620800 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: 0x58bc1052
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 139263 131072 64M c W95 FAT32 (LBA)
/dev/mmcblk0p2 139264 60620799 60481536 28.9G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: デバイスもしくはリソースがビジー状態です
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
いったん再起動
sudo reboot
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 28.9G 0 part /
元のバックアップでは29.4Gだったところが、少し小さなmicroSDで28.9Gに収まっています。
ファイルシステムを目一杯広げます
sudo resize2fs /dev/mmcblk0p2
resize2fs 1.43.4 (31-Jan-2017)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mmcblk0p2 is now 7560192 (4k) blocks long.
これで、無事完了しました!
9. おまけ
9-1. パーティションを削除して同じフォーマットで再確保するだけならWindows用のGUIを備えたツール(この辺り)でできるんじゃないかと思ったのですが、ものの見事に内容が消えてしまいました。
9-2. microSD上でシュリンクする方法も試したのですが、ddで出力する段階で(約2GBのところで)エラーが出てしまいました。ただ、この段階ではまだよく分かっていなくて、失敗していたかも知れません。
9-3. TinkerBoard 近影
これで、microSDのサイズを細かく気にする必要がなくなりました。少々面倒ですが!
参考になれば幸いです。
パドラッパ from MacBook Air (2017)
| 固定リンク | 0
« イメージファイルを書き込もうとしたら叱られて、microSDの容量を確認してみた(2020/04/09追記) | トップページ | PyenvをDebian10に入れて自作Pythonスクリプトの検証をしたところ… (2020/04/25追記) »
コメント