From: viro@parcelfarce.linux.theplanet.co.uk The problems happened if you had devfs enabled; in that case late-boot code does temporary mount of devfs over rootfs /dev, which made /dev/initrd inaccessible. For setups without devfs that didn't happen. Fix is trivial - put the file in question outside of /dev; IOW, we simply replace "/dev/initrd" with "/initrd.image" in init/*. It works here; please check if it fixes all initrd problems on your boxen. init/do_mounts_initrd.c | 6 +++--- init/do_mounts_rd.c | 2 +- init/initramfs.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff -puN init/do_mounts_initrd.c~devfs-initrd-fix init/do_mounts_initrd.c --- 25/init/do_mounts_initrd.c~devfs-initrd-fix 2003-10-18 16:26:48.000000000 -0700 +++ 25-akpm/init/do_mounts_initrd.c 2003-10-18 16:26:48.000000000 -0700 @@ -109,12 +109,12 @@ int __init initrd_load(void) * in that case the ram disk is just set up here, and gets * mounted in the normal path. */ - if (rd_load_image("/dev/initrd") && ROOT_DEV != Root_RAM0) { - sys_unlink("/dev/initrd"); + if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { + sys_unlink("/initrd.image"); handle_initrd(); return 1; } } - sys_unlink("/dev/initrd"); + sys_unlink("/initrd.image"); return 0; } diff -puN init/do_mounts_rd.c~devfs-initrd-fix init/do_mounts_rd.c --- 25/init/do_mounts_rd.c~devfs-initrd-fix 2003-10-18 16:26:48.000000000 -0700 +++ 25-akpm/init/do_mounts_rd.c 2003-10-18 16:26:48.000000000 -0700 @@ -185,7 +185,7 @@ int __init rd_load_image(char *from) else devblocks >>= 1; - if (strcmp(from, "/dev/initrd") == 0) + if (strcmp(from, "/initrd.image") == 0) devblocks = nblocks; if (devblocks == 0) { diff -puN init/initramfs.c~devfs-initrd-fix init/initramfs.c --- 25/init/initramfs.c~devfs-initrd-fix 2003-10-18 16:26:48.000000000 -0700 +++ 25-akpm/init/initramfs.c 2003-10-18 16:26:48.000000000 -0700 @@ -497,7 +497,7 @@ void __init populate_rootfs(void) return; } printk("it isn't (%s); looks like an initrd\n", err); - fd = sys_open("/dev/initrd", O_WRONLY|O_CREAT, 700); + fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 700); if (fd >= 0) { sys_write(fd, (char *)initrd_start, initrd_end - initrd_start); _