使用具有大量分区的 GPT 磁盘时如何挂载 /dev/sda15 以外的分区

使用具有大量分区的 GPT 磁盘时如何挂载 /dev/sda15 以外的分区

我有一个 GPT 磁盘,其中大约有 20 个分区。

它们位于 /dev/sda

我如何才能同时安装这些?据我所知,/dev/sda 限制在 /dev/sda15

这感觉很奇怪 - 能够创建无法安装的东西?我遗漏了什么吗?

答案1

这是因为 Linux 的 SATA 支持基于其 SCSI 硬盘子系统。每个 SCSI 设备最多可有 15 个分区。请参阅Linux 内核源代码的描述:

8 block SCSI disk devices (0-15)
          0 = /dev/sda      First SCSI disk whole disk
         16 = /dev/sdb      Second SCSI disk whole disk
         32 = /dev/sdc      Third SCSI disk whole disk
            ...
        240 = /dev/sdp      Sixteenth SCSI disk whole disk

        Partitions are handled in the same way as for IDE
        disks (see major number 3) except that the limit on
        partitions is 15.

文章中提到了有关这是 SCSI 约定的一些内容:

不带尾数的名称表示整个磁盘,而带尾数的名称表示整个磁盘的一个分区。按照惯例,SCSI 磁盘最多有 16 个次要编号映射到单个磁盘。因此,对于每个整个磁盘,每个磁盘最多有 15 个分区,因为一个次要编号用于描述整个磁盘(例如 /dev/sda),而其他 15 个次要编号用于引用该磁盘的分区(例如 /dev/sda1、/dev/sda2 等)。以下示例显示整个磁盘 /dev/sda 的设备文件(其主编号为 8,次要编号为 0)及其 15 个分区。

如果你需要更深入的答案,网上有很多文章讨论这个问题为什么您问题的一部分。

至少有两种方法可以解决这一限制。

偏移安装

这是通过offset=mount命令添加选项来实现的。可以通过将扇区大小和要挂载的分区的起始字节相乘来获得该选项所需的值。这两个值都可以在 的输出中找到fdisk -lu /dev/sdX。例如:

fdisk -lu /dev/sda
Disk /dev/sda: [..]
[..]
Units = sectors of 1 * 512 = 512 bytes
[..]

   Device Boot      Start         End      Blocks   Id  System
[..]
/dev/sda18      232421376   254679039    11128832   83  Linux
/dev/sda19      200783872   232419327    15817728   83  Linux

# Mount /dev/sda18 to /media/somedir1
mount -o rw,offset=$((512*232421376)),defaults /dev/sda /media/somedir1

# Mount /dev/sda19 to /media/somedir2
mount -o rw,offset=$((512*200783872)),defaults /dev/sda /media/somedir2

请注意,我用/dev/sda代替/dev/sda18/dev/sda19

使用 LVM

另一个选择是使用 LVM。但是,这可能需要进行一些文件重组,因此可能很耗时。最重要的是,LVM 卷可能很难从其他操作系统(例如 Lion 之前的 OS X 和 Windows)访问,因此它可能不适合您的需求。这里和其他地方有很多关于 LVM 的帖子,所以我不会在这里介绍如何设置它。

答案2

您使用的是什么发行版?您描述的限制存在于非常老的内核中,但大多数发行版早已通过 udev 配置或其他方式解决了该问题 —— 说实话,我不记得具体是如何解决的。我刚刚检查了一下,我的 Ubuntu 14.04 安装可以毫无问题地处理具有 20 个 GPT 分区的 USB 闪存驱动器:

$ ls -l /dev/sdd*
brw-rw---- 1 root disk   8, 48 Jul 23 19:16 /dev/sdd
brw-rw---- 1 root disk   8, 49 Jul 23 19:16 /dev/sdd1
brw-rw---- 1 root disk   8, 58 Jul 23 19:16 /dev/sdd10
brw-rw---- 1 root disk   8, 59 Jul 23 19:16 /dev/sdd11
brw-rw---- 1 root disk   8, 60 Jul 23 19:16 /dev/sdd12
brw-rw---- 1 root disk   8, 61 Jul 23 19:16 /dev/sdd13
brw-rw---- 1 root disk   8, 62 Jul 23 19:16 /dev/sdd14
brw-rw---- 1 root disk   8, 63 Jul 23 19:16 /dev/sdd15
brw-rw---- 1 root disk 259,  0 Jul 23 19:16 /dev/sdd16
brw-rw---- 1 root disk 259,  1 Jul 23 19:16 /dev/sdd17
brw-rw---- 1 root disk 259,  2 Jul 23 19:16 /dev/sdd18
brw-rw---- 1 root disk 259,  3 Jul 23 19:16 /dev/sdd19
brw-rw---- 1 root disk   8, 50 Jul 23 19:16 /dev/sdd2
brw-rw---- 1 root disk 259,  4 Jul 23 19:16 /dev/sdd20
brw-rw---- 1 root disk   8, 51 Jul 23 19:16 /dev/sdd3
brw-rw---- 1 root disk   8, 52 Jul 23 19:16 /dev/sdd4
brw-rw---- 1 root disk   8, 53 Jul 23 19:16 /dev/sdd5
brw-rw---- 1 root disk   8, 54 Jul 23 19:16 /dev/sdd6
brw-rw---- 1 root disk   8, 55 Jul 23 19:16 /dev/sdd7
brw-rw---- 1 root disk   8, 56 Jul 23 19:16 /dev/sdd8
brw-rw---- 1 root disk   8, 57 Jul 23 19:16 /dev/sdd9

Fedora 20 也能很好地处理这个问题,尽管设备编号不同。这两个操作系统都允许我访问第 20 个分区。(我没有尝试访问每个分区,只是访问了编号最高的分区作为概念验证。)

因此,如果您遇到此问题,我建议您在特定于发行版的论坛上提问,或者至少发布您正在使用的发行版的名称。调整内核和/或 udev 配置可能会有所帮助,但恐怕我不记得如何解决此问题的细节——正如我所说,修复已经“存在”很长时间了,我已经忘记如何手动完成。

相关内容