実際のパーティションのみで、その後の空き領域を含まない SD カードのイメージを取得するにはどうすればよいでしょうか?

実際のパーティションのみで、その後の空き領域を含まない SD カードのイメージを取得するにはどうすればよいでしょうか?

2 つのパーティション (合計 6 GB) を持つ 16 GB の SD カード (具体的には、PinePhone 用の起動可能な Mobian SD カード) があります。残りの領域は未割り当てです。SD カードの 6 GB イメージを取得するにはどうすればよいでしょうか?

答え1

少し脆弱なコマンドを使用すると、要求に応じてドライブの最初のセクションをイメージ ファイルにコピーできます。ただし、注意すべき点がいくつかあります。

  • コマンドラインからデバイス ファイルに直接アクセスする必要があるため、コマンド全体を (ソリューションを使用する前のコマンドrootのように)として実行する必要があります。sudo su
  • バックアップパーティションテーブル(GPTパーティションテーブルの場合)意思ないコピーされる
  • 「トリック」はパーティションテーブルが完全であることに依存します - 前述の未割り当て領域本当に未割り当て、コピーしたくないパーティションではありません。
  • パーティションは前面に集められます。パーティション間にギャップがある場合は、そのギャップがコピーされます。
  • fdiskシステムにコマンド (おそらく) とコマンド (可能)の両方がインストールされているかどうかによって異なりますbc。どちらも標準であり、必要に応じてデフォルトのリポジトリからインストールできます。
  • イメージ ファイルは root が所有するため、chownユーザーに完全なアクセス権を付与する必要がある場合は、これを実行する必要があります。

読みやすくするために改行した完全なコマンドを以下に示します。

dd if=/dev/sdx of=Mobian.img\
    bs="$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)"\
    count="$(echo "$(fdisk -o end -l /dev/sdx | tail -1) + 1"|bc)"\
    status=progress

内訳:

まず、/dev/sdx以前に接続されていた他の 23 個のディスクがない限り、正しいデバイス名を反映するように を変更する必要があります。

最初の行は予想されるddコマンドであり、デバイス名とファイル名は現在のニーズに合わせて設定されます。

2 行目は、 のブロック サイズをddSD カードのセクター サイズに設定します。これはほぼ確実に 512 バイトです。512 であることが 100% 確実な場合は、この行を に置き換えることができますbs=512。安全を確保し、将来的にどのデバイスでもコマンドを使用できるようにしたい場合は、余分なものをそこに残しておきます。操作は次のとおりです。

  • fdisk -l /dev/sdxデバイスに関するデータを報告する
  • grep sector出力に「セクター」が2回出現する
  • tail -1「セクター」が含まれる最後の行のみを取得します
  • cut -d' ' -f6フィールド間にスペースを使用すると、6番目のフィールド(バイト単位のセクターサイズ)のみを取得します。

3 行目は、コピーするddサイズの「ブロック」の数を示しますbs=。繰り返しますが、その数が正確にわかっている場合は、コマンドの代わりにその数を使用してください。「将来に備えて」、ここでも完全なコマンドを残しました。

- `fdisk -o end -l /dev/sdx` list the partition information about the device, and only output the ending sector ID of each `-o end`
- `tail -1` it don't matter how many there are, we only need the last sector of the last partion.
- `echo "... + 1" | bc` add one to the last sector ID. Uses the `bc` command, which is in integers unless told otherwise. Sectors are numbered from zero, to to copy sector #10 we have to copy 10 + 1 sectors (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

4 行目は娯楽目的です。スピード クラス 10 の高性能カードでは、6 GB のデータを読み取るのに約 4 分かかります。status=progressオプションを選択すると、ddターミナルが「進行」するにつれて更新されます。そうしないと、ターミナルはコマンドの終了を待つだけになり、永遠に続くように感じられます。

最終: コピーする内容が標準的で、パーティションが適切に整列され、ちょうど 6 GiB であることが確実にわかっている場合は、次の簡単なコマンドを使用できます。

dd if=/dev/sdx of=Mobian.img bs=1048576 count=6145 status=progress

もちろん、新しい画像が作成され、それに切り替えると、短縮バージョンは無効になります。上部のオリジナルは引き続き機能します。後でコピーする必要がある可能性のある他の「画像」にも機能します。

ボーナス:

何らかの理由で気に入らない場合はdd、同じ数値収集手順を使用して、head代わりに次のコマンドを適用できます。

head -c $(\echo "\
    "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" *\
    ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc)\
    /dev/sdx > Mobian.img

一言で言えば:

head -c $(\echo " "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" * ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc) /dev/sdx > Mobian.img'

答え2

Linux の dd コマンドを使用できます。両方のパーティションを個別に読み取って連結するか、計算を行って 2 番目のパーティションの最後のセクターを決定するかを選択できます。次に、bs (ブロック サイズ) と count (ブロック数) パラメータを使用して dd コマンドを実行し、コピーを 2 番目のパーティションの最後で終了させます。

関連情報