MAKEDEV是Linux系统中一个用于创建设备文件的脚本工具。在Linux系统中,设备文件(也称为设备节点)位于/dev目录下,它们是系统与硬件设备通信的接口。MAKEDEV可以创建字符设备、块设备等特殊文件,这些文件对应于系统的各种硬件设备。
udev系统动态管理。MAKEDEV主要用于传统系统或特殊场景下的设备文件创建。对于大多数现代发行版,推荐使用udev或devtmpfs。
MAKEDEV [选项] [设备名...]
或者使用绝对路径:
/dev/MAKEDEV [选项] [设备名...]
| 选项 | 说明 |
|---|---|
-d |
调试模式,显示执行的命令但不实际执行 |
-n |
不更新设备索引文件 |
-v |
详细模式,显示执行过程 |
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
update |
更新设备文件(根据设备索引文件) |
generic |
创建通用设备文件 |
local |
创建本地配置中定义的设备文件 |
Linux系统中的设备文件主要分为两类:
以字符为单位进行数据传输的设备
mknod name c major minorMAKEDEV ttyS0以数据块为单位进行传输的设备
mknod name b major minorMAKEDEV sdaMAKEDEV通常作为makedev包的一部分,或者包含在某些系统工具包中。安装方法如下:
sudo apt update
sudo apt install makedev
# 通常已包含在基础系统中
# 如果未安装,可以尝试安装
sudo yum install MAKEDEV
# 或使用dnf(Fedora/RHEL8+)
sudo dnf install MAKEDEV
# Arch Linux使用udev,但可以安装传统工具
sudo pacman -S makedev
/dev/MAKEDEV,可以直接使用而无需单独安装。
创建常用的设备文件:
# 切换到/dev目录
cd /dev
# 创建标准设备文件
./MAKEDEV std
# 创建终端设备
./MAKEDEV tty
# 创建串口设备
./MAKEDEV ttyS0 ttyS1 ttyS2
# 创建空设备(null)和零设备(zero)
./MAKEDEV null zero
使用预定义的设备组创建多个设备文件:
cd /dev
# 创建所有设备文件(慎用)
./MAKEDEV all
# 创建基本设备文件
./MAKEDEV base
# 创建SCSI设备
./MAKEDEV scsi
# 创建IDE硬盘设备
./MAKEDEV hd
# 创建软盘设备
./MAKEDEV fd
# 创建内存设备
./MAKEDEV mem
创建特定的设备文件:
cd /dev
# 创建第一个SCSI硬盘
./MAKEDEV sda
# 创建第二个SCSI硬盘
./MAKEDEV sdb
# 创建SCSI硬盘分区
./MAKEDEV sda1 sda2 sda3
# 创建IDE主硬盘
./MAKEDEV hda
# 创建控制台设备
./MAKEDEV console
# 创建随机数设备
./MAKEDEV random urandom
使用-d选项查看将要执行的命令而不实际执行:
cd /dev
# 调试模式:显示命令但不执行
./MAKEDEV -d ttyS0
# 调试模式+详细输出
./MAKEDEV -dv console
当设备文件丢失或被误删时,重新创建:
#!/bin/bash
# 修复重要设备文件
echo "修复重要的设备文件..."
cd /dev
# 检查并创建重要设备文件
for dev in null zero console tty random urandom; do
if [ ! -e "$dev" ]; then
echo "创建 $dev..."
./MAKEDEV "$dev"
fi
done
echo "设备文件修复完成"
通过MAKEDEV脚本创建自定义设备:
#!/bin/bash
# 创建自定义设备文件的示例
cd /dev
# 1. 查看MAKEDEV支持哪些设备
grep -r "^create_device" /dev/MAKEDEV* 2>/dev/null | head -20
# 2. 如果需要创建MAKEDEV不支持的特殊设备,可以使用mknod
# 例如:创建主设备号10,次设备号1的杂项设备
sudo mknod mydevice c 10 1
sudo chmod 666 mydevice
# 3. 验证设备文件
ls -l mydevice
file mydevice
在系统恢复场景中重新创建设备文件:
#!/bin/bash
# 系统恢复:重新创建所有设备文件
echo "警告:这将重新创建/dev目录下的设备文件"
read -p "确定继续吗?(y/n): " confirm
if [ "$confirm" = "y" ]; then
# 备份现有设备文件(可选)
mkdir -p /tmp/dev_backup
cp -a /dev/* /tmp/dev_backup/ 2>/dev/null || true
# 清空/dev目录(谨慎操作)
rm -rf /dev/*
# 重新挂载devtmpfs(如果使用)
mount -t devtmpfs devtmpfs /dev
# 使用MAKEDEV创建设备文件
cd /dev
./MAKEDEV std
echo "设备文件恢复完成"
else
echo "操作已取消"
fi
为嵌入式Linux系统准备设备文件:
#!/bin/bash
# 为嵌入式根文件系统创建设备文件
ROOTFS="/path/to/rootfs"
# 确保dev目录存在
mkdir -p "$ROOTFS/dev"
cd "$ROOTFS/dev"
# 创建设备文件
./MAKEDEV -d std
./MAKEDEV ttyS0 ttyS1
./MAKEDEV fb0 # 帧缓冲设备
./MAKEDEV input/mice # 鼠标设备
./MAKEDEV dri/card0 # DRM设备
# 设置正确的权限
chmod 666 null zero
chmod 620 ttyS0
chmod 600 console
使用MAKEDEV创建完整的设备文件系统:
#!/bin/bash
# 创建设备文件系统镜像
DEVFS_IMG="devfs.img"
SIZE="10M"
# 创建空的文件系统镜像
dd if=/dev/zero of="$DEVFS_IMG" bs=1 count=0 seek="$SIZE"
# 格式化为ext2文件系统
mkfs.ext2 "$DEVFS_IMG"
# 挂载镜像
mkdir -p /mnt/devfs
mount -o loop "$DEVFS_IMG" /mnt/devfs
# 创建设备文件
cd /mnt/devfs
cp /dev/MAKEDEV .
./MAKEDEV std
# 卸载并压缩
umount /mnt/devfs
gzip "$DEVFS_IMG"
echo "设备文件系统镜像已创建: ${DEVFS_IMG}.gz"
编写设备文件管理脚本:
#!/bin/bash
# 设备文件管理脚本
ACTION="$1"
DEVICE="$2"
case "$ACTION" in
create)
echo "创建设备: $DEVICE"
cd /dev && ./MAKEDEV "$DEVICE"
;;
remove)
echo "删除设备: /dev/$DEVICE"
rm -f "/dev/$DEVICE"
;;
list)
echo "已创建的设备文件:"
find /dev -type c -o -type b | head -20
;;
check)
echo "检查重要设备文件..."
IMPORTANT_DEVICES="null zero console tty random urandom"
for dev in $IMPORTANT_DEVICES; do
if [ -e "/dev/$dev" ]; then
echo "✓ $dev 存在"
else
echo "✗ $dev 缺失"
fi
done
;;
*)
echo "用法: $0 {create|remove|list|check} [设备名]"
;;
esac
MAKEDEV底层使用mknod命令,了解其工作原理:
# 查看MAKEDEV如何创建设备文件
grep -A2 "mknod.*ttyS0" /dev/MAKEDEV
# 手动使用mknod创建设备文件
# 语法: mknod 名称 类型 主设备号 次设备号
# 创建字符设备ttyS0(串口1)
# 主设备号4,次设备号64
sudo mknod /dev/ttyS0 c 4 64
sudo chmod 666 /dev/ttyS0
# 创建块设备sda(SCSI硬盘)
# 主设备号8,次设备号0
sudo mknod /dev/sda b 8 0
sudo chmod 660 /dev/sda
| 方面 | MAKEDEV | udev |
|---|---|---|
| 工作原理 | 静态创建设备文件,基于预定义的脚本 | 动态管理设备文件,基于硬件事件和规则 |
| 设备发现 | 需要手动或脚本执行 | 自动检测硬件变化并创建设备文件 |
| 灵活性 | 有限,基于预定义模板 | 高,可编写自定义规则 |
| 持久化 | 设备文件在磁盘上持久存储 | 设备文件在内存中(devtmpfs) |
| 现代系统 | 逐渐被淘汰,用于传统系统 | 现代Linux标准(systemd的一部分) |
| 热插拔 | 不支持,需要手动操作 | 完全支持热插拔设备 |
| 设备权限 | 静态设置 | 可根据规则动态设置 |
现代Linux系统主要使用udev或devtmpfs:
在udev系统中,不建议手动创建设备文件。如果需要,可以:
mknod命令:sudo mknod /dev/mydevice c 主设备号 次设备号/etc/udev/rules.d/99-mydevice.rules# 当检测到特定设备时,创建设备文件
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
SYMLINK+="mydevice", MODE="0666"
有多种方法可以查看设备的主次设备号:
# 使用ls命令
ls -l /dev/sda
# 输出示例:brw-rw---- 1 root disk 8, 0 Jan 1 00:00 /dev/sda
# 8是主设备号,0是次设备号
# 使用stat命令
stat -c "主设备号:%t 次设备号:%T" /dev/sda
# 查看/proc/devices文件
cat /proc/devices
# 查看设备号分配标准
# 通常位于:/usr/src/linux/Documentation/devices.txt 或 /usr/share/doc/kernel-doc-*/devices.txt
MAKEDEV在以下场景可能仍有使用:
对于新项目,建议使用现代设备管理方案:
| 工具/系统 | 命令/配置 | 说明 |
|---|---|---|
| udev (systemd) | udevadm monitor, udevadm info |
现代Linux标准设备管理 |
| devtmpfs | mount -t devtmpfs devtmpfs /dev |
内核提供的设备文件系统 |
| mknod | mknod /dev/设备名 c 主设备号 次设备号 |
底层创建设备文件的命令 |
| 设备文件系统 | /etc/fstab配置 |
挂载预创建设备文件系统 |
# 创建设备文件的现代方法
# 1. 使用mknod直接创建
sudo mknod /dev/myfifo p # 创建命名管道
sudo mknod /dev/mynull c 1 3 # 创建类似null的设备
# 2. 使用install命令设置权限
sudo install -m 666 /dev/null /dev/mycustom
# 3. 使用tmpfs存储临时设备文件
sudo mount -t tmpfs tmpfs /dev/shm
创建设备文件的底层命令
udev管理工具,现代设备管理
列出块设备信息
列出PCI设备信息