shell之开机引导参数处理

shell之开机引导参数处理

标题里的‘开机’可能不太正确
但对于我来说
开机基本上就是启动Linux

本篇简单介绍一下如何利用自定义开机时的引导参数来执行自定义的动作
好久不用LILO了
就拿GRUB来讲解吧

用过GRUB的同志们都应该熟悉以下配置行
引用:
#/boot/grub/menu.lst

title           Ubuntu, kernel 2.6.15-23-386
root            (hd0,5)
kernel          /vmlinuz-2.6.15-23-386 root=/dev/hdc8 ro quiet splash
initrd          /initrd.img-2.6.15-23-386
这几行有的是被GRUB处理,有的是被kernel处理

我们先看一下在系统里如何取得加粗那行的参数
复制内容到剪贴板
代码:
[0 No.1992 huan@huan ~]$ cat /proc/cmdline
[b]root=/dev/hdc8 ro quiet splash[b]
这意味着我们可以自己读引导参数
并可以根据这些参数自定义一些些动作
下边的示例代码是一种解析/proc/cmdline 的方法
摘自ubuntu livecd的initrd.img中的init脚本
复制内容到剪贴板
代码:
for x in $(cat /proc/cmdline); do
        case $x in
        init=*)
                init=${x#init=}
                ;;
        root=*)
                ROOT=${x#root=}
                case $ROOT in
                LABEL=*)
                        ROOT="/dev/disk/by-label/${ROOT#LABEL=}"
                        ;;
                UUID=*)
                        ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
                        ;;
                esac
                ;;
        rootflags=*)
                ROOTFLAGS="-o ${x#rootflags=}"
                ;;
        cryptopts=*)
                cryptopts="${x#cryptopts=}"
                ;;
        nfsroot=*)
                NFSROOT="${x#nfsroot=}"
                ;;
        nfsopts=*)
                NFSOPTS="-o ${x#nfsopts=}"
                ;;
        boot=*)
                BOOT=${x#boot=}
                ;;
        resume=*)
                RESUME=${x#resume=}
                ;;
        noresume)
                NORESUME=y
                ;;
        quiet)
                quiet=y
                ;;
        ro)
                readonly=y
                ;;
        rw)
                readonly=n
                ;;
        debug)
                debug=y
                exec >/tmp/initramfs.debug 2>&1
                set -x
                ;;
        break=*)
                break=${x#break=}
                ;;
        break)
                break=premount
                ;;
        esac
done
按照这个方法
只需要修改一下里边的判断和赋值语句成你的自己的即可

另外一个比较简单的解析方法如下
复制内容到剪贴板
代码:
grep -wq xxx /proc/cmdline
即利用grep来检查引导参数中有自己感兴趣的关键字
比如,有些人启动Linux并不默认打开X
但如何他希望引导参数里说明希望打开X
可以这么做, 在grub kernel 那行加入startx或是gdm
复制内容到剪贴板
代码:
if grep -wq startx /proc/cmdline; then
    startx &
elif
    grep -wq gdm /proc/cmdline; then
    /etc/init.d/gdm start
fi
这些代码具体应该放在哪些位置
开始后系统会自动运行呢
复制内容到剪贴板
代码:
[0 No.2002 huan@huan ~]$ runlevel
N 2

[0 No.2003 huan@huan ~]$
这个命令的输出意味着我们开机时
系统运行了/etc/rc2.d/ 里的脚本
我们可以将自己写的脚本放在这个目录下
注意一下
S打头的文件名在开始时才会被运行
而S后边的2位数字代表了运行序号(也可以用字母)
系统以数字,字母表里的顺序执行这些脚本
有些发行版会有/etc/rc.local
这个脚本在不管是哪个runlevel里
都会被执行(一般是开机时运行的那一堆脚本里的最后一个被运行 )
ubuntu下的更详细的关于这方面说明位于
/usr/share/doc/sysv-rc/README.runlevels.gz      
学习了。谢谢