initrd: remove deprecated code path (linuxrc)

Remove linuxrc initrd code path, which was deprecated in 2020.

Initramfs and (non-initial) RAM disks (i. e. brd) still work.

Both built-in and bootloader-supplied initramfs still work.

Non-linuxrc initrd code path (i. e. using /dev/ram as final root
filesystem) still works, but I put deprecation message into it.

Also I deprecate command line parameters "noinitrd" and "ramdisk_start=".

Signed-off-by: Askar Safin <safinaskar@gmail.com>
Link: https://patch.msgid.link/20251119222407.3333257-3-safinaskar@gmail.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Askar Safin 2025-11-19 22:24:06 +00:00 committed by Christian Brauner
commit c350a65b56
No known key found for this signature in database
GPG key ID: 91C61BC06578DCA2
6 changed files with 22 additions and 114 deletions

View file

@ -4442,8 +4442,10 @@ Kernel parameters
Note that this argument takes precedence over Note that this argument takes precedence over
the CONFIG_RCU_NOCB_CPU_DEFAULT_ALL option. the CONFIG_RCU_NOCB_CPU_DEFAULT_ALL option.
noinitrd [RAM] Tells the kernel not to load any configured noinitrd [Deprecated,RAM] Tells the kernel not to load any configured
initial RAM disk. initial RAM disk. Currently this parameter applies to
initrd only, not to initramfs. But it applies to both
in EFI mode.
nointremap [X86-64,Intel-IOMMU,EARLY] Do not enable interrupt nointremap [X86-64,Intel-IOMMU,EARLY] Do not enable interrupt
remapping. remapping.
@ -5456,7 +5458,7 @@ Kernel parameters
ramdisk_size= [RAM] Sizes of RAM disks in kilobytes ramdisk_size= [RAM] Sizes of RAM disks in kilobytes
See Documentation/admin-guide/blockdev/ramdisk.rst. See Documentation/admin-guide/blockdev/ramdisk.rst.
ramdisk_start= [RAM] RAM disk image start address ramdisk_start= [Deprecated,RAM] RAM disk image start address
random.trust_cpu=off random.trust_cpu=off
[KNL,EARLY] Disable trusting the use of the CPU's [KNL,EARLY] Disable trusting the use of the CPU's

View file

@ -3,8 +3,6 @@
#ifndef __LINUX_INITRD_H #ifndef __LINUX_INITRD_H
#define __LINUX_INITRD_H #define __LINUX_INITRD_H
#define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */
/* starting block # of image */ /* starting block # of image */
extern int rd_image_start; extern int rd_image_start;

View file

@ -477,13 +477,11 @@ void __init prepare_namespace(void)
if (saved_root_name[0]) if (saved_root_name[0])
ROOT_DEV = parse_root_device(saved_root_name); ROOT_DEV = parse_root_device(saved_root_name);
if (initrd_load(saved_root_name)) initrd_load();
goto out;
if (root_wait) if (root_wait)
wait_for_root(saved_root_name); wait_for_root(saved_root_name);
mount_root(saved_root_name); mount_root(saved_root_name);
out:
devtmpfs_mount(); devtmpfs_mount();
init_mount(".", "/", NULL, MS_MOVE, NULL); init_mount(".", "/", NULL, MS_MOVE, NULL);
init_chroot("."); init_chroot(".");

View file

@ -23,25 +23,15 @@ static inline __init int create_dev(char *name, dev_t dev)
} }
#ifdef CONFIG_BLK_DEV_RAM #ifdef CONFIG_BLK_DEV_RAM
int __init rd_load_image(void);
int __init rd_load_disk(int n);
int __init rd_load_image(char *from);
#else #else
static inline int rd_load_image(void) { return 0; }
static inline int rd_load_disk(int n) { return 0; }
static inline int rd_load_image(char *from) { return 0; }
#endif #endif
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
bool __init initrd_load(char *root_device_name); void __init initrd_load(void);
#else #else
static inline bool initrd_load(char *root_device_name) static inline void initrd_load(void) { }
{
return false;
}
#endif #endif
/* Ensure that async file closing finished to prevent spurious errors. */ /* Ensure that async file closing finished to prevent spurious errors. */

View file

@ -2,13 +2,7 @@
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/minix_fs.h>
#include <linux/romfs_fs.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <linux/sched.h>
#include <linux/freezer.h>
#include <linux/kmod.h>
#include <uapi/linux/mount.h>
#include "do_mounts.h" #include "do_mounts.h"
@ -41,6 +35,7 @@ late_initcall(kernel_do_mounts_initrd_sysctls_init);
static int __init no_initrd(char *str) static int __init no_initrd(char *str)
{ {
pr_warn("noinitrd option is deprecated and will be removed soon\n");
mount_initrd = 0; mount_initrd = 0;
return 1; return 1;
} }
@ -70,85 +65,19 @@ static int __init early_initrd(char *p)
} }
early_param("initrd", early_initrd); early_param("initrd", early_initrd);
static int __init init_linuxrc(struct subprocess_info *info, struct cred *new) void __init initrd_load(void)
{
ksys_unshare(CLONE_FS | CLONE_FILES);
console_on_rootfs();
/* move initrd over / and chdir/chroot in initrd root */
init_chdir("/root");
init_mount(".", "/", NULL, MS_MOVE, NULL);
init_chroot(".");
ksys_setsid();
return 0;
}
static void __init handle_initrd(char *root_device_name)
{
struct subprocess_info *info;
static char *argv[] = { "linuxrc", NULL, };
extern char *envp_init[];
int error;
pr_warn("using deprecated initrd support, will be removed soon.\n");
real_root_dev = new_encode_dev(ROOT_DEV);
create_dev("/dev/root.old", Root_RAM0);
/* mount initrd on rootfs' /root */
mount_root_generic("/dev/root.old", root_device_name,
root_mountflags & ~MS_RDONLY);
init_mkdir("/old", 0700);
init_chdir("/old");
info = call_usermodehelper_setup("/linuxrc", argv, envp_init,
GFP_KERNEL, init_linuxrc, NULL, NULL);
if (!info)
return;
call_usermodehelper_exec(info, UMH_WAIT_PROC|UMH_FREEZABLE);
/* move initrd to rootfs' /old */
init_mount("..", ".", NULL, MS_MOVE, NULL);
/* switch root and cwd back to / of rootfs */
init_chroot("..");
if (new_decode_dev(real_root_dev) == Root_RAM0) {
init_chdir("/old");
return;
}
init_chdir("/");
ROOT_DEV = new_decode_dev(real_root_dev);
mount_root(root_device_name);
printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
error = init_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
if (!error)
printk("okay\n");
else {
if (error == -ENOENT)
printk("/initrd does not exist. Ignored.\n");
else
printk("failed\n");
printk(KERN_NOTICE "Unmounting old root\n");
init_umount("/old", MNT_DETACH);
}
}
bool __init initrd_load(char *root_device_name)
{ {
if (mount_initrd) { if (mount_initrd) {
create_dev("/dev/ram", Root_RAM0); create_dev("/dev/ram", Root_RAM0);
/* /*
* Load the initrd data into /dev/ram0. Execute it as initrd * Load the initrd data into /dev/ram0.
* unless /dev/ram0 is supposed to be our actual root device,
* in that case the ram disk is just set up here, and gets
* mounted in the normal path.
*/ */
if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { if (rd_load_image()) {
init_unlink("/initrd.image"); pr_warn("using deprecated initrd support, will be removed in January 2027; "
handle_initrd(root_device_name); "use initramfs instead or (as a last resort) /sys/firmware/initrd; "
return true; "see section \"Workaround\" in "
"https://lore.kernel.org/lkml/20251010094047.3111495-1-safinaskar@gmail.com\n");
} }
} }
init_unlink("/initrd.image"); init_unlink("/initrd.image");
return false;
} }

View file

@ -22,6 +22,7 @@ int __initdata rd_image_start; /* starting block # of image */
static int __init ramdisk_start_setup(char *str) static int __init ramdisk_start_setup(char *str)
{ {
pr_warn("ramdisk_start= option is deprecated and will be removed soon\n");
return kstrtoint(str, 0, &rd_image_start) == 0; return kstrtoint(str, 0, &rd_image_start) == 0;
} }
__setup("ramdisk_start=", ramdisk_start_setup); __setup("ramdisk_start=", ramdisk_start_setup);
@ -176,7 +177,7 @@ static unsigned long nr_blocks(struct file *file)
return i_size_read(inode) >> 10; return i_size_read(inode) >> 10;
} }
int __init rd_load_image(char *from) int __init rd_load_image(void)
{ {
int res = 0; int res = 0;
unsigned long rd_blocks, devblocks, nr_disks; unsigned long rd_blocks, devblocks, nr_disks;
@ -190,7 +191,7 @@ int __init rd_load_image(char *from)
if (IS_ERR(out_file)) if (IS_ERR(out_file))
goto out; goto out;
in_file = filp_open(from, O_RDONLY, 0); in_file = filp_open("/initrd.image", O_RDONLY, 0);
if (IS_ERR(in_file)) if (IS_ERR(in_file))
goto noclose_input; goto noclose_input;
@ -219,10 +220,7 @@ int __init rd_load_image(char *from)
/* /*
* OK, time to copy in the data * OK, time to copy in the data
*/ */
if (strcmp(from, "/initrd.image") == 0) devblocks = nblocks;
devblocks = nblocks;
else
devblocks = nr_blocks(in_file);
if (devblocks == 0) { if (devblocks == 0) {
printk(KERN_ERR "RAMDISK: could not determine device size\n"); printk(KERN_ERR "RAMDISK: could not determine device size\n");
@ -266,13 +264,6 @@ out:
return res; return res;
} }
int __init rd_load_disk(int n)
{
create_dev("/dev/root", ROOT_DEV);
create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n));
return rd_load_image("/dev/root");
}
static int exit_code; static int exit_code;
static int decompress_error; static int decompress_error;