Linux rdev命令

简介

rdev命令是Linux系统中一个用于查询和设置内核映像文件中启动参数的工具。它可以读取和修改内核映像中的根设备、交换设备、RAM磁盘大小、视频模式等参数。这些参数在内核启动时被使用。

注意:rdev命令在现代Linux系统中已较少使用,大多数发行版使用GRUB等引导加载器来传递启动参数。但在一些嵌入式系统或旧系统中可能还会遇到。

语法格式

rdev [选项] [内核映像文件] [参数值]

常用选项

选项 说明
-r 查询或设置根设备
-R 查询或设置RAM磁盘大小(单位:KB)
-s 查询或设置交换设备
-v 查询或设置视频模式
-h 显示帮助信息
-V 显示版本信息
-o 以八进制格式显示设备号
-b 以块设备格式显示设备号

设备号表示方法

rdev使用设备号来表示设备,格式通常为:

  • 主设备号:次设备号 - 例如 0x0301
  • 十进制数 - 设备号对应的十进制值
  • 设备文件 - 如 /dev/sda1, /dev/hda2
常见设备号示例:
设备文件 主设备号:次设备号 十进制值
/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发行版默认已安装。如果未安装,可以使用以下命令:

Debian/Ubuntu系统:
sudo apt update
sudo apt install util-linux
RHEL/CentOS/Fedora系统:
sudo yum install util-linux

# 或使用dnf(Fedora/RHEL8+)
sudo dnf install util-linux
Arch Linux系统:
sudo pacman -S util-linux
提示:在某些系统中,rdev可能位于/sbin/rdev,需要root权限或使用sudo执行。

使用示例

示例1:查询内核映像的根设备

查看内核映像中设置的根设备:

# 查询内核映像的根设备
rdev /boot/vmlinuz

# 或使用-r选项明确指定
rdev -r /boot/vmlinuz

# 以八进制格式显示
rdev -o /boot/vmlinuz

# 以块设备格式显示
rdev -b /boot/vmlinuz
示例2:设置内核映像的根设备

设置内核映像的根设备:

# 设置根设备为/dev/sda1
sudo rdev /boot/vmlinuz /dev/sda1

# 使用设备号设置
sudo rdev /boot/vmlinuz 0x0801

# 使用十进制设备号
sudo rdev /boot/vmlinuz 2049
示例3:查询和设置RAM磁盘大小

查看和设置内核映像中的RAM磁盘大小:

# 查询RAM磁盘大小
rdev -R /boot/vmlinuz

# 设置RAM磁盘大小为8192KB(8MB)
sudo rdev -R /boot/vmlinuz 8192

# 设置为0表示不使用RAM磁盘
sudo rdev -R /boot/vmlinuz 0
示例4:查询和设置交换设备

查看和设置内核映像中的交换设备:

# 查询交换设备
rdev -s /boot/vmlinuz

# 设置交换设备为/dev/sda2
sudo rdev -s /boot/vmlinuz /dev/sda2

# 使用设备号设置
sudo rdev -s /boot/vmlinuz 0x0802
示例5:查询和设置视频模式

查看和设置内核映像中的视频模式:

# 查询视频模式
rdev -v /boot/vmlinuz

# 设置视频模式
# 常见值:
# -1 = 提示用户选择
#  0 = 80x25文本模式
#  1 = 80x50文本模式
#  2 = 132x25文本模式
#  3 = 132x50文本模式
#  4 = 图形模式
sudo rdev -v /boot/vmlinuz 0
示例6:同时设置多个参数

使用脚本同时设置多个内核参数:

#!/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 "内核参数设置完成"
示例7:查看所有参数

编写脚本查看内核映像的所有参数:

#!/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

高级用法

1. 创建自定义启动内核

复制并修改内核映像以创建自定义启动配置:

# 复制内核映像
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
2. 自动检测并设置根设备

编写脚本自动检测根分区并设置:

#!/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
3. 恢复默认设置

恢复内核映像的默认设置:

#!/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 "内核参数已恢复为默认值"
4. 内核参数验证脚本

验证内核映像的参数是否正确设置:

#!/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=
GRUB配置示例:
# /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在现代系统中的用途有限:

  • 嵌入式系统:某些嵌入式Linux仍使用rdev设置内核参数
  • 旧系统维护:维护旧版Linux系统时可能需要
  • 学习目的:了解Linux启动过程和历史
  • 特殊情况:无法使用GRUB的特定环境
  • 对于大多数现代桌面和服务器系统,建议使用GRUB等引导加载器

不需要。rdev直接修改内核映像文件中的特定字节,不需要重新编译内核。但需要注意:

  1. 对内核映像的修改是永久的(直到再次修改)
  2. 修改前建议备份原始内核映像
  3. 某些安全机制(如Secure Boot)可能拒绝修改后的内核
  4. 内核更新时会覆盖修改,需要重新设置

有多种方法可以查看设备号:

# 使用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设置错误导致无法启动:

  1. 使用Live CD/USB启动系统
  2. 挂载原系统的根分区:mount /dev/sda1 /mnt
  3. 使用正确的参数重新设置:rdev /mnt/boot/vmlinuz /dev/sda1
  4. 或者从备份恢复内核映像
  5. 如果使用GRUB,可以直接修改GRUB配置文件
  6. 在启动时通过GRUB菜单编辑内核参数(按e键)

rdev GRUB参数
修改内核映像文件本身 修改引导加载器配置文件
设置是永久的(在内核文件中) 可动态修改,启动时选择
只能有一套参数 可为不同内核设置不同参数
兼容旧系统和嵌入式系统 现代系统标准方式
修改需要root权限 配置文件可被普通用户读取

相关命令

grub-mkconfig

生成GRUB配置文件,设置启动参数

mkinitrd

创建初始RAM磁盘映像

lilo

另一个引导加载器,也使用类似概念

dmesg

查看内核启动消息,包括设备检测