强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

BusyBox 搭建 mini rootfs 完全指南 / 第 9 章:系统工具

第 9 章:系统工具

9.1 文件系统挂载

9.1.1 mount 命令

# 查看已挂载的文件系统
$ mount
/dev/sda1 on / type ext4 (rw,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime)

# 挂载文件系统
$ mount /dev/sda1 /mnt

# 指定文件系统类型
$ mount -t ext4 /dev/sda1 /mnt
$ mount -t nfs 192.168.1.10:/share /mnt

# 挂载虚拟文件系统
$ mount -t proc proc /proc
$ mount -t sysfs sysfs /sys
$ mount -t tmpfs -o size=64M tmpfs /tmp
$ mount -t devtmpfs devtmpfs /dev

# 只读挂载
$ mount -o ro /dev/sda1 /mnt

# 读写挂载
$ mount -o remount,rw /

# 绑定挂载
$ mount --bind /source /target

# 使用 /etc/fstab 挂载所有
$ mount -a

9.1.2 mount 选项

选项说明
ro只读
rw读写(默认)
noatime不更新访问时间
noexec禁止执行文件
nosuid忽略 SUID 位
nodev不解释设备文件
sync同步写入
async异步写入(默认)
remount重新挂载

9.1.3 umount 命令

# 卸载文件系统
$ umount /mnt

# 强制卸载
$ umount -l /mnt    # 延迟卸载(busy 时)

# 查找占用进程
$ fuser -m /mnt     # BusyBox 部分版本支持
$ lsof +D /mnt      # 需要单独编译

# 卸载所有
$ umount -a

9.2 /proc 文件系统

9.2.1 系统信息

# CPU 信息
$ cat /proc/cpuinfo | head -20
processor       : 0
vendor_id       : GenuineIntel
model name      : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
cpu MHz         : 2600.000
cache size      : 12288 KB

# 内存信息
$ cat /proc/meminfo
MemTotal:       16384000 kB
MemFree:         8192000 kB
MemAvailable:   12288000 kB
Buffers:          262144 kB
Cached:          2097152 kB
SwapTotal:             0 kB
SwapFree:              0 kB

# 内核版本
$ cat /proc/version
Linux version 5.15.0 ...

# 系统运行时间
$ cat /proc/uptime
86400.00 172800.00

# 系统负载
$ cat /proc/loadavg
0.10 0.05 0.01 1/128 1234

# 已挂载文件系统
$ cat /proc/mounts
$ cat /proc/self/mounts

9.2.2 进程信息

# 进程列表
$ ls /proc | grep "^[0-9]" | head
1/
100/
101/

# 查看进程详情
$ cat /proc/1/status
Name:   init
State:  S (sleeping)
Pid:    1
PPid:   0

# 进程命令行
$ cat /proc/1/cmdline | tr '\0' ' '
/sbin/init

# 进程环境变量
$ cat /proc/1/environ | tr '\0' '\n'

# 进程打开的文件
$ ls -la /proc/1/fd/

9.2.3 内核参数调整

# 查看内核参数
$ cat /proc/sys/kernel/printk
4       4       1       7

# 修改内核参数
$ echo 0 > /proc/sys/kernel/printk    # 关闭内核日志
$ echo 1 > /proc/sys/net/ipv4/ip_forward  # 开启 IP 转发

# 内存管理
$ echo 1 > /proc/sys/vm/drop_caches    # 清理缓存
$ cat /proc/sys/vm/swappiness          # 查看 swap 倾向

# 网络参数
$ cat /proc/sys/net/ipv4/tcp_syncookies
$ echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

# sysctl 命令(等效)
$ sysctl -a                              # 列出所有参数
$ sysctl -w net.ipv4.ip_forward=1       # 修改参数
$ sysctl -p                              # 加载 /etc/sysctl.conf

9.3 /sys 文件系统

9.3.1 设备信息

# 块设备
$ ls /sys/block/
sda  sdb  loop0

# 查看设备属性
$ cat /sys/block/sda/size
41943040

# 网络接口
$ ls /sys/class/net/
eth0  lo

$ cat /sys/class/net/eth0/address
00:11:22:33:44:55

$ cat /sys/class/net/eth0/mtu
1500

9.3.2 电源管理

# CPU 频率
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
2600000

# 关机
$ echo o > /proc/sysrq-trigger

# 重启
$ echo b > /proc/sysrq-trigger

9.4 设备管理:mdev

9.4.1 mdev 概述

mdev 是 BusyBox 提供的轻量级设备管理器,类似 udev,用于自动创建设备节点。

# 手动扫描设备
$ mdev -s

# 设置热插拔处理器
$ echo /sbin/mdev > /proc/sys/kernel/hotplug

9.4.2 mdev.conf 配置

# /etc/mdev.conf

# 格式:<设备名> <uid>:<gid> <权限> [=路径] [>|<路径] [@|$|*命令]

# 基本设备
null     root:root 666
zero     root:root 666
console  root:root 600
random   root:root 666
urandom  root:root 666

# 串口设备
ttyS[0-9]*  root:dialout 660

# USB 设备
sd[a-z][0-9]*  root:disk 660

# 网络设备
eth[0-9]*  root:root 600
wlan[0-9]*  root:root 600

# 自动挂载 USB
sd[a-z][0-9]*  root:disk 660 */bin/automount.sh

# 热插拔脚本
# 当 USB 设备插入时
$ cat > /bin/automount.sh << 'EOF'
#!/bin/sh
if [ "$ACTION" = "add" ]; then
    mkdir -p /mnt/$MDEV
    mount /dev/$MDEV /mnt/$MDEV
elif [ "$ACTION" = "remove" ]; then
    umount /mnt/$MDEV
    rmdir /mnt/$MDEV
fi
EOF
$ chmod +x /bin/automount.sh

9.4.3 静态设备节点

# 如果不使用 mdev 或 devtmpfs,手动创建设备节点
$ mknod -m 622 /dev/console c 5 1
$ mknod -m 666 /dev/null    c 1 3
$ mknod -m 666 /dev/zero    c 1 5
$ mknod -m 666 /dev/tty     c 5 0
$ mknod -m 666 /dev/random  c 1 8
$ mknod -m 666 /dev/urandom c 1 9
$ mknod -m 666 /dev/ptmx    c 5 2

9.5 进程管理

9.5.1 ps — 进程查看

# 查看所有进程
$ ps aux
PID   USER     COMMAND
    1 root     init
  100 root     syslogd -n -O /var/log/messages
  101 root     klogd -n
  102 root     -/bin/sh
  150 root     ps aux

# 查看进程树(BusyBox 部分版本支持)
$ ps -o pid,ppid,comm
  PID  PPID COMMAND
    1     0 init
  100     1 syslogd
  101     1 klogd
  102     1 sh

# 查看特定进程
$ ps -p 1

9.5.2 kill — 进程信号

# 发送 SIGTERM
$ kill 1234
$ kill -TERM 1234

# 发送 SIGKILL
$ kill -KILL 1234
$ kill -9 1234

# 发送 SIGHUP(重新加载配置)
$ kill -HUP 1234

# 列出信号
$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

# 杀死所有同名进程
$ killall sshd

9.5.3 top — 系统监控

# 运行 top
$ top
Mem: 12340K used, 87660K free, 0K shrd, 0K buff, 0K cached
CPU:  0.0% usr  0.0% sys  0.0% nic  100% idle  0.0% io  0.0% irq
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
    1     0 root     S     1348  1.3%  0.0 init
  100     1 root     S     1128  1.1%  0.0 syslogd -n

# 只显示特定用户
$ top -u root

9.5.4 df / du — 磁盘使用

# 查看磁盘使用
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       2.0G  1.1G  800M  58% /
tmpfs            64M    0   64M   0% /tmp

# 查看目录大小
$ du -sh /var/
45M     /var/

# 按大小排序
$ du -sh /var/* | sort -h

# 查找大文件
$ du -sh /var/* | sort -rh | head -10

9.6 定时任务:crond

9.6.1 cron 概述

BusyBox 提供轻量级 cron 实现,用于定时执行任务。

# 启动 crond
$ crond -l 8          # 日志级别 8(debug)

# 编辑 crontab
$ crontab -e

9.6.2 crontab 格式

# 格式:
# 分 时 日 月 周 命令
# *  *  *  *  *  command

# 示例:
# 每天凌晨 3 点执行备份
0 3 * * * /usr/local/bin/backup.sh

# 每 5 分钟执行一次
*/5 * * * * /usr/local/bin/check.sh

# 每小时执行一次
0 * * * * /usr/local/bin/hourly.sh

# 每周一早上 8 点
0 8 * * 1 /usr/local/bin/weekly.sh

# 每月 1 号
0 0 1 * * /usr/local/bin/monthly.sh

9.6.3 特殊时间字符串

字符串说明
@reboot系统启动时执行
@yearly每年执行一次
@monthly每月执行一次
@weekly每周执行一次
@daily每天执行一次
@hourly每小时执行一次
# 使用特殊字符串
@reboot /usr/local/bin/startup.sh
@daily /usr/local/bin/daily_backup.sh

9.6.4 系统 cron 目录

# /etc/crontab(系统级 crontab)
# 格式:分 时 日 月 周 用户 命令

# /etc/cron.d/       # 额外的 crontab 文件
# /etc/cron.daily/   # 每天执行的脚本
# /etc/cron.hourly/  # 每小时执行的脚本
# /etc/cron.weekly/  # 每周执行的脚本
# /etc/cron.monthly/ # 每月执行的脚本

# 示例:每天清理日志
$ cat > /etc/cron.daily/cleanup << 'EOF'
#!/bin/sh
find /var/log -name "*.log" -mtime +7 -delete
EOF
$ chmod +x /etc/cron.daily/cleanup

9.7 用户管理

9.7.1 用户和组配置文件

# /etc/passwd
# 用户名:密码:UID:GID:注释:主目录:Shell
root:x:0:0:root:/root:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/false

# /etc/shadow
# 用户名:加密密码:...
root:$6$...:19000:0:99999:7:::

# /etc/group
# 组名:密码:GID:成员
root:x:0:
nobody:x:65534:

9.7.2 用户管理命令

# 添加用户
$ adduser -h /home/testuser -s /bin/sh testuser
$ passwd testuser

# 删除用户
$ deluser testuser

# 添加组
$ addgroup mygroup

# 删除组
$ delgroup mygroup

# 修改密码
$ passwd root

# 查看用户信息
$ id root
uid=0(root) gid=0(root) groups=0(root)

# 切换用户
$ su - testuser
$ su -c "command" root

9.8 系统日志

9.8.1 syslogd / klogd

# 启动系统日志
$ syslogd -n -O /var/log/messages &
$ klogd -n &

# 查看日志
$ tail -f /var/log/messages
Jan  1 10:00:00 miniroot syslog.info syslogd: started
Jan  1 10:00:00 miniroot user.notice kernel: Starting system...

# syslogd 选项
$ syslogd --help
Options:
  -n            Run in foreground
  -O FILE       Log to FILE (default:/var/log/messages)
  -s SIZE       Max size (KB) before rotation (default:200)
  -b COUNT      Number of rotated logs to keep (default:1)
  -l COUNT      Log level (default:8=debug)

9.8.2 logger — 手动日志

# 写入系统日志
$ logger "System startup complete"
$ logger -p user.error "An error occurred"
$ logger -t myapp "Application message"

9.9 内核模块管理

# 列出已加载模块
$ lsmod

# 加载模块
$ modprobe ext4
$ insmod /lib/modules/$(uname -r)/ext4.ko

# 卸载模块
$ modprobe -r ext4
$ rmmod ext4

# 查看模块信息
$ modinfo ext4

# 查看模块依赖
$ modprobe --show-depends ext4

9.10 系统管理脚本示例

9.10.1 系统监控脚本

#!/bin/sh
# /usr/bin/sysmon - 系统监控脚本

MONITOR_INTERVAL=60
LOG_FILE="/var/log/sysmon.log"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') $*" >> "$LOG_FILE"
}

check_disk() {
    local usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
    if [ "$usage" -gt 90 ]; then
        log "WARNING: Disk usage at ${usage}%"
    fi
}

check_memory() {
    local total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    local free=$(grep MemFree /proc/meminfo | awk '{print $2}')
    local used_pct=$(( (total - free) * 100 / total ))
    if [ "$used_pct" -gt 90 ]; then
        log "WARNING: Memory usage at ${used_pct}%"
    fi
}

check_load() {
    local load=$(cat /proc/loadavg | awk '{print $1}')
    if [ "$(echo "$load > 2.0" | awk '{print ($1 > 2.0)}')" = "1" ]; then
        log "WARNING: Load average is $load"
    fi
}

while true; do
    check_disk
    check_memory
    check_load
    sleep $MONITOR_INTERVAL
done

9.11 本章小结

工具用途关键命令
mount挂载文件系统-t, -o, --bind
umount卸载文件系统-l(延迟卸载)
mdev设备管理-s, /etc/mdev.conf
ps进程查看aux, -p
kill发送信号-TERM, -KILL
df/du磁盘使用-h, -s
cron定时任务crontab -e
syslogd系统日志-n, -O
sysctl内核参数-a, -w

扩展阅读


上一章: 第 8 章 — 核心工具
下一章: 第 10 章 — Buildroot 集成