#author("2021-07-13T16:29:18+00:00","","")
#author("2021-07-14T02:42:09+00:00","","")
*ディスクイメージの縮小方法(for Linux) [#l418054f]
SDカードいっぱいにパーティションが作成されている場合、データが無い部分も含まれていて、そのままイメージ化すると無駄が多い。~
そこで、データが記録されている部分だけにパーティションを縮小してイメージ化する方法をまとめた。

具体的な例としては、(安価になった)32GB MicroSDを使ってシステム構築したが、そのイメージを保存したり配布したいときに使う。~
そうしないと、すっかすかなのに32GBのイメージを配布することになり、実際は8GBあれば余裕なのに32GBのもとと同じブランドのカードを使わないと復元できない。~
SDカードはブランドごとに微妙な容量差があるため、同じブランドのカードでないとまるごとイメージは書き込むことができない例があります。

この手順は、完成したシステムの標準SDのイメージを作るときに活用できる。~
開発用には、SDカードにOSをインストールし、Updateし、基本設定が終わった状態をイメージ化して保存しておくと便利。

** 手順概要 [#h5d4835a]
*** 準備 [#ea7cf5d1]
- 作業はLinux上で行うと楽なので、WindowsにVMWareを用意し、VMWare上にFedoraやCentOSを用意する。もちろん、Ubuntuでもできる。~
使うコマンドはfdiskとresize2fsです。これが使えればLinuxのディストリビューションは何でも良い。作業用に用意したRaspiOSでもできる。~
今はCentOS7を使用しています。CentOS7だとパーティション縮小までを「ディスク」のGUIで行えます。→GUIなので簡単です
- 通常通りセットアップしたRasPiのSDカードをLinux機に接続する~
MountされてしまったらUnMountする
*** SDカードから縮小したイメージを作成 [#f15c0c72]
- dfコマンドでSDカードの実使用量を調べる
- 縮小後のパーティション容量を決める(実使用量より100MB以上余裕を残しておく)
- resize2fsコマンドでファイルシステムを縮小する
- fdiskでパーティションを切り直す
- パーティションの最終セクタを調べる
- セクタ0から最終セクタまでをddでファイル化する
- できあがったイメージファイルはzip圧縮して保存用(配布用)とする
*** 縮小されたイメージからSDカードに復元 [#i926f2af]
- WindowsではEtcherを使うとZIPのままSDカードに書き出せる
- Linux上でddコマンドを使ってSDカードに書き出しても良い(ZIP解凍もパイプでつなげて同時にやると楽)
- SDカードに復元したら、Linux上でそのまま領域拡張するか、RasPi実機に乗せて起動後にraspi-config内にある領域拡張を実行する

&size(24){↓↓↓ ここからが詳細な手順 ↓↓↓};

** パーティション縮小したいSDカードをマウントする。 [#q5bc36a5]
通常、/bootと/の2つがパーティションされているので、USBカードリーダーでつなげて第2パーティションを/mnt/usbあたりにマウント。~
その状態から使用量を調べて、アンマウントして、縮小の作業を行う。

** ストレージのサイズ変更(縮小) [#m6b50878]
以下は別PC(Linux専用機)のFedoraでの作業

概要:(容量は例)~
SDカードは/dev/sddに接続されたとする。~
第2パーティションの使用量は3.5GB。(dfコマンドで確認する)~
目標パーティションサイズを4GBとする。(少し余裕を残さないと後で困る)~
resize2fsで縮小するサイズは3.8GBとする。(目標より少なめに)~
例) パーティションサイズ4GB>ファイルシステムサイズ3.8GB>使用サイズ3.5GB~
最終的には、パーティションサイズ=ファイルシステムサイズ>使用サイズにする。(ファイルシステムサイズは使用サイズ+100MB以上とすることを推奨する)

- ファイルシステムの縮小
 # e2fsck -f /dev/sdd2
 チェックする(必須)
 
 # resize2fs -p /dev/sdd2 3800M
 目標パーティションサイズより少し少なくする
 指定サイズが小さすぎて縮小が無理だとエラーがでる
 
- パーティションの縮小
 # fdisk /dev/sdd
 pコマンドで第2パーティションの開始シリンダを確認してメモする
 dコマンドで第2パーティションを削除する
 pコマンドで状態を確認する
 nコマンドで新しいパーティションを作る(開始シリンダに注意=先ほどのメモを参照)
  容量指定は目標サイズ指定の「+4000M」で
 pコマンドで状態を確認する
 wコマンドで書き込む

これで、パーティションサイズ4000MBに変更される。~
ただし、論理サイズは先に縮小した3800MBのまま。~
これを次の操作でパーティションサイズと合致させる。

** ファイルシステムのサイズ変更(パーティションサイズと同じサイズに拡張) [#da6b2f05]
 
 # resize2fs -p /dev/sdd2
 サイズ指定をしなければ、ファイルシステムはパーティションサイズまで自動で拡張される
 これで、ファイルシステムのサイズとパーティションのサイズが合致する

** SDカードからイメージを作成 [#m230823c]
SDカード上で縮小処理した状態から、最小限のサイズだけイメージ化する。~
例えば、8GBのカードに縮小構成を作成して上記パーティションの縮小作業をして4GBまで切り詰めたとする。~
これをそのままddやWin32DiskImageでイメージ化すると、8GBカードの後半4GBもゴミデータとしてファイルに書き出されてしまう。

- ストレージのサイズ変更(縮小)の作業を行って、パーティションサイズを少し余裕を持たせて最小にする。
- 別のLinux機にカードを接続する(ここでは/dev/sddに乗ったとする)
- 自動マウントされた場合はアンマウントする
- fdisk /dev/sdd でパーティションの最終セクタを確認する
 # fdisk /dev/sdd
 Welcome to fdisk (util-linux 2.23.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/sdd: 7948 MB, 7948206080 bytes, 15523840 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
 Disk label type: dos
 Disk identifier: 0xf8e23f7b
 
    Device Boot      Start         End      Blocks   Id  System
 /dev/sdd1            8192       92159       41984    c  W95 FAT32 (LBA)
 /dev/sdd2           92160     4140072     2023956+  83  Linux
 
 Command (m for help): q

- 最終セクタは4140072と分かった。これに1足して書き出すセクター数は4140073とする。
- 次に、dd コマンドでファイル化する
 # dd if=/dev/sdd of=raspbian_pifw.img bs=512 count=4140073
- または、同時にZIP圧縮する
 # dd if=/dev/sdd bs=512 count=4140073 | pv | pigz -cK > raspbian_pifw.img
- または、同時にgz圧縮する
 # dd if=/dev/sdd bs=512 count=4140073 | pv | pigz -c > raspbian_pifw.gz
pvは進捗を表示するコマンド(要インストール)~
pigzはgzipのマルチコア処理版(要インストール)

これで、出来上がったイメージを4GBを超えるカードに展開することができる。~
もし4GBのカードに展開したければ、2つのパーティションのトータルサイズが4000MBより少なくなるようにそれぞれのサイズを計算して実行する。~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS