xzコマンドで解凍しddコマンドを使用してSDカードにOSイメージを作成(fdisk使用)

例えば以下の様なファイルをダウンロード後にSDカードなどに書き込んで
OSイメージを作成したい。

▼　以下を実行しファイルを解凍します。
(ubuntuではxz -dオプションなど要る場合あり)
※-dオプションは、データの解凍（デコンプレッション）を指定し 、
-k オプションは解凍後に元の圧縮ファイルを削除せずに残しておく
【注意】間違ったドライブを指定したら大変なことになるので要注意。

$ xz -d -k linux-OSimage-for-arm64.img.xz　(suユーザーだけコマンド動く)
　↓
ファイル名はlinux-OSimage-for-arm64.imgなどになる。


Alpineにlsblkが入ってなかったので
$ apk add lsblk　を実行しパッケージをインストールしました。

▼　lsblkを実行すると
各デバイスとサイズ、マウントポイントなどが表示されました。
その中で注目すべき行は、

NAME                                       SIZE           TYPE
mmcblk0    179:0        0       29.3G    0   disk   /mnt/SDcard
　┕mmcblk0p1  179:1     0       29.3G    0  part

という部分でした。このmmcblk0がSDカードそのものであるという事ですね。
mmcblk0p1はパーティションです。OSイメージ様に最低一つのパーティションが必要です。

ただし書き込み前にマウントをし、マウント前にフォーマットします。
パソコンにSDカードを入れただけでは書き込めません。

順番は以下の通り。
①umount(fdisk+領域開放保存→fdisk+パーティション作成保存)
②mkfs(パーティションをフォーマット)
③mount(マウントしなくても行けるときあり)
④dd(書き込み)

必ず＄ mkfs.ext4 /dev/mmcblk0 や mkfs -t ext4 /dev/mmcblk0p1などと
「パーティションをフォーマット」する事。

注意：
おそらく正しくは、パーティションをひとつにして→パーティションをフォーマットして→パーティションをマウントして→書き込みする、、、という流れ。

※フォーマット時に領域解放できていないとエラーになるし、正しくパーティションを作る必要がある。(ラスパイOS用のイメージはext4で書き込み後、windows用FAT領域がBOOTになって出たりするので混乱せずに落ち着いて作業しよう)

▼フォーマットする前に領域開放する(以下CUIは難しいが確実)
ーーーーーーーーー
　　　　　　　　　｜
（最終確認もできるおすすめツールはgpartedツールなど)

#まずパーティションがマウントされている場合、先にアンマウントしないとfdiskが無効になる。
#まずfdiskコマンドを使用して現在のパーティションを確認:

●　sudo fdisk -l /dev/mmcblk0

このコマンドは、SDカードのパーティション情報を表示します。
SDカードを正しく指定してください(/dev/mmcblk0は一般的なSDカードのデバイス名です)。パーティションが表示されない場合、SDカード全体が未割り当て領域である可能性があります。

GUIでのフォーマットやmkfs.ext4 /dev/mmcblk0で３２GBのSDカードなどをフォーマットしていても、すべての領域が解放されているかどうか？確認する。

          
▼lsblkすると２個のパーティションがあれば領域解放とフォーマットが不完全。
例
NAME                                       SIZE           TYPE
mmcblk0    179:0        0       29.3G    0   disk   /mnt/SDcard
┣mmcblk0p1  256M　と
┗mmcblk0p2     ４G　との２個にツリーが枝分かれしています。

また以下は、各パーティションのサイズを確認するコマンドです。
sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT /dev/mmcblk0
上記のコマンドを実行すると、mmcblk0デバイスの情報が表示され、
それぞれのパーティションのファイルシステムの種類、サイズ、
マウントポイント（マウントされていれば）が表示されます。
この情報を確認して、SDカードの状態を理解できます。

もしSDカード全体が1つのパーティションとして使用されていることを望む場合は、必要に応じて再フォーマットを行うことができます。
以下は、mkfs.ext4を使用してSDカードを1つのパーティションとしてフォーマットする例です。

▼パーティションがマウントされている場合、先にアンマウント
$ umount /dev/mmcblk0


▼fdiskを起動:
$ sudo fdisk /dev/mmcblk0    

disk label typeがGPTでなくdosの場合LINUXイメージを書き込みしても、正常に動作しない。(元のKali Linux OSイメージが書き込み後の確認でdosパーティションを持つ事もある)　ディスクラベルタイプをGPTに変更するだけでは、一度書き込まれた既存のパーティションやファイルシステムは削除されません。

▼パーティションの削除:
「 d 」を入力してパーティションを削除します。これを必要なだけ繰り返します。

▼保存(dなどfdisk作業の後は必ず一回一回都度wを実行しfdiskを抜けて反映させる)
「 w 」押下→「partition table has been altered」などと表示される。

▼２回目のfdisk起動
$ sudo fdisk /dev/mmcblk0
「 p 」押下で正しくパーティションが d されたかを確認できる

▼新しいパーティションの作成:
「 n 」を入力して新しいパーティションを作成します。
＞ p でプライマリパーティションを選択。
＞ 1 でプライマリパーティションの番号を指定しパーティションのサイズを設定します。
＞ セクターを2048～最後まで(デフォルト値で)指定しenter押下のみで設定可。
通常、最初のセクタから最後のセクタまで使う場合はデフォルトの値を使用できます。
※「cylinder」は古い記憶域の構造。今は「セクタ」で計算している

▼２回目保存しfdiskを終了します。
「 w 」押下。
「partition table has been altered」などと表示される。
「warning: Re-reading the parthition table failed with error...」など表示

(ここで３回目のfdiskを実行しgでタイプをGPT=ext4に変えた方が良いかも？)

▼ファイルシステムの作成(間違ってディスクをフォーマットしない事)
#新しく1つのパーティションをフォーマットしてそれをマウントする事。
＄ mkfs.ext4 /dev/mmcblk0p1  # ext4でパーティションをフォーマット
(別の書き方もあるようです→$ mkfs -t ext4 /dev/mmcblk0p1　)
↓
filesystem label....
Block size......
.........
などの情報が表示され作成が完了する。

▼確認
lsblkするとmmcblk0のパーティションツリーが消えて１行に統一されている。
(OSイメージ用に最低一つのパーティションは必要）

NAME                                       SIZE           TYPE
mmcblk0    179:0        0       29.3G    0   disk   /mnt/SDcard
　┕mmcblk0p1  179:1     0       29.3G    0  part

▼　gpartedコマンドのGUIツールやfdisk -l で最終確認。

▼マウントする(念のためマウントポイントは都度削除し都度作成して使う)
$ mount /dev/mmcblk0 /mnt/SDcard_mountpoint         
　　　　　　｜
ーーーーーー

 
▼上記すべて(lsblk でマウントポイント確認まで)出来ていたら以下を実行できる
$　ls
index.html
kali-linux-2023.2-raspberry-pi-arm64.img

▼書き込み実行する(間違ってパーティションに書き込まない事)
ddコマンドはlsblkコマンドの表示内で「disk」と書いてある行の
ディスクの名前「mmcblk0」を使用して以下の様に書けばいいようです。
特にof=の引数にSDカードのディスクのフルパス「/dev/mmcblk0」　を指定すればよさそうです。

$  dd if=sample-linux-OSimage-for-arm64.img of=/dev/mmcblk0  bs=1M status=progress

if=input file 書き込み用ファイル  
of=output file　書き込み先ディスク(パーティションやマウントポイントではない)

/dev/mmcblk0 はSDカードデバイスそのものを指し、これを of= オプションで指定することでデータを書き込むことができます。
こうして of=/dev/mmcblk0 を指定することで、データがSDカードデバイスそのものに書き込まれる。また、bs=1M はブロックサイズ(単純に64Mや128Mにすれば早いというわけでもない)

【注意】末尾またはddの後ろに  status=progress　を追記したら進捗状況を見れるがオプションが非対応のため今回は使用せず。

再度lsblk コマンドやfdisk -lコマンドを使用することで、デバイスやパーティションの一覧や情報を確認することができます。

書き込み終了。→カードをumount