大きなパーティションを持つ小さなディスクイメージを作成する方法

大きなパーティションを持つ小さなディスクイメージを作成する方法

組み込みシステム用のディスクイメージ(4GB SDカードに配置)を構築中です。システムに2つのパーティションがあることを望みます。 「ルート」パーティション1個(200Mb)と「データ」パーティション1個(800Mb)。

ddを使用して空の1GBファイルを作成しました。次に parted を使用してパーティションを設定します。ループデバイスに別途インストールしてからフォーマットしました。 ext2 は「root」を表し、ext4 は「data」を表します。私のルートファイルシステムを「ルート」パーティションに追加し、「データ」を空白のままにしました。

それが問題だ。現在、200MBのデータしかない1GBの画像が残っています。理論的には、画像を201MBに切り捨ててファイルシステムをマウントすることはできませんか?残念ながら、私はこれが本当であることを見つけることができませんでした。

過去に4GBのSDカード全体を活用するパーティションを持つ30Mbイメージを作成するために、Freescaleのビルド環境を使用していたことを思い出してください。残念ながら、現時点では彼らが何をしているのかわかりません。

私はextファイルシステムのディスクフォーマットを読みましたが、最初のスーパーブロックの後にデータがなければ(バックアップスーパーブロックと未使用のブロックテーブルを除く)そこから切り取ることができると思います。

残念ながら、これを実行したときにインストールシステムがクラッシュしました。その後、FSCKを実行し、スーパーブロックとブロックテーブルを復元し、問題なくマウントできます。私はそれが必要だとは思わない。

たぶん他のファイルシステムが動作しますか?どんなアイデアがありますか?

ありがとう、

編集する

ファイルシステムを読み取るには、パーティションを変更します。パーティションはそのままで変更されていませんが、イメージを切り取った後にファイルシステムが破損しました。

編集する

私が見つけたのは、ファイルを最初の「データ」パーティションのスーパーブロックとinode /ブロックテーブルセット(データブロックの範囲内のどこか)のサイズより大きく切り捨てると、ファイルシステムが何もする必要がないということです。残りのスーパーブロックおよびブロック/inodeテーブルを回復するために使用されるfsckをアンロードします。

答え1

最も簡単な方法は、サポートファイルをスパースファイルとして生成することです。つまり、truncate -s 1G disk.img代わりに1GBに設定することdd if=/dev/zero bs=1048576 count=1024 of=disk.imgです。非常に良いとはるかtruncateに高速です。

ファイルを操作するとls -l1GB と表示されますが、これはサーフェスサイズにすぎません。du disk.img実際の寸法が提供されます。

(まれなファイルをサポートするファイルシステムに画像を保存する必要があります。一般的なUnixはすべてサポートされています。Ext2/3/4はすべてサポートされています。FAT32はサポートされていません。HFS +も同様です。)

注:論理的に、スパースファイルはまだフルサイズです。これは、作成されていない部分が物理的にディスクに保存されないことです。ほとんどの場合、実際に保存されていない部分はプログラムから隠されます。ただし、一部のユーティリティはこれをサポートしています。 (例:、、、dd conv=sparseなどcp --sparse=auto/always)。実際のUSBメモリースティックできない不足しています。これを書くと、はるかにdd conv=sparse高速になりますが、NUL(0x00)でいっぱいの予想ブロックではなく、以前に存在していたデータが残ります。空き容量によりうまく機能しますが、USBスティックに古いデータが残ります。セキュリティの問題かもしれません。

答え2

まず、希少なイメージをディスクに書き込みます。いいえそのイメージファイル(穴と全体)の合計サイズを除くすべてのサイズがディスクを上書きします。このためです扱うまれなファイル数は、ファイルシステムの品質と生のデバイスの品質を決定します。(画像を書くのと同じ)そのようなことはありませんしかし、。スパースファイルは次のとおりです。保存済みファイルシステムで制御されるメディアに安全に保存明らかスパースファイル(例:ext4デバイス)しかし、一度書いてみると、あなたが言いたいことがすべて含まれています。だからあなたがしなければならないことは:

  1. 書き込む準備が整うまでファイルを認識しないファイルシステムに保存します。

  2. 二重深さにしてください...

    • つまり、基本イメージをファイルに書き込み、別のイメージを作成します。まれなファイルを理解するfsを使用して画像をコピーし、画像、そして...

    • 画像を作成するときは、まず親画像を作成してから基本画像を作成してください。

手順2で行う方法は次のとおりです。

  • 1GBスパースファイルの生成...

    dd bs=1kx1k seek=1k of=img </dev/null
    
  • 二つ書くext4パーティションテーブルを分割します:1 200 MB、2 800 MB...

    printf '%b\n\n\n\n' n '+200M\nn\n' 'w\n\c' | fdisk img
    
  • 2個作成ext4ファイルシステムは-P割り当てられたループデバイスにあり、2番目のファイルシステムのコピーは最初のファイルシステムに配置されます。

    sudo sh -c '
        for p in "$(losetup --show -Pf img)p"*        ### the for loop will iterate
        do    mkfs.ext4 "$p"                          ### over fdisks two partitions
              mkdir -p ./mnt/"${p##*/}"               ### and mkfs, then mount each
              mount "$p" ./mnt/"${p##*/}"             ### on dirs created for them
        done; sync; cd ./mnt/*/                       ### next we cp a sparse image
        cp --sparse=always "$p" ./part2               ### of part2 onto part1
        dd bs=1kx1k count=175 </dev/zero >./zero_fill ### fill out part1 w/ zeroes
        sync; cd ..; ls -Rhls .                       ### sync, and list contents
        umount */; losetup -d "${p%p*}"               ### last umount, destroy
        rm -rf loop*p[12]/ '                          ### loop devs and mount dirs
    

    mke2fs 1.42.12 (29-Aug-2014)
    Discarding device blocks: done
    Creating filesystem with 204800 1k blocks and 51200 inodes
    Filesystem UUID: 2f8ae02f-4422-4456-9a8b-8056a40fab32
    Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    mke2fs 1.42.12 (29-Aug-2014)
    Discarding device blocks: done
    Creating filesystem with 210688 4k blocks and 52752 inodes
    Filesystem UUID: fa14171c-f591-4067-a39a-e5d0dac1b806
    Superblock backups stored on blocks:
        32768, 98304, 163840
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    175+0 records in
    175+0 records out
    183500800 bytes (184 MB) copied, 0.365576 s, 502 MB/s
    ./:
    total 1.0K
    1.0K drwxr-xr-x 3 root root 1.0K Jul 16 20:49 loop0p1
       0 drwxr-xr-x 2 root root   40 Jul 16 20:42 loop0p2
    
    ./loop0p1:
    total 176M
     12K drwx------ 2 root root  12K Jul 16 20:49 lost+found
     79K -rw-r----- 1 root root 823M Jul 16 20:49 part2
    176M -rw-r--r-- 1 root root 175M Jul 16 20:49 zero_fill
    
    ./loop0p1/lost+found:
    total 0
    
    ./loop0p2:
    total 0
    
  • 今は多くの出力があります。ほとんどは次のようになります。ただし、一番下のビットにmkfs.ext4特別な注意を払ってください。実際を見せるlsls -s-sサイズディスク上のファイル名 - 常に最初の列に表示されます。

  • これで、デフォルトでイメージを最初のパーティションに減らすことができます。

    fdisk -l img
    

    Disk img: 1 GiB, 1073741824 bytes, 2097152 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: 0xc455ed35
    
    Device Boot  Start     End Sectors  Size Id Type
    img1          2048  411647  409600  200M 83 Linux
    img2        411648 2097151 1685504  823M 83 Linux
    
  • fdisk最初のパーティションに411647 +1 512バイトのセクタがあることを知らせます。img...

    dd seek=411648 of=img </dev/null
    
  • この内容は切り捨てられます。img最初のパーティションにのみファイルを保存してください。願いより?

    ls -hls img
    

    181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 21:37 img
    
  • ...しかし、まだパーティションをマウントすることはできます...

    sudo mount "$(sudo losetup -Pf --show img)p"*1 ./mnt
    
  • ...これがその内容です...

    ls -hls ./mnt
    

    total 176M
     12K drwx------ 2 root root  12K Jul 16 21:34 lost+found
     79K -rw-r----- 1 root root 823M Jul 16 21:34 part2
    176M -rw-r--r-- 1 root root 175M Jul 16 21:34 zero_fill
    
  • そして2 番目のパーティションのストレージイメージを最初のパーティションに接続できます。

    sudo sh -c '
        dd seek=411648 if=./mnt/part2 of=img
        umount ./mnt; losetup -D
        mount "$(losetup -Pf --show img)p"*2 ./mnt
        ls ./mnt; umount ./mnt; losetup -D'
    

    1685504+0 records in
    1685504+0 records out
    862978048 bytes (863 MB) copied, 1.96805 s, 438 MB/s
    lost+found
    
  • 今私たちのimg文書:これ以上まれではありません...

    ls -hls img
    

    1004M -rw-r--r-- 1 mikeserv mikeserv 1.0G Jul 16 21:58 img
    
  • ...しかし、2番目に削除するのはもちろん、最初のように簡単です...

    dd seek=411648 of=img </dev/null
    ls -hls img
    

    181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 22:01 img
    

答え3

SDカードにコピーできるように800 MBのスペースを持つこの画像を作成しますか?しかし、画像を保存するときにスペースを無駄にしたくありません。もしそうなら、圧縮(例えばbzip

答え4

質問を正しく理解してください。

ファイルシステムとパーティションを縮小します。使用gparted

関連情報