Introduction
From time to time I encounter devices that still require some old kind legacy partitioning scheme and filesystem: Namely MBR type partitioning and the VFAT filesystem.
One of these devices is the Canon Selphy CP800 photo printer, which reads photos from various kinds of storage mediums, like USB sticks, SD cards or CF cards.
Most of my usb sticks are formatted using ext3, jfs, btrfs, LUKS encrypted, or even contain RAID signatures.
In case I need to transfer data to the printer, I often use pre-formatted SD cards, because the cards I simply format with mkfs.vfat are not recognised.
Motivation
Not depending on those cards and being able to re-create correct format, everywhere and everytime, makes me more independent (and thus more happy).
Analysis
Having a look at my new 128GB SDXC card shows the following partitioning scheme.
[14:31] kr:/# fdisk -l /dev/sdb
Disk /dev/sdb: 132.0 GB, 132035641344 bytes
255 heads, 63 sectors/track, 16052 cylinders, total 257882112 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
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1026047 512000 27 Hidden NTFS WinRE
/dev/sdb2 1026048 2050047 512000 83 Linux
/dev/sdb3 2050048 257882078 127916015+ 83 Linux
Although /dev/sdb1 is formatted with mkfs.vfat, it is not recognised by the printer. Comparing this with a working 4GB card reveals the following partitioning scheme:
[14:31] kr:/# fdisk -l /dev/sdb
Disk /dev/sdb: 3999 MB, 3999268864 bytes
82 heads, 17 sectors/track, 5603 cylinders, total 7811072 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
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 8192 7811071 3901440 b W95 FAT32
Changing the first card
Using the fdisk utility to change the partition ID to b is sufficient to make the printer recognise the card:
[14:31] kr:/# fdisk /dev/sdb
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): b
Changed system type of partition 1 to b (W95 FAT32)
Command (m for help):
Command (m for help): p
Disk /dev/sdb: 132.0 GB, 132035641344 bytes
255 heads, 63 sectors/track, 16052 cylinders, total 257882112 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
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1026047 512000 b W95 FAT32
/dev/sdb2 1026048 2050047 512000 83 Linux
/dev/sdb3 2050048 257882078 127916015+ 83 Linux
Command (m for help):
Command (m for help): w
The partition table has been altered!
Summary
Thus, if you encounter a card that is not readable, the following two commands should give you a working card on VFAT requiring devices:
- Change partition ID to b
- fdisk , use commands t1bwq
- Ensure changes are written to disk and table is reread by kernel
- You can either remove/add the card or use hdparm -z to trigger this
- Create a VFAT filesystem
- mkfs.vfat
Some other hints:
- Using a GPT partition table may make the card unusable on older devices
- Not sure whether the device will seek through all partitions, sticking to the first partition may give you a higher chance of a working setup
- Using no partition at all, putting the filesystem on the device directly also used to work on another printer