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


16

我需要创建一个只有一个分区的文件系统(无内容)(/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格式化的整个磁盘,只需要我的主分区即可。

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


请通过设置循环设备来阐明您的意思,然后发布整个mkfs通话。我必须阅读您的帖子3次才能了解您的问题。尽管我无能为力,但我对您为什么创建图像文件(!)感兴趣,但仍然想保留前n个“扇区”未使用。
Bananguin

好的,对其进行编辑。我想保留前n个扇区(扇区出了什么问题?)未使用,因为我需要将Bootloader放在某个地方。
user35443


@MichaelMrozek有一些注意事项适用于某些Linux发行版,但不适用于Ubuntu(这loop是模块还是内置在内核中很重要),因此我认为对于每个站点都有其问题的版本非常有用,我投票决定重新开放。
吉尔(Gilles)“所以,别再邪恶了”

@MichaelMrozek就我个人而言,我认为AskUbuntu比Unix和Linux更具体,因此如果一个问题都交叉发布到这两个问题上,除非有特定的原因要关闭,除非是因为这些原因,AskUbuntu上的那个问题应该交叉发布才能关闭。发布时间彼此接近,无论发布位置是“第一”(可能在此处提到Ubuntu / non-Ubuntu答案)。在这里,它有一个可以接受的答案,而AskUbuntu上的答案是没有的,因此强烈赞成将其保持为开放状态。我没有众议员投票要求在AskUbuntu上关闭,但正在投票以在此处重新提问。
CVn

Answers:


20

如果在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

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

truncate -s64M 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/

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


致命:内置模块循环,安装最新版本的ubuntu(我有12.04)可以解决吗?
user35443

如果是内置的,则不需要modprobe,请将传递loop.max_part=31给内核命令行
Alex

1
嗯,我知道,如果您使用的是最新内核,则完全不需要max_part偏移量和sizelimit
Alex

嗯,内核命令行,对我来说太难了。还是谢谢,接受。
user35443

loop.maxpart=31还是loop.max_part=31在内核命令行上?
Cristian Ciupitu 2014年

4

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

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

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

有关更多信息,请参见lostupmount


嗯,偏移量,这应该工作。如果我有更多分区该怎么办?
user35443

我猜一个循环=一个分区=一个偏移量。
亚历克斯

嗯,是否也可以指定大小,所以我可以限制它并在其中放置更多分区?
user35443

对不起,我用部分解决方案创建了一个新答案,正确的答案来自@“ Stephane Chazelas”,他只需添加offset和sizelimit选项(然后我将删除我的选项)
Alex

不要让它在这里,否则我的+1将无处可去。
user35443

2

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

losttup 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"
)

kpartx

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上运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.