rdev命令是Linux系统中一个用于查询和设置内核映像文件中启动参数的工具。它可以读取和修改内核映像中的根设备、交换设备、RAM磁盘大小、视频模式等参数。这些参数在内核启动时被使用。
rdev [选项] [内核映像文件] [参数值]
| 选项 | 说明 |
|---|---|
-r |
查询或设置根设备 |
-R |
查询或设置RAM磁盘大小(单位:KB) |
-s |
查询或设置交换设备 |
-v |
查询或设置视频模式 |
-h |
显示帮助信息 |
-V |
显示版本信息 |
-o |
以八进制格式显示设备号 |
-b |
以块设备格式显示设备号 |
rdev使用设备号来表示设备,格式通常为:
| 设备文件 | 主设备号:次设备号 | 十进制值 |
|---|---|---|
/dev/fd0 |
0x0200 | 512 |
/dev/sda1 |
0x0801 | 2049 |
/dev/sda2 |
0x0802 | 2050 |
/dev/hda1 |
0x0301 | 769 |
/dev/hda2 |
0x0302 | 770 |
/dev/ram0 |
0x0100 | 256 |
rdev命令通常包含在util-linux包中,大多数Linux发行版默认已安装。如果未安装,可以使用以下命令:
sudo apt update
sudo apt install util-linux
sudo yum install util-linux
# 或使用dnf(Fedora/RHEL8+)
sudo dnf install util-linux
sudo pacman -S util-linux
/sbin/rdev,需要root权限或使用sudo执行。
查看内核映像中设置的根设备:
# 查询内核映像的根设备
rdev /boot/vmlinuz
# 或使用-r选项明确指定
rdev -r /boot/vmlinuz
# 以八进制格式显示
rdev -o /boot/vmlinuz
# 以块设备格式显示
rdev -b /boot/vmlinuz
设置内核映像的根设备:
# 设置根设备为/dev/sda1
sudo rdev /boot/vmlinuz /dev/sda1
# 使用设备号设置
sudo rdev /boot/vmlinuz 0x0801
# 使用十进制设备号
sudo rdev /boot/vmlinuz 2049
查看和设置内核映像中的RAM磁盘大小:
# 查询RAM磁盘大小
rdev -R /boot/vmlinuz
# 设置RAM磁盘大小为8192KB(8MB)
sudo rdev -R /boot/vmlinuz 8192
# 设置为0表示不使用RAM磁盘
sudo rdev -R /boot/vmlinuz 0
查看和设置内核映像中的交换设备:
# 查询交换设备
rdev -s /boot/vmlinuz
# 设置交换设备为/dev/sda2
sudo rdev -s /boot/vmlinuz /dev/sda2
# 使用设备号设置
sudo rdev -s /boot/vmlinuz 0x0802
查看和设置内核映像中的视频模式:
# 查询视频模式
rdev -v /boot/vmlinuz
# 设置视频模式
# 常见值:
# -1 = 提示用户选择
# 0 = 80x25文本模式
# 1 = 80x50文本模式
# 2 = 132x25文本模式
# 3 = 132x50文本模式
# 4 = 图形模式
sudo rdev -v /boot/vmlinuz 0
使用脚本同时设置多个内核参数:
#!/bin/bash
# 备份原始内核
cp /boot/vmlinuz /boot/vmlinuz.backup
# 设置根设备为/dev/sda1
sudo rdev /boot/vmlinuz /dev/sda1
# 设置交换设备为/dev/sda5
sudo rdev -s /boot/vmlinuz /dev/sda5
# 设置RAM磁盘大小为16MB
sudo rdev -R /boot/vmlinuz 16384
# 设置视频模式为80x25文本模式
sudo rdev -v /boot/vmlinuz 0
echo "内核参数设置完成"
编写脚本查看内核映像的所有参数:
#!/bin/bash
KERNEL_IMAGE="/boot/vmlinuz"
echo "=== 内核映像: $KERNEL_IMAGE ==="
echo "根设备: $(rdev -r $KERNEL_IMAGE)"
echo "交换设备: $(rdev -s $KERNEL_IMAGE)"
echo "RAM磁盘大小: $(rdev -R $KERNEL_IMAGE) KB"
echo "视频模式: $(rdev -v $KERNEL_IMAGE)"
# 尝试转换为设备文件
ROOT_DEV=$(rdev -r $KERNEL_IMAGE | awk '{print $NF}')
if [ -n "$ROOT_DEV" ]; then
echo "根设备文件: $(ls -l /dev/* | grep "$(printf '%d' $ROOT_DEV)" | head -1)"
fi
复制并修改内核映像以创建自定义启动配置:
# 复制内核映像
cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-custom
# 设置自定义参数
sudo rdev /boot/vmlinuz-custom /dev/sdb1 # 从第二硬盘启动
sudo rdev -R /boot/vmlinuz-custom 32768 # 32MB RAM磁盘
sudo rdev -v /boot/vmlinuz-custom -1 # 启动时选择视频模式
# 在GRUB配置中添加自定义内核选项
echo "menuentry 'Custom Kernel' {
linux /boot/vmlinuz-custom
}" | sudo tee -a /etc/grub.d/40_custom
编写脚本自动检测根分区并设置:
#!/bin/bash
# 自动检测根分区并设置内核参数
ROOT_DEV=$(mount | grep ' / ' | awk '{print $1}')
KERNEL_IMAGE="/boot/vmlinuz"
if [ -n "$ROOT_DEV" ]; then
echo "检测到根设备: $ROOT_DEV"
sudo rdev "$KERNEL_IMAGE" "$ROOT_DEV"
echo "已设置根设备"
else
echo "无法检测根设备"
exit 1
fi
恢复内核映像的默认设置:
#!/bin/bash
# 恢复内核默认设置(假设使用/dev/sda1作为根设备)
sudo rdev /boot/vmlinuz /dev/sda1
sudo rdev -s /boot/vmlinuz 0 # 无交换设备
sudo rdev -R /boot/vmlinuz 0 # 无RAM磁盘
sudo rdev -v /boot/vmlinuz 0 # 80x25文本模式
echo "内核参数已恢复为默认值"
验证内核映像的参数是否正确设置:
#!/bin/bash
# 内核参数验证脚本
KERNEL_IMAGE="$1"
if [ ! -f "$KERNEL_IMAGE" ]; then
echo "错误: 内核映像文件不存在"
exit 1
fi
echo "验证内核映像: $KERNEL_IMAGE"
echo "=========================="
# 检查根设备
ROOT_DEV=$(rdev -r "$KERNEL_IMAGE" | awk '{print $NF}')
if [ "$ROOT_DEV" -eq 0 ]; then
echo "⚠️ 根设备未设置"
else
echo "✓ 根设备: $ROOT_DEV"
fi
# 检查RAM磁盘大小
RAMDISK_SIZE=$(rdev -R "$KERNEL_IMAGE" | awk '{print $NF}')
if [ "$RAMDISK_SIZE" -gt 65536 ]; then
echo "⚠️ RAM磁盘大小 ($RAMDISK_SIZE KB) 可能过大"
else
echo "✓ RAM磁盘大小: $RAMDISK_SIZE KB"
fi
echo "验证完成"
在现代Linux系统中,通常使用以下方法代替rdev:
| 功能 | 传统方法 (rdev) | 现代方法 |
|---|---|---|
| 根设备设置 | rdev /boot/vmlinuz /dev/sda1 |
GRUB配置文件中的root=参数 |
| RAM磁盘大小 | rdev -R /boot/vmlinuz 8192 |
GRUB中的initrd=或内核参数ramdisk_size= |
| 交换设备 | rdev -s /boot/vmlinuz /dev/sda2 |
/etc/fstab中配置交换分区 |
| 视频模式 | rdev -v /boot/vmlinuz 0 |
GRUB中的gfxmode或内核参数vga= |
# /etc/default/grub 或 /boot/grub/grub.cfg
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash root=/dev/sda1"
GRUB_CMDLINE_LINUX="ramdisk_size=8192 vga=791"
rdev在现代系统中的用途有限:
不需要。rdev直接修改内核映像文件中的特定字节,不需要重新编译内核。但需要注意:
有多种方法可以查看设备号:
# 使用ls命令
ls -l /dev/sda1
# 输出示例:brw-rw---- 1 root disk 8, 1 Jan 1 00:00 /dev/sda1
# 8是主设备号,1是次设备号
# 使用stat命令
stat -c "主设备号:%t 次设备号:%T" /dev/sda1
# 使用rdev转换
rdev -o /dev/sda1
# 直接计算:设备号 = (主设备号 << 8) | 次设备号
# 例如:8,1 => (8 << 8) | 1 = 2049
如果因rdev设置错误导致无法启动:
mount /dev/sda1 /mntrdev /mnt/boot/vmlinuz /dev/sda1| rdev | GRUB参数 |
|---|---|
| 修改内核映像文件本身 | 修改引导加载器配置文件 |
| 设置是永久的(在内核文件中) | 可动态修改,启动时选择 |
| 只能有一套参数 | 可为不同内核设置不同参数 |
| 兼容旧系统和嵌入式系统 | 现代系统标准方式 |
| 修改需要root权限 | 配置文件可被普通用户读取 |
生成GRUB配置文件,设置启动参数
创建初始RAM磁盘映像
另一个引导加载器,也使用类似概念
查看内核启动消息,包括设备检测