15

I need to create filesystem with just one partition from nothing (/dev/zero). I tried this sequence of commands:

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

Basically, I need to create 64MB image file filled with zeroes. Then I use fdisk to add a new partition for new filesystem (which should finally be FAT32), starting at sector 2048 and using all remaining sectors.

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

But here I'm hitting problems. If I set up a loop device and format it using mkfs -t vfat, partition table is overwritten and filesystem (FAT32) is placed to disk. I don't need whole disk formatted with FAT32, I just need my primary partition to be so.

Does anybody know how can I format only one partition of raw disk image, not whole image?

  • Please clarify what you mean by setting up a loop device and post your entire mkfs call. I had to read your post 3 times to understand your problem. While I can't help you, I'm interessted in why you create an image file(!) but still want to leave the first n "sectors" unused. – Bananguin Aug 17 '13 at 18:57
  • Ok, edited it. I want to leave first n sectors (what's wrong with sectors?) unused, as I need to place my bootloaders somewhere. – user35443 Aug 18 '13 at 8:50
  • Crossposted – Michael Mrozek Aug 18 '13 at 16:05
  • @MichaelMrozek There are considerations that apply to some Linux distributions but not Ubuntu (it matters whether loop is a module or built into the kernel), so I think it is useful for each site to have its version of the question and I voted to reopen. – Gilles Sep 19 '13 at 9:27
  • @MichaelMrozek Personally, I feel AskUbuntu is more specific than Unix & Linux, so if a question is cross-posted to both, unless there are specific reasons to close here it's the one on AskUbuntu that should be closed as cross-posted if they were posted close in time to each other, regardless of where it was posted "first" (possibly with a mention of Ubuntu/non-Ubuntu answers here). Here it has an accepted answer, which the one on AskUbuntu does not, which strongly favors keeping this one open IMO. I don't have the rep to vote to close on AskUbuntu but am voting to reopen the question here. – a CVn Sep 19 '13 at 9:38
20

If on Linux, when loading the loop module, make sure you pass a max_part option to the module so that the loop devices are partitionable.

Check the current value:

cat /sys/module/loop/parameters/max_part

If it's 0:

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

To make this setting persistent, add the following line to /etc/modprobe.conf or to a file in /etc/modprobe.d if that directory exists on your system:

options loop max_part=31

If modprobe -r loop fails because “Module loop is builtin”, you'll need to add loop.max_part=31 to your kernel command line and reboot. If your bootloader is Grub2, add to it to the value of GRUB_CMDLINE_LINUX in etc/default/grub.

Now, you can create a partitionable loop device:

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/

(note that you need a relatively recent version of Linux).

  • FATAL: Module loop is builtin, can this be solved installing lastest version of ubuntu (I have 12.04)? – user35443 Aug 18 '13 at 9:17
  • If is builtin just no needed to modprobe, pass the loop.max_part=31 to the kernel command line – Alex Aug 18 '13 at 9:26
  • 1
    Ah I see, if you've a recent kernel and you pass the max_part the offset and the sizelimit aren't needed at all – Alex Aug 18 '13 at 9:32
  • Hmm, kernel command line, too difficult for me. Still thanks, accept. – user35443 Aug 18 '13 at 10:01
  • Is it loop.maxpart=31 or loop.max_part=31 on the kernel command line? – Cristian Ciupitu Oct 4 '14 at 16:49
3

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

Offset specified should be in bytes (1048576 = 2048 sectors * 512 bytes per sector).

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

For more information see losetup and mount.

  • Hmm, offset, this should work. And what if I had more partitions on it? – user35443 Aug 18 '13 at 8:58
  • I guess one loop = one partition = one offset. – Alex Aug 18 '13 at 9:02
  • uhm, and is there an option to specify also the size, so I could limit it and place there more partitions? – user35443 Aug 18 '13 at 9:04
  • Sorry my fault to create a new answer with a partial solution, the right answer is from @"Stephane Chazelas", he can just add the offset and sizelimit options (then I'll delete mine) – Alex Aug 18 '13 at 9:20
  • No let it be here, or mine +1 will go nowhere. – user35443 Aug 18 '13 at 9:23
2

The following procedures allow you to mount the partitions of the image to modify them.

losetup 2.21 -P option

losetup -P -f --show my.img

Creates one /dev/loopXpY per partition.

Advantage: executable pre-installed in many distros (util-linux package).

Disadvantage: quite recent option, not present in Ubuntu 14.04.

losetup -P automation

Usage:

$ 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

Source:

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

Output:

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

where loop0p1 is the first partition, so we can do:

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

Advantage of this method: works on Ubuntu 14.04 without rebooting.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.