Transpeed 8K618-T マスターディスク作成
【趣旨】
Transpeed 8K618-T にて、複数台を構築する際に利用。
OSイメージ(500MB)をダウンロード。解凍すると約2GBになった。
SDカード(32GB)に2GBを書き込み、SBCで起動すると初回だけ自動拡張スクリプトが動作して、
OSのデータ領域が、SDカード全容量の32GBへ自動拡張される。
ディスク容量 32GBとなった状態で初期構築を完了させる訳だが、32GB中で実使用容量は2.5GB。
このイメージデータをファイルサーバーで保存しておこうと思ったり、配布しようと思うと可能な限り圧縮したい。
【圧縮作業にあたり】
〇 利点
- HDD保管領域の容量節約
- イメージをSDカードへ展開する時間の短縮
〇 欠点
- 面倒くさい
- HDD保管領域や作業時間が十分に取れる場合は、マスターとなるSDカードを空のSDカードへディスクコピーしたほうが簡単
1回しか使わない。初期構築したOSイメージは残さないのであれば、そもそも以下作業は不要
【マスターイメージの作成】
Android TV BoxのLinux化の際、内蔵ディスク(NVMe, SATA等)へ書き込む際は、十分な注意が必要。
可能な限りリスクを減らすため、SDカード上でマスターイメージとなるベースを構築しておく。
【作業環境】
手頃なLinuxOS端末 – 母艦OSと呼称。
- SDカードで使用されているファイルシステムは、サポート可能である事。FAT, ext4など
【情報収集】
- SDカードのOSはArmbian
- SDカードの総容量は32GB
- Loaderはu-bootが使用されている。
- 母艦OSにSDカード(USB変換アダプタなどで)を認識。認識デバイス /dev/sdf仮定。
- 作業領域として母艦OSのHDD領域を利用。使用容量は、情報収取の上で確定。
パーティション情報
# fdisk -l /dev/sdf
ディスク /dev/sdf: 29.1 GiB, 31266439168 バイト, 61067264 セクタ
単位: セクタ (1 * 512 = 512 バイト)|
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa37fb839
デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
/dev/sdf1 8192 60424191 60416000 28.8G 83 Linux ⇒ ① 開始位置
# lsblk -f /dev/sdf
NAME FSTYPE LABEL UUID
sdf
|-sdf1 ext4 armbi_root caeb0884-218b-4fd6-85f6-288d5f44773b ⇒ ② FSTYPE/LABEL/UUID
# mkdir /mnt/temp
# mount -o ro /dev/sdf1 /mnt/temp
# df -h /mnt/temp
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/sdf1 29G 2.2G 26G 8% /mnt/temp
# umount /mnt/temp
# rmdir /mnt/temp
【圧縮作業開始】
母艦OSの作業場所は、/x1/temp
(1) イメージデータの作成
上記の情報収集にて、実使用容量は2.2GB。 (なんとなく)10%増しの2.5GBを作成。
# dd if=/dev/zero of=/x1/temp/8k618t.img bs=1M count=2500
(2) ファイルをループデバイスとしてマウント
# losetup -P -f /x1/temp/8k618t.img
# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop0 0 0 0 0 /x1/temp/8k618t.img 0 512
(3) パーティション作成
# fdisk /dev/loop0
上記の情報収集にて、開始セクターは8192を指定
コマンド (m でヘルプ): n
パーティションタイプ
p 基本パーティション (0 プライマリ, 0 拡張, 4 空き)
e 拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1):1
最初のセクタ (2048-5119999, 既定値 2048): 8192
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (8192-5119999, 既定値 5119999):5119999
コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。
# fdisk -l /dev/loop0
ディスク /dev/loop0: 2.5 GiB, 2621440000 バイト, 5120000 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: dos ディスク識別子: 0xa37fb839 デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ /dev/loop0p1 8192 5119999 5111808 2.4G 83 Linux
(4) パーティション1をフォーマット
- 値は、上記情報収集②を参照。
- なるべく作業を減らすために、値はそのままを使用
# mkfs.ext4 -L armbi_root -U caeb0884-218b-4fd6-85f6-288d5f44773b /dev/loop0p1
Discarding device blocks: done Creating filesystem with 638976 4k blocks and 160000 inodes Filesystem UUID: caeb0884-218b-4fd6-85f6-288d5f44773b Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
(5) SDカード内のファイルをイメージファイルへ同期
# mkdir /mnt/{src,dst}
# mount -o ro /dev/sdf1 /mnt/src
# mount /dev/loop0p1 /mnt/dst
# rsync -aHWh -X \
–exclude=“/dev/*” \
–exclude=“/proc/*” \
–exclude=“/run/*” \
–exclude=“/tmp/*” \
–exclude=“/sys/*” \
–exclude=“/home/*” \
–info=progress0,stats1 \
/mnt/src/ /mnt/dst/
sent 2.07G bytes received 1.32M bytes 11.87M bytes/sec total size is 2.07G speedup is 1.00
# sync
# umount /mnt/dst
(6) イメージファイルへ u-bootをインストール
# dd if=/dev/zero of=/dev/loop0 bs=1k count=1023 seek=1 status=noxfer
1023+0 レコード入力 1023+0 レコード出力
# dd if=/mnt/src/usr/lib/linux-u-boot-edge-transpeed-8k618-t/u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8 status=noxfer
749+1 レコード入力 749+1 レコード出力
# sync
# umount /mnt/src
# rmdir /mnt/{src,dst}
(7) ループバックデバイスの解除
# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop0 0 0 0 0 /x1/temp/8k618t.img 0 512
# losetup -d /dev/loop0
# losetup -l
#
(7) 新しいSDカードへ書き込みと動作確認
作成したマスターイメージが起動するか、試しに確認してみる。
母艦OSに挿していたマスターイメージのSDカードを抜いて、新しいSDカードを挿す。
⇒ 認識デバイスは、/dev/sdf となった。
# dd if=/x1/temp/8k618t.img of=/dev/sdf bs=1M iflag=fullblock oflag=direct status=progress
# sync
新しいSDカードを母艦OSから抜いて、Transpeed 8K618-tへ差し込み、SDカードから起動すればOK
(8) マスターイメージを圧縮させる
# ls -lh
合計 2.4G -rw-r--r-- 1 root root 2.5G 5月 13 12:14 8k618t.img
# xz -z 8k618t.img
# ls -lh
合計 546M -rw-r--r-- 1 root root 546M 5月 13 12:14 8k618t.img.xz
以上で終了です。
最終的に32GBのOSイメージが2.5GB。
保管の為に、xz圧縮かけると540MBとなりました。