Linux

安裝沒有分區的 SD 卡

  • August 17, 2014

我嘗試在 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,shortname=mixed,errors=remount-ro,user=vinc17)

gdisk -l /dev/mmcblk0只找到了一個 MBR 分區表,但第二個分區表與最後一個分區重疊。

該連結/dev/$disk指向整個塊設備,但是,在沒有未分配空間的分區磁碟上,唯一沒有出現的部分/dev/$disk[num]是前 2kb-4mb 左右$disk的分區表。它只是以韌體和/或作業系統可以讀取的格式寫入原始設備的一些資訊。不同的系統以不同的方式和出於不同的原因對其進行解釋。我將介紹三個。

  • 在 BIOS 系統上,該表以MBR 主引導記錄格式寫入,因此韌體可以確定在哪裡可以找到可引導的執行檔。它讀取分區表,因為為了引導 BIOS 讀取分區的前 512 個字節,該表用可引導標誌標記並執行它。這 512 個字節通常包含一個引導載入程序*(類似於grublilo在許多 linux 系統上)* ,然後連結載入位於分區上的另一個執行檔*(例如 linux 核心) ,該分區由載入程序理解的文件系統格式化。*
  • 在具有較新核心的 EFI 系統和/或 BIOS 系統上,此分區表可以是GPT GUID 分區表格式。EFI 韌體了解FAT文件系統,因此它會查找表中使用EFI 系統分區標誌描述的分區,將其掛載為 FAT,並嘗試執行儲存在其Boot0000-{GUID} NVRAM 變數中的路徑。這與 BIOS 引導載入程序設計的任務基本相同,只要您希望載入的執行檔可以由韌體解釋*(例如自 v. 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. 

這一切都取決於您在分區表中定義的佈局 - 您可以使用格式或格式等工具fdisk來執行此操作。MBR``gdisk``GPT

  • 韌體需要一個用於引導設備的分區表,但核心需要一個用於您希望它辨識文件系統的任何細分塊設備的分區表。如果磁碟是分區的,如果沒有表,核心將無法在磁碟掃描中定位超級塊。它讀取分區表並將這些偏移量映射到/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 中的核心模組並將磁碟掛載到那裡。

引用自:https://unix.stackexchange.com/questions/146724