如何从头开始创建格式化的分区映像文件?

如何从头开始创建格式化的分区映像文件?

我需要从无到有地创建只有一个分区的文件系统 ( /dev/zero)。我尝试了以下命令序列:

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

基本上,我需要创建用零填充的 64MB 图像文件。然后我fdisk为新文件系统(最终应该是 FAT32)添加一个新分区,从扇区开始2048并使用所有剩余扇区。

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

但在这里我遇到了问题。如果我设置loop设备并使用 格式化它mkfs -t vfat,分区表将被覆盖,文件系统 (FAT32) 将被放置到磁盘上。我不需要用 FAT32 格式化整个磁盘,我只需要我的主分区如此。

有谁知道如何只格式化原始磁盘映像的一个分区,而不是整个映像?

答案1

如果在 Linux 上,加载模块时,请确保向模块loop传递一个选项,以便循环设备可分区。max_part

检查当前值:

cat /sys/module/loop/parameters/max_part

如果是 0:

modprobe -r loop # unload the module
modprobe loop max_part=31

要使此设置持久存在,请将以下行添加到/etc/modprobe.conf文件中(/etc/modprobe.d如果系统上存在该目录):

options loop max_part=31

如果modprobe -r loop因为“模块循环是内置的”而失败,您需要添加loop.max_part=31到内核命令行并重新启动。如果您的引导加载程序是 Grub2,请将其添加到GRUB_CMDLINE_LINUXin的值中/etc/default/grub并使用 更新 GRUB update-grub

现在,您可以创建一个可分区的循环设备:

truncate -s 64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

使用后卸载并分离循环设备

umount /mnt
losetup -d /dev/loop0

(请注意,您需要相对较新版本的 Linux)。

答案2

losetup /dev/loop0 file -o 1048576 --sizelimit limit

指定的偏移量应以字节为单位(1048576 = 2048 个扇区 * 每个扇区 512 个字节)。

mount -o loop,offset=1048576,sizelimit=limit

欲了解更多信息,请参阅丢失设置

答案3

使用 ext4 文件系统和 GPT 分区映像的简单示例。

truncate -s 100MiB mountedImage.img

创建 GPT 表

parted mountedImage.img mklabel gpt

创建分区P1

parted mountedImage.img mkpart primary ext4 2MiB 30MiB

创建分区P2

parted mountedImage.img mkpart primary ext4 30MiB 60MiB 

创建分区P3

parted mountedImage.img mkpart primary ext4 60MiB 99MiB

假设您正在使用循环设备/dev/loop1(最好使用sudo losetup -f免费的循环设备):

losetup /dev/loop1 mountedImage.img-> 应该枚举创建设备的分区,就像/dev/loop1px每个分区x代表分区号一样。

[use] mkfs.ext4 /dev/loop1px-> 对分区号进行操作x

[and not] mkfs.ext4 /dev/loop1 -> 只会删除分区表

注意:仅当模块配置为多分区时,映像中的分区才在循环设备中可见。

请参考我的博客链接,在 Linux 中从头开始创建 GPT 分区映像,用于使用 GPT 从头开始​​创建分区映像。

答案4

以下过程允许您挂载映像的分区并对其进行修改。

losetup 2.21 -P 选项

losetup -P -f --show my.img

/dev/loopXpY每个分区创建一个。

优点:许多发行版中都预装了可执行文件(util-linux 软件包)。

缺点:这是最近的选项,Ubuntu 14.04 中不存在。

losetup -P自动化

用法:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

来源:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

克帕特克斯

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

输出:

/dev/mapper/loop0
/dev/mapper/loop0p1

loop0p1第一个分区在哪里,所以我们可以这样做:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

此方法的优点:适用于 Ubuntu 14.04,无需重新启动。

相关内容