web-dev-qa-db-ja.com

SDカードなしでSDカードイメージを構築するにはどうすればよいですか?

SDカードにDebian Jesseの埋め込みインストールを構築するスクリプトプロセスがあります。スクリプトの関連部分は次のようになります。

export DISK=/dev/sdb
umount ${DISK}1   # make sure no partitions mounted at the moment
umount ${DISK}2   # ditto
dd if=/dev/zero of=${DISK} bs=1M count=16   # zero partition table zone, overkill
sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__    # make partitions
    1,48,0xE,*
    ,,,-
__EOF__

mkfs.vfat -F 16 ${DISK}1 -n boot    # install file systems
mkfs.ext4 ${DISK}2 -L rootfs

その後、オートマウンターが起動してSDカードを再マウントするように見えるので、次のようなことができます。

cp -v ${DIR}/u-boot/spl/u-boot-spl.bin /media/$username/boot/BOOT.BIN
cp -v ${DIR}/u-boot/u-boot.img /media/$username/boot/
cp -v ${DIR}/u-boot/uEnv.txt /media/$username/boot/
rsync -axHAX --progress ${DIR}/jessieRoot/ /media/$username/rootfs/

そのうちの1人がそれを行った後、ddを使用してカードの内容をコピーし、相互に共有して、ddを使用してさらにSDカードを作成できます。

これに伴う問題は2つあります:1)現在Ubuntu /マシンに非常に固有です(カードがsdbにあると仮定します。2)実際のカードが必要なので、ビルドマシンには適していません。

カードなしで上記を行う方法はありますか?

ddを使用して8Gファイルを作成し、その上でsfdiskを実行してみました(すべてがファイルですよね?)。その部分は機能しました。しかし、mkfsパーツをどのように実行して機能させるかは明確ではありません。パーティションテーブルが埋め込まれている単一ファイルのサブ領域ではなく、ブロックデバイスファイルで機能したいと考えているようです。そして、私はそれをマウントする問題があります。 mount -o loopの呪文を使用していると思いますが、仮想イメージファイルのサブ領域でそれを行う方法がわからないため、常に.isoファイルを使用しています。

(私は(明らかに)この種のものの専門家ではありません。私はそれのいくつかを手に入れます、そして他の部分は少し魔法のようです...)

2
Travis Griggs

このページ 必要なものはすべて揃っていると思います。

  • sdbの代わりにループバックデバイスを利用する

  • 実際のカードの代わりに仮想ファイルシステムを利用する

  • ddを使用して仮想ファイルシステム用のファイルを作成することは正しい方向に進んでいます。

  • ループバックデバイスを使用して正しい方向に進んでいます。トリックは、パーティションがあるオフセットにループバックデバイスをマウントすることです。

これが記事です。

仮想ファイルシステムは、ファイル内に存在するファイルシステムであり、ファイルは物理ディスク上に存在します。仮想ファイルシステムでできることはたくさんあります。私がそれらをいじった理由は、Linuxホスト上に仮想マシンを構成するためでした。その他の用途には、ディスク全体を暗号化せずにファイルシステムを暗号化することが含まれます。 Mac OSXのFileVaultは、この方法でユーザーのホームディレクトリを暗号化します。たぶん、あなたは先に進んで自分自身を1つの巨大なパーティションにし、それから何らかの理由で複数のパーティションが必要だと気づきました!仮想ファイルシステムは、それにも(ある程度)役立ちます。

では、どのようにして仮想ファイルシステムを作成しますか?簡単。最初に行う必要があるのは、ファイルシステムが存在するファイルを作成することです。ここから「dd」が入り始めます。たとえば、次のコマンドについて考えてみます。

dd if =/dev/zero of =〜/ myFileSystem.img bs = 1024 count = 1048576

このコマンドは、/ dev/zeroから1,048,576ブロックを読み取り、それらを〜/ myFileSystem.imgに書き込みます。各ブロックは1024バイトであるため、すべてゼロを含む1ギガバイトのファイルになります。ブロックサイズ(bs)とカウントに使用する実際の値はそれほど重要ではありません。重要なのは、計算を正しく行うことです:bs * count = imageSize。

これでファイルができました。すごい。ファイルシステムを作る時が来ました!この部分はさらに簡単です...次のコマンドを使用して、EXT2ファイルシステムを作成します。

mke2fs myFileSystem.img

MyFileSystem.imgはブロックデバイスではないという警告プロンプトが表示される場合があります。続行しますか?すぐにわかります。とりあえず、「はい」と言ってください。すべてがスムーズに進むはずです。実際のディスクドライブにファイルシステムを作成したかのように見えます。これで仮想ファイルシステムができました!あとは、ファイルシステムをマウントしてアクセスできるようにするだけです...

mkdir/mnt/virtual

mount -o loop〜/myFileSystem.img/mnt/virtual

これで、/ mnt/virtualに配置したファイルは、実際にはmyFileSystem.imgに直接配置されます。簡単ではなかったですか?

素晴らしい。仮想filesytsemを作成する方法がわかったので、しばらくの間仮想ディスクイメージを作成してみませんか?あなたが尋ねる違いは何ですか?ディスクイメージには、いくつかのパーティションを定義するパーティションテーブルがあり、各パーティションには独自のファイルシステムが含まれています。したがって、仮想ファイルシステムは本質的に仮想ディスクイメージの「仮想パーティション」です。仮想ディスクイメージには、複数の仮想ファイルシステムと、各パーティションの境界がどこにあるかを説明する仮想パーティションテーブルが含まれています。

仮想ディスクイメージの作成は同じように始まります。最初に必要なのは、上で作成した大きな空のファイルです。ただし、今回は、ファイルシステムを作成する代わりに、fdiskを使用してファイルをパーティション分割する必要があります。ただし、状況を少し良くするために、ループバックデバイスをミックスに投入します。カーネルでループバックデバイスのサポートが有効になっていることを確認する必要があります(ほとんどのディストリビューションはデフォルトで有効になっていますが、Linuxジャンキーをコンパイルするカーネルの場合は、確認することをお勧めします)。したがって、次のように、大きなファイルを作成し、それをループバックデバイスに添付します。

dd if =/dev/zero of =〜/ myDisk.img bs = 1024 count = 1048576

losetup /dev/loop0〜/myDisk.img

ディスクイメージをループバックデバイスにアタッチすることにより、〜/ myDisk.imgを使用するのと同じ方法で/ dev/loop0を使用できます。主な違いは、/ dev/loop0が「ブロックデバイス」と呼ばれるものであるということです。正確に何が得られるかを私が知っている以上の経験を持つ人に尋ねる必要がありますが、私が知っていることは、ファイルシステムユーティリティはフラットファイルよりもブロックデバイスでうまく機能するということです。さらに、それは楽しいです。

ループバックデバイス(/ dev/loop0)に大きな空のファイルが添付されています...ディスクイメージにパーティションを作成するときが来ました。これを行うには、ループバックデバイスでfdiskを実行します。

fdisk/dev/loop0

3つのパーティションを作成しましょう...これをフォローしている場合は、すでにfdiskに精通しているはずなので、先に進んで次を作成してください。

/ dev/loop0p1 1 17 136521 83 Linux

/ dev/loop0p2 18 80 506047+ 82Linuxスワップ

/ dev/loop0p3 81130 401625 83 Linux

パーティションを作成したら、変更を書き込んでfdiskを終了します。次に行う必要があるのは、各パーティションにファイルシステムを作成することです。それが仮想ファイルシステムでどれほど簡単に戻ったか覚えていますか?もうそんなに多くはありません...

ただし、慌てる必要はありません...問題は、「mkfs」が仮想ディスクイメージに「到達」して、個々のパーティション上にファイルシステムを作成できないことです。実際、試してみると、仮想ディスクイメージをワイプして、fdiskを再実行する必要が生じる可能性があります。だから何をすべきか...何をすべきか?救助のためのループバックデバイス。ここでは、ループバックデバイスをmyDisk.imgファイルの各パーティションが始まる特定のオフセットに接続します。

次に、ブロックの観点からパーティションを確認すると便利です。次のコマンドを実行します。

fdisk -ul/dev/loop0

(うまくいけば正確に)次のようになります:

ディスク/ dev/loop0:1073 MB、1073741824バイト

255ヘッド、63セクター/トラック、130シリンダー、合計2097152セクター

単位= 1のセクター* 512 = 512バイト

  Device Boot      Start         End      Blocks   Id  System

/ dev/loop0p1 63 273104 136521 83 Linux

/ dev/loop0p2 273105 1285199 506047+ 82Linuxスワップ

/ dev/loop0p3 1285200 2088449 401625 83 Linux

これらの数値は計算にとって重要です...以前と同じようにlosetupコマンドを使用しますが、今回は3つのパーティションのそれぞれの先頭に到達します。 losetupは、ファイルの先頭でスキップするバイト数としてオフセットを取ります。 fdisk -ul/dev/loop0からの出力は、最初のパーティションがブロック63で始まり、各ブロックが512バイトであることを示しています。したがって、パーティション1はバイト32,256から始まります

losetup -o 32256/dev/loop1/dev/loop0

そのコマンドは/ dev/loop0に32,256バイトに達し、/ dev/loop1にマウントします。/dev/loop0がmyDisk.imgファイルに添付されているため、これはそのファイルに32,256バイトに到達するのと同じであることを覚えておいてください...フォローしますか?ようし。いいぞ。パーティション2と3についても同じロジック。

losetup -o 139829760/dev/loop2/dev/loop0

losetup -o 658022400/dev/loop3/dev/loop0

これで、4つのループバックデバイスがセットアップされました。/dev/loop0はmyDisk.imgファイルに添付されます。/dev/loop1は、/ dev/loop0で表される仮想ディスクの最初のパーティションです。/dev/loop2は2番目で、/ dev/loop3は3番目です。

いよいよこれらのファイルシステムを作成する時が来ました!これは、通常のファイルシステムを作成するのと同じくらい簡単です。これが私たちが行っているすべてだからです。 mkfsは、デバイスが物理デバイスではないことを認識していないことを忘れないでください。パーティション1用のext2ファイルシステム、パーティション2用のスワップファイルシステム、パーティション3用のXFSファイルシステムの3種類のファイルシステムを作成します。

mkfs/dev/loop1

mkswap/dev/loop2

mkfs.xfs/dev/loop3

Loop1、loop2、およびloop3はloop0に直接関連付けられており、loop0は〜/ myDisk.imgであるため、loop1、loop2、およびloop3に対して行ったすべての操作がmyDisk.imgに直接影響します。これで、たとえば/ dev/loop3をXFSファイルシステムとして/ mnt/virtualにマウントし、通常のファイルシステムとして使用できるようになりました。

ですから、お役に立てば幸いです...仮想ファイルシステムと仮想ディスクイメージを使って、かなりきちんとしたことができます。ループバックデバイスは、物事をスムーズにするための違いの世界を作ります。

4
f01

この問題に対する受け入れられた答えは事実上正しいですが、私がこれを書いているように5年後-ほとんどの人にとってうまくいくはずのより単純なアプローチがあります。オフセットを手動でジャグリングし、複数のループバックデバイスを作成することは、一般に、もはや必要ありません。最近のほとんどのLinuxディストリビューションで仮想ファイルシステムイメージを作成するための「秘密兵器」は、 losetupコマンド-Pオプションです。

-P, --partscan
              Force the kernel to scan the partition table on a newly created loop device.

基本的に、-Pは「このファイルがディスクのふりをする」オプションと考えることができます。例はこれを明確にする必要があります。このコマンドは、ゼロで満たされた4GBの画像ファイルを作成します。

$ dd if=/dev/zero of=./sdcard.img bs=1024 count=4194304
4194304+0 records in
4194304+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 39.7914 s, 108 MB/s

次のコマンドは、最初に使用可能なループバックデバイスをこのファイルにマップし、カーネルが最初のバイトをパーティションテーブルとして解釈するようにマップします。 :

$ Sudo losetup -fP ./sdcard.img

$ losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /home/evadeflow/Desktop/sdcard.img

小さなことのように思えるかもしれませんが、-Pを渡すと、fdiskなどのツールを使用して、/dev/loop0を介してマップされた「ディスク」をパーティション分割できるようになります。ここでは、最初に128 MBのパーティションを作成し、残りのすべてのスペースを格納するために2番目のパーティションを作成します。

$ Sudo fdisk /dev/loop0
GNU Fdisk 1.3.0a
Copyright (C) 1998 - 2006 Free Software Foundation, Inc.
...
Using /dev/loop0
Command (m for help): p

Disk /dev/loop0: 4 GB, 4293596160 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

     Device Boot      Start         End      Blocks   Id  System
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 0cyl):
Last cylinder or +size or +sizeMB or +sizeKB  (default 521cyl): +128M
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 15cyl):
Last cylinder or +size or +sizeMB or +sizeKB  (default 521cyl):
Command (m for help): p

Disk /dev/loop0: 4 GB, 4293596160 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

     Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1          16      128488   83  Linux
Warning: Partition 1 does not end on cylinder boundary.
/dev/loop0p2              16         522     4064445   83  Linux
Command (m for help): w
Information: Don't forget to update /etc/fstab, if necessary.


Writing all changes to /dev/loop0.

Linuxは、/dev/loop0p1/dev/loop0p2の2つのパーティションのそれぞれに対してユーザーに代わって新しいループバックデバイスを作成したことに注意してください。 lsblkを実行すると、/dev/loopとの関係を確認できます。

$ lsblk /dev/loop0
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0       7:0    0     4G  0 loop
├─loop0p1 259:2    0 122.1M  0 loop
└─loop0p2 259:3    0   3.9G  0 loop

これらのパーティションにデータを取り込むには、ループバックデバイス/dev/loop0p1および/dev/loop0p2を使用してファイルシステムを作成し、それらを単純にmountして、コピーします。マウントポイントにファイルします。プロセスは次のようになります。

$ Sudo mkfs.ext4 /dev/loop0p1
$ Sudo mkfs.ext4 /dev/loop0p2
$ mkdir part1-stuff part2-stuff
$ Sudo mount /dev/loop0p1 ./part1-stuff
$ Sudo mount /dev/loop0p2 ./part2-stuff
$ cp /stuff-source/part1/* ./part1-stuff
$ cp /stuff-source/part2/* ./part2-stuff
$ Sudo umount ./part1-stuff
$ Sudo umount ./part2-stuff

パーティションが希望どおりに表示されたら、次のコマンドを使用してファイルから/dev/loop0を「デタッチ」します。

$ Sudo losetup -d /dev/loop0

これにより、Linuxが作成した/dev/loop0p1および/dev/loop0p2デバイスも切り離されることに注意してください。

したがって、受け入れられた答えはすべて100%正しいままであり、内部で何が起こっているかについての貴重な洞察を提供します。ただし、ディストリビューションのlosetup-Pオプションをサポートしている場合は、標準のパーティショニングツールを使用して、Linuxに作成(および削除を処理させることができます。 -))各パーティションのループ「サブデバイス」の。

1
evadeflow