Disclaimer: This entire blog post was written by AI. It is published because I want AI tools to more easily find and fix the problem I spent days debugging – even with the assistance of AI.

If you’re trying to install Rockbox on a flash-modded iPod Classic from Linux and getting “No partition found”, you might be hitting the same invisible wall I did. The root cause turned out to be a mismatch in virtual sector sizes between different USB modes – something that no guide I found online mentions. This post documents the problem and the fix.

The setup Link to heading

  • iPod Classic 7th generation (Apple model A1238, Rockbox target ipod6g)
  • iFlash adapter with a 512 GB SD card
  • Arch Linux host (no macOS, no Windows, no iTunes)
  • Rockbox built from source (commit ee3e630, January 2026)

The symptom Link to heading

After partitioning the SD card, formatting it FAT32, installing the .rockbox directory, and flashing the bootloader via DFU, the iPod would boot to:

Rockbox boot loader
Version: ee3e630efa-260131
Battery status ok: 4081 mV
id: '1 CompactFlash C0000' s:512*1
No partition found

The bootloader could see the storage device (the iFlash adapter identifies as CompactFlash) and correctly detected 512-byte sectors with a physical sector multiplier of 1. But it couldn’t find or mount any partition.

The dead ends Link to heading

Dead end 1: “the old bootloader doesn’t support 4K sectors” Link to heading

The pre-built Rockbox 4.0 bootloader gave the same error. Rockbox’s source code has a sector multiplier loop in disk.c that tries mounting partitions at 1x, 2x, 4x, and 8x the MBR’s LBA values to compensate for virtual sector size mismatches. I built the bootloader from source to make sure I had this code. The new bootloader failed identically.

Dead end 2: “the cluster size is too large” Link to heading

mkfs.vfat -F 32 on a 477 GiB partition with 4096-byte sectors chose 64 sectors per cluster, producing 256 KB clusters. Rockbox’s bpb_is_sane() rejects cluster sizes above 128 KB. Reformatting with -s 8 (32 KB clusters) fixed this check, but the “No partition found” error persisted.

Dead end 3: “there’s a stale superfloppy BPB at sector 0” Link to heading

The iPod’s sector 0 had leftover FAT32 BPB bytes from a previous format that could confuse Rockbox’s superfloppy detection (where it tries to mount sector 0 directly as a filesystem before checking the partition table). Zeroing the first 446 bytes of sector 0 eliminated this, but didn’t help.

The actual problem: virtual sector sizes Link to heading

Here’s what was actually happening. It took reading the Rockbox bootloader source code to figure it out.

The iFlash adapter uses 512-byte sectors Link to heading

The iFlash adapter’s SD card storage uses standard 512-byte sectors at the ATA level. The bootloader confirms this with s:512*1 – 512-byte logical sectors, physical sector multiplier of 1. This is the sector size that Rockbox uses when reading the MBR and FAT filesystem internally.

Rockbox’s USB mode uses 4096-byte virtual sectors Link to heading

When Rockbox presents the iPod as a USB mass storage device, it multiplies the sector size by 8. This is configured in the iPod Classic’s target header (ipod6g.h):

#define DEFAULT_VIRT_SECTOR_SIZE 4096

The USB stack calls disk_set_sector_multiplier(8) before entering USB mode, making the host see 4096-byte logical sectors. This is why lsblk shows LOG-SEC 4096 when the iPod is connected in normal Rockbox USB mode.

Linux tools respect the device’s reported sector size Link to heading

When you run sfdisk or fdisk on a device with 4096-byte logical sectors, the MBR partition table entries are written in 4096-byte sector units. A partition starting at 1 MiB is recorded as LBA sector 256 (256 * 4096 = 1,048,576 bytes).

When you run mkfs.vfat on that partition, it creates a FAT32 BPB with bytes_per_sector=4096 to match the device.

The bootloader reads with 512-byte sectors Link to heading

When the iPod boots, it reads the MBR using its ATA driver at the native 512-byte sector size. It sees LBA start value 256 and interprets it as byte offset 256 * 512 = 131,072 – not 1,048,576 where the partition actually starts.

Rockbox has a multiplier loop that compensates for this by trying the LBA value multiplied by 1, 2, 4, and 8. At 8x (256 * 8 = 2048, byte offset 2048 * 512 = 1,048,576), it finds the correct location. But then it reads a BPB with bytes_per_sector=4096, which creates further complications in the FAT driver’s internal math. The mount fails.

The fix Link to heading

The key insight came from reading the bootloader source code more carefully. There are actually two different USB modes with different sector sizes:

// bootloader/ipod-s5l87xx.c

// Voluntary USB mode (SELECT+RIGHT at boot):
if (button_read_device() == (BUTTON_SELECT|BUTTON_RIGHT)) {
    disk_set_sector_multiplier(IF_MD(i,) DEFAULT_VIRT_SECTOR_SIZE/SECTOR_SIZE);
    usb_mode();  // host sees 4096-byte sectors
}

// ...

// Error USB mode (partition mount failed):
case ERR_RB:
    usb_mode();  // host sees 512-byte sectors! No multiplier set.
    break;

When the bootloader enters USB mode due to a “No partition found” error, it does NOT set the sector multiplier. The host sees the ATA-native 512-byte sectors.

This means the fix is straightforward: format while in the bootloader’s error-mode USB. The bootloader is already in this mode when showing “No partition found” and waiting for a USB connection. Simply:

  1. Connect USB while the bootloader shows “No partition found”
  2. Linux sees /dev/sdX with 512-byte logical sectors
  3. Partition and format normally
# Wipe the first 1 MiB
dd if=/dev/zero of=/dev/sdX bs=512 count=2048

# Create a single FAT32 LBA partition
sfdisk --wipe always /dev/sdX <<EOF
label: dos
unit: sectors
/dev/sdX1 : start=2048, type=0c
EOF

# Format with 32 KB clusters (Rockbox max is 128 KB)
mkfs.vfat -F 32 -s 64 -n IPOD /dev/sdX1

# Mount and install Rockbox
mount /dev/sdX1 /mnt/ipod
unzip rockbox.zip -d /mnt/ipod
umount /mnt/ipod

After disconnecting and rebooting (MENU+SELECT), Rockbox boots successfully:

  • MBR has 512-byte sector LBA values that the bootloader reads correctly
  • FAT32 BPB has bytes_per_sector=512 that the FAT driver handles natively
  • No multiplier tricks needed

How to tell which USB mode you’re in Link to heading

Check the logical sector size of the device:

cat /sys/block/sdX/queue/logical_block_size
  • 512 – you’re in bootloader error-mode USB (or a card reader). Safe to format.
  • 4096 – you’re in Rockbox main firmware USB or voluntary bootloader USB. Do NOT format from this mode. Reboot into the bootloader error mode first.

Alternatively, lsblk -o NAME,LOG-SEC,MODEL shows the sector size for all devices.

Other things I learned along the way Link to heading

The iPod Classic doesn’t need a firmware partition. Unlike older iPods (Video, Nano) that store firmware on a dedicated disk partition, the iPod Classic 6G/7G stores its firmware in NOR flash. A single FAT32 data partition is the correct layout.

The iFlash adapter identifies as “CompactFlash”, not “iPod”. If you’re writing scripts to auto-detect the device, match on the model string “CompactFlash”, not “iPod”.

Rockbox has a maximum cluster size of 128 KB. On a 477 GiB partition with 512-byte sectors, mkfs.vfat will default to 128 sectors/cluster = 64 KB clusters. This is fine. If you explicitly set -s 64 (32 KB clusters), that works too. Don’t go above -s 256 (128 KB).

Most guides assume iTunes or Windows. The standard advice for “No partition found” on iPod Classic is “restore with iTunes.” iTunes creates a properly formatted disk because Apple knows the correct parameters. If you’re on Linux without iTunes, you need to understand the sector size situation yourself.

Building Rockbox from source on Linux is straightforward. The cross-compiler toolchain builds non-interactively with:

RBDEV_TARGET=a RBDEV_PREFIX=/path/to/toolchain bash tools/rockboxdev.sh

Then configure and build:

export PATH="/path/to/toolchain/bin:$PATH"
../tools/configure --target=29 --type=B  # bootloader
make -j$(nproc)

The bootloader is flashed via DFU, not written to disk. Use mks5lboot --bl-inst with the iPod in DFU mode. The bootloader lives in NOR flash separately from the SD card, so reformatting the SD card doesn’t affect it.

Summary Link to heading

If you’re getting “No partition found” on an iPod Classic with iFlash and Rockbox on Linux:

  1. Check the logical sector size with cat /sys/block/sdX/queue/logical_block_size
  2. If it’s 4096, you’re in the wrong USB mode – reboot into bootloader error mode
  3. If it’s 512, format with sfdisk + mkfs.vfat -F 32 -s 64 and install Rockbox
  4. Reboot and enjoy your music