I try to mount a SDHC card under GNU/Linux. Unlike what happens usually, /var/log/syslog
doesn't mention sdb1
, just:
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
Moreover fdisk -l /dev/sdb
outputs nothing. What should I do?
EDIT (2014-07-27): I could have this SD card again, and it seems to be faulty. Yesterday, I was trying it via a USB card reader. Today, I've tried it directly by putting it in the SD slot of my laptop, and I got thousands of I/O errors:
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
[...]
and gdisk -l
didn't find any partition table, and lsblk
output about the card:
mmcblk0 179:0 0 3.7G 0 disk
A bit later I tried again, and the card was recognized:
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
and I could mount it: /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
found only a MBR partition table, but the second partition table overlaps the last partition.
Best Answer
The link
/dev/$disk
points to the whole of a block device, but, on a partitioned disk without unallocated space, the only part which isn't also represented in/dev/$disk[num]
is the first 2kb-4mb or so -$disk
's partition table. It's just some information written to the raw device in a format that the firmware and/or OS can read. Different systems interpret it in different ways and for different reasons. I will cover three.On BIOS systems this table is written in the
MBR
master boot record format so the firmware can figure out where to find the bootable executable. It reads the partition table because in order to boot BIOS reads in the first 512 bytes of the partition the table marks with the bootable flag and executes it. Those 512 bytes usually contain a bootloader (likegrub
orlilo
on a lot of linux systems) that then chainloads another executable (such as the linux kernel) located on a partition formatted with a filesystem the loader understands.On EFI systems and/or BIOS systems with newer kernels this partition table can be a
GPT
GUID partition table format. EFI firmware understands the FAT filesystem and so it looks for the partition the table describes with the EFI system partition flag, mounts it as FAT, and attempts to execute the path stored in its Boot0000-{GUID} NVRAM variable. This is essentially the same task that BIOS bootloaders are designed to do, and, so long as the executable you wish to load can be interpreted by the firmware (such as most Linux kernels since v. 3.3), obviates their use. EFI firmware is a little more sophisticated.After boot, if a partition table is present and the kernel understands it,
/dev/${disk}1
is mapped to the4mb+
offset and ends where the partition table says it does. Partitions really are just arbitrary logical dividers like:Though I suppose it could also be:
It all depends on the layout you define in the partition table - which you can do with tools like
fdisk
forMBR
formats orgdisk
forGPT
formats./dev/$disk[num]
. At the start of each partition it looks for the superblock. It's just a few kb of data (if that) that tells the kernel what type of filesystem it is. A robust filesystem will distribute backups of its superblock throughout its partition. If the partition does not contain a readable superblock which the kernel understands the kernel will not recognize a filesystem there at all.In any case, the point is you don't really need these tables on any disk that need not ever be interpreted by firmware - like on disks from which you don't boot (which is also the only workable GPT+BIOS case) - and on which you want only a single filesystem.
/dev/$disk
can be formatted in whole with any filesystem you like. You canmkfs.fat /dev/$disk
all day if you want - and probably Windows will anyway as it generally does for device types it marks with the removable flag.In other words, it is entirely possible to put a filesystem superblock at the head of a disk rather than a partition table, in which case, provided the kernel understands the filesystem, you can:
But if you want partitions and they are not already there then you need to create them - meaning write a table mapping their locations to the head of the disk - with tools like
fdisk
orgdisk
as mentioned.All of this together leaves me to suggest that your problem is one in these three:
your disk has no partition table and no filesystem
your disk's partition table is not recognized by your os kernel
your disk has no partition table and is formatted with a filesystem not recognized by your os kernel
After rereading your comment above I'm fairly certain it is the latter case. I recommend you get a manual on that tv, try to find out if you can get whatever filesystem it is using loaded as a kernel module in a desktop linux and mount the disk there.