web-dev-qa-db-ja.com

ループデバイス(ファイルを指している)で作成されたパーティションをマウントできません

ゴール

ファイルを使用してハードディスクイメージを最初から作成しようとしています。これには、MBR、パーティションテーブル、パーティションの数などが含まれます。しかし、私が作成したパーティションをLinuxにマウントさせることはできません。

編集:更新については質問の終わりを参照してください-vboxsfに関連しているようです

手順

私はこれまでに多くの異なるアプローチを試しましたが、私を最も遠ざけたものはすべて同じ場所に行き着きます。私は私の問題を説明するのに十分であるはずの以下の単純化されたバージョンを作りました

Ddを使用して空のファイルを生成します(または速度を上げるために切り捨てます)

dd if=/dev/zero of=test.img bs=1M count=150

パーティションテーブルを作成する

parted -s test.img mklabel gpt
Warning: The resulting partition is not properly aligned for best performance.

パーティションを作成します

parted -s test.img -- mkpart logical 0 5M
parted -s test.img set 1 bios_grub on
parted -s test.img -- mkpart logical 5M 50M
etc.

ループデバイスとしてマウント(max_part = 31でロードされたループモジュール)

losetup /dev/loop0 test.img

チェックするlsblk

loop0             7:0    0  150M  0 loop
├─loop0p1         7:1    0  4.8M  0 loop
├─loop0p2         7:2    0   43M  0 loop
└─loop0p3         7:3    0    4M  0 loop    

これまでのところ良い-私は推測します。パーティションをフォーマットします

mkfs.ext4 /dev/loop0p1 
mkfs.ext4 /dev/loop0p2
mkfs.ext4 /dev/loop0p3

新しいパーティションをマウントしましょう

[root@localhost vmdk test]# mount /dev/loop0p2 boot
mount: /dev/loop0p2 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'

これで終わりです-毎回。イメージが作成された直後にループにマウントして、代わりに/ dev/loop0でpartedを呼び出してみました。これにより、同じ結果が得られます。手動でオフセットを使用してlosetupを試しました。 kpartxを試しました-このポイントを超える方法がわかりません。

実際のハードドライブでもこの手順を試したことに注意してください(VMを使用していますが、意味はわかります)。この場合、まったく同じコマンドを呼び出しましたが、/代わりにdev/sdb。最後に/ dev/sdb2を問題なくマウントできました。

デバッグ情報

関連性があるかどうかはわかりませんが、ここに行きます

[root@localhost vmdk test]# uname -a
Linux localhost.localdomain 3.10.0-327.36.2.el7.x86_64 #1 SMP Mon Oct 10 23:08:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost vmdk test]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

[root@localhost vmdk test]# file test.img
test.img: x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 307199 sectors, extended partition table (last)\011, code offset 0x0

[root@localhost vmdk test]# file -s /dev/loop0
/dev/loop0: x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 307199 sectors, extended partition table (last)\011, code offset 0x0

[root@localhost vmdk test]# file -s /dev/loop0p2
/dev/loop0p2: data

[root@localhost vmdk test]# fdisk -lu /dev/loop0
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/loop0: 157 MB, 157286400 bytes, 307200 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: gpt

#         Start          End    Size  Type            Name
 1           34         9765    4.8M  BIOS boot parti logical
 2        10240        98303     43M  Microsoft basic logical
 3        98304       106495      4M  Microsoft basic logical

同じ手順を実行したときに、ループデバイスがハードドライブとまったく同じように動作しない理由がわかりません。誰かアイデアがあれば大歓迎です!

更新

偶然にも、再起動すると問題が解決するので、すぐに頭が同期しました。いくつかのテストの後、私の問題は、test.imgファイルがvboxsfマウント(ホストとVM間の共有フォルダー)に配置された場合にのみ発生するように見えます。私は実際にはこれについて何も考えていませんが、おそらくそれは奇妙な方法でファイルの書き込みをキャッシュしますか?とりあえず質問は開いたままにしておきます-誰かが詳しく説明できるかもしれません。

4
user2510141

画像ファイルが次のような奇妙なファイルシステムでホストされている場合。 vboxsfこれが問題になる可能性があります。

0
user2510141