在Linux中没有分区表的情况下手动挂载分区

在Linux中没有分区表的情况下手动挂载分区

我正在尝试使用分区表以编程方式在 Linux 中挂载分区表。

这是我到目前为止所做的,看看是否可以使用 losetup 在备份中安装损坏驱动器(已删除分区表)的分区。我假设我能够在这里找到开始和结束扇区。

我使用以下命令创建了一个包含 2 个分区的新文件

sudo dd if=/dev/zero of=backup.img bs=1M count=100

sudo fdisk backup.img并分为backup.img两个分区,之后sudo fdisk -lu backup.img显示如下

Device   Boot  Start   End   Sectors   Size Id   Type
backup.img1       2048  104447  102400    50M 83   Linux
backup.img2     104448  204799  100352    49M 83   Linux

这里的分区是ext3ext4分区,因为我只是测试是否可以使用不存在的分区表挂载分区losetup

然后我尝试了这个

sudo losetup -r -o 1048576 /dev/loop0 backup.img有效,之后我可以做sudo mount /dev/loop0 /mnt/test

但是,我假设我有一个没有分区表的原始映像,因此我必须手动提供分区表。另外,我不想弄乱现有的备份,因为它可能会进一步损坏磁盘。

sudo losetup -o 1048576 --sizelimit 52428288 /dev/loop0 backup.img作品。

但是,当我尝试使用安装循环设备时

sudo mount /dev/loop0 /mnt/test,它没有说

mount: /mnt/test: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program or other error

当我提供大小限制时,为什么losetup无法识别分区?

我在这里缺少什么吗?

答案1

理论上,您用来设置循环设备的命令没有任何问题。我在构建脚本中使用类似的东西来生成图像。

我的猜测是您不小心错误地格式化了测试图像,也许您使 ext 文件系统比应有的大。

循环设备只是指向文件的一部分的块设备,它们对分区表一无所知。同样,分区只不过是磁盘上的一个部分,其中有一个表条目描述它们在磁盘上的位置。

获取分区块设备的最简单方法是使用分区表应该存在于任何磁盘上。

如果镜像已经有分区表,你实际上可以要求 Linux 为你添加循环分区:

loop_device=$(losetup --show -f my image.img)
partx -a $loop_device

这将创建一组设备,例如/dev/loop2 /dev/loop2p1 /dev/loop2p2.这可以避免您乱七八糟地计算偏移量。

答案2

你不需要sudo在你的dd命令中,以下就可以了:

dd if=/dev/zero of=backup.img bs=1M count=100

同样,要在其中创建/编辑分区表,您不需要sudo

$ gdisk backup.img 
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-204766, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-204766, default = 204766) or {+-}size{KMGTP}: 102400
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8300
Changed type of partition to 'Linux filesystem'

Command (? for help): c
Using 1
Enter name: Test_1

Command (? for help): n
Partition number (2-128, default 2):  
First sector (34-204766, default = 104448) or {+-}size{KMGTP}: 
Last sector (104448-204766, default = 204766) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): c
Partition number (1-2): 2
Enter name: Test_2

Command (? for help): p
Disk backup.img: 204800 sectors, 100.0 MiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 61A000F6-7F51-4615-B1B6-82D4C9E305B3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 204766
Partitions will be aligned on 2048-sector boundaries
Total free space is 4061 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          102400   49.0 MiB    8300  Test_1
   2          104448          204766   49.0 MiB    8300  Test_2

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to backup.img.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

显示分区表也是如此,没有sudo

$ fdisk -l backup.img 
Disk backup.img: 100 MiB, 104857600 bytes, 204800 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
Disklabel type: gpt
Disk identifier: 61A000F6-7F51-4615-B1B6-82D4C9E305B3

Device       Start    End Sectors Size Type
backup.img1   2048 102400  100353  49M Linux filesystem
backup.img2 104448 204766  100319  49M Linux filesystem

现在您想要在这些分区上创建一些文件系统,好吧,让我创建两个ext4文件系统类型,我认为此时并不重要。

$ sudo kpartx -a backup.img

$ losetup --list | grep backup.img
/dev/loop19         0      0         0  0 /home/vlastimil/partition-experiments/backup.img       0     512

$ sudo mkfs.ext4 -L Test_ext4_1 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/mapper/loop19p1 
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 12544 4k blocks and 12544 inodes

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

# The same command for /dev/mapper/loop19p2

之后,我的意思是在创建磁盘映像后,我始终使用扇区乘以来安装它,但正如我们kpartx上面使用的那样,它将其简化为:

$ mkdir mntpoint
$ sudo mount /dev/mapper/loop19p1 mntpoint1/
$ sudo mount /dev/mapper/loop19p2 mntpoint2/

现在,您应该安装两个分区。

相关内容