挂载不带分区的SD卡

挂载不带分区的SD卡

我尝试在 GNU/Linux 下安装 SDHC 卡。与通常发生的情况不同,/var/log/syslog没有提及sdb1,只是:

Jul 26 16:07:53 xvii kernel: [  159.404842] scsi 6:0:0:0: Direct-Access     Singim   SD Card   MMC/SD 1.4F PQ: 0 ANSI: 0 CCS
Jul 26 16:07:53 xvii kernel: [  159.405115] sd 6:0:0:0: Attached scsi generic sg2 type 0
Jul 26 16:08:01 xvii kernel: [  168.239600] sd 6:0:0:0: [sdb] Attached SCSI removable disk

而且fdisk -l /dev/sdb什么也不输出。我应该怎么办?

编辑(2014-07-27):我可以再次使用这张 SD 卡,但它似乎有问题。昨天我用USB读卡器尝试了一下。今天,我直接将其放入笔记本电脑的 SD 插槽中进行尝试,结果出现了数千个 I/O 错误:

Jul 27 11:56:35 xvii kernel: [ 8091.317234] mmc0: new high speed SDHC card at address 1234
Jul 27 11:56:35 xvii kernel: [ 8091.317477] mmcblk0: mmc0:1234 SA04G 3.68 GiB
Jul 27 11:56:35 xvii kernel: [ 8091.320119] mmc0: Got data interrupt 0x00200000 even though no data operation was in progress.
Jul 27 11:56:35 xvii kernel: [ 8091.322277] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00
Jul 27 11:56:35 xvii kernel: [ 8091.322289] mmcblk0: retrying using single block read
Jul 27 11:56:35 xvii kernel: [ 8091.324862] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
Jul 27 11:56:35 xvii kernel: [ 8091.324872] end_request: I/O error, dev mmcblk0, sector 0
Jul 27 11:56:35 xvii kernel: [ 8091.326398] mmcblk0: error -84 transferring data, sector 1, nr 7, cmd response 0x900, card status 0x0
Jul 27 11:56:35 xvii kernel: [ 8091.326405] end_request: I/O error, dev mmcblk0, sector 1
Jul 27 11:56:35 xvii kernel: [ 8091.329056] mmcblk0: error -84 transferring data, sector 2, nr 6, cmd response 0x900, card status 0x0
[...]

gdisk -l没有找到任何分区表,并lsblk输出有关该卡的信息:

mmcblk0                  179:0    0   3.7G  0 disk

稍后我再次尝试,卡被识别了:

Jul 27 12:08:00 xvii kernel: [ 8776.617712] mmc0: new high speed SDHC card at address 1234
Jul 27 12:08:00 xvii kernel: [ 8776.618117] mmcblk0: mmc0:1234 SA04G 3.68 GiB
Jul 27 12:08:00 xvii kernel: [ 8776.620324]  mmcblk0: p1

我可以安装它: /dev/mmcblk0p1 on /media/mmc type vfat (rw,nosuid,nodev,noexec,noatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset= utf8,短名称=混合,错误=重新安装-ro,用户=vinc17)

gdisk -l /dev/mmcblk0发现只有一个MBR分区表,但第二个分区表与最后一个分区重叠。

答案1

该链接/dev/$disk指向整个块设备,但是,在没有未分配空间的分区磁盘上,唯一未在其中表示的部分/dev/$disk[num]是第一个 2kb-4mb 左右$disk的分区表。它只是以固件和/或操作系统可以读取的格式写入原始设备的一些信息。不同的系统以不同的方式和不同的原因解释它。我将介绍三个。

  • 在 BIOS 系统上,该表写在MBR 主引导记录格式,以便固件能够找出在哪里可以找到可启动的可执行文件。它读取分区表,因为为了引导 BIOS 会读取分区表的前 512 个字节,该表用可启动的标记并执行它。这 512 字节通常包含引导加载程序(就像grublilo在很多Linux系统上)然后链式加载另一个可执行文件(如linux内核)位于使用加载程序理解的文件系统格式化的分区上。

  • 在具有较新内核的 EFI 系统和/或 BIOS 系统上,此分区表可以是GPT GUID分区表格式。 EFI 固件了解胖的文件系统,因此它会查找表描述的分区EFI系统分区标志,将其挂载为 FAT,并尝试执行存储在其中的路径Boot0000-{GUID}NVRAM 变量。这本质上与 BIOS 引导加载程序的设计任务相同,并且只要固件可以解释您希望加载的可执行文件(例如自 3.3 版以来的大多数 Linux 内核),避免使用它们。 EFI 固件稍微复杂一些。

启动后,如果存在分区表并且内核理解它,/dev/${disk}1则会映射到4mb+偏移量并在分区表所说的位置结束。分区实际上只是任意的逻辑分隔符,例如:

start of disk | partition table | partition 1 | ... and so on | end of disk

虽然我想也可能是:

s.o.d. | p.t. | --- unallocated raw space --- | partition 1 | ... | e.o.d. 

这完全取决于您在分区表中定义的布局 - 您可以使用fdiskfor MBRFormats 或gdiskfor GPTFormats 等工具来完成此操作。

  • 固件需要一个用于引导设备的分区表,但内核需要一个用于您希望其识别文件系统的任何细分块设备的分区表。如果磁盘已分区,没有表,内核将无法定位超级块在磁盘扫描中。它读取分区表并将这些偏移量映射到/dev/$disk[num].在每个分区的开头,它会查找超级块。这只是几kb的数据(如果说)它告诉内核它是什么类型的文件系统。一个强大的文件系统将分发其备份超级块整个分区。如果分区不包含可读的超级块内核理解内核根本无法识别那里的文件系统。

无论如何,重点是您实际上并不需要在任何不需要由固件解释的磁盘上使用这些表 - 例如在您不从中启动的磁盘上(这也是唯一可行的GPT+BIOS情况)- 并且您只需要一个文件系统。/dev/$disk可以使用您喜欢的任何文件系统进行整体格式化。如果您愿意,您可以mkfs.fat /dev/$disk一整天 - 并且 Windows 可能无论如何都会这样做,因为它通常对它标记的设备类型进行操作可拆卸的旗帜。

换句话说,完全可以将文件系统超级块在磁盘的头部而不是分区表的头部,在这种情况下,只要内核理解文件系统,您就可以:

mount /dev/$disk /path/to/mount/point

但是,如果您想要分区并且它们尚不存在,那么您需要创建它们 - 意味着编写一个将它们的位置映射到磁盘头的表 - 使用类似fdiskgdisk如上所述的工具。

所有这些加在一起让我认为你的问题是以下三个问题之一:

  • 你的磁盘没有分区表,也没有文件系统

    • 它最近被擦除、从未使用过或以其他方式损坏。
  • 您的操作系统内核无法识别您的磁盘分区表

    • BIOS 和 EFI 并不是唯一的固件类型。在移动/嵌入式领域尤其如此,SDHC 卡可能特别有用,尽管许多此类设备使用不太复杂的文件系统层,模糊了文件系统和分区表之间的界限。
  • 您的磁盘没有分区表,并且使用操作系统内核无法识别的文件系统进行格式化

重读您上面的评论后,我相当确定是后一种情况。我建议你获取该电视的手册,尝试找出是否可以将其使用的任何文件系统加载为桌面 Linux 中的内核模块,并将磁盘安装在那里。

相关内容