ubuntu-18.04.1-desktop-amd64.iso initrd 基本文件系統中啓動腳本分析 (1)

1.  解壓 ubuntu-18.04.1-desktop-amd64.iso

2. 查看 boot/grub/grub.cfg,知道引導文件系統是 /casper/initrd.lz

menuentry "Try Ubuntu without installing" {
    set gfxpayload=keep
    linux    /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash ---
    initrd    /casper/initrd.lz
}

3. 解壓 /casper/initrd.lz 到initrd目錄,結構如下

4. 首先查看 init腳本文件,kernel將在啓動後首先默認執行它,除非啓動參數另外指定。

4.1 建立基本系統設備目錄以支持應用程序運行,其中提前從啓動參數提取quiet全局變量是因爲它可能會被udev腳本引用。

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc

case " $(cat /proc/cmdline) " in
*\ quiet\ *)
    quiet=y
    ;;
*)
    quiet=n
    echo "Loading, please wait..."
    ;;
esac
export quiet

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
mount -t devtmpfs -o nosuid,mode=0755 udev /dev
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
mkdir -m 0755 /run/initramfs

導出全局變量 DPKG_ARCH

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

/conf/arch.conf內容很簡單

DPKG_ARCH=amd64

 導出有關變量,之後會在解析啓動參數時對設定項進行賦值,init腳本運行結束時,這些變量大都會被用unset命令釋放掉,避免增加無謂的系統負擔,這一點值得學習。

# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export IP=
export IP6=
export BOOT=
export BOOTIF=
export UBIMTD=
export break=
export init=/sbin/init
export readonly=y
export rootmnt=/root
export debug=
export panic=
export blacklist=
export resume=
export resume_offset=
export drop_caps=
export fastboot=n
export forcefsck=n
export fsckfix=
export recovery=

設置hostname,要定製的話修改 etc/hostname的值,默認似乎沒有這個文件。

# mdadm needs hostname to be set. This has to be done before the udev rules are called!
if [ -f "/etc/hostname" ]; then
        /bin/hostname -F /etc/hostname >/dev/null 2>&1
fi

導出各種需要的外部變量(*.conf)和函數定義(/scripts/functions)。後面用的比較多的是maybe_break() 和run_scripts()

# Bring in the main config
. /conf/initramfs.conf
for conf in conf/conf.d/*; do
    [ -f ${conf} ] && . ${conf}
done
. /scripts/functions

之後是解析啓動參數 /proc/cmdline,比較常用的有init=,root=,boot=

    init=*)
        init=${x#init=}
        ;;
    root=*)
        ROOT=${x#root=}
        if [ -z "${BOOT}" ] && [ "$ROOT" = "/dev/nfs" ]; then
            BOOT=nfs
        fi
        ;;

    boot=*)
        BOOT=${x#boot=}
        ;;

如果沒有指定boot,將會設置默認值local,爲什麼不在之前定義時直接設置呢?恐怕是擔心送的參數就是空的情況(boot= )

# Default to BOOT=local if no boot script defined.
if [ -z "${BOOT}" ]; then
    BOOT=local
fi

之後是系統恢復變量的設置,暫時沒有關注,童鞋自己分析吧。

if [ -n "${noresume}" ] || [ "$RESUME" = none ]; then
    export noresume=y
    unset resume
else
    resume=${RESUME:-}
fi

 之後是很重要的初始化腳本調用過程,將在“ubuntu-18.04.1-desktop-amd64.iso initrd 基本文件系統中啓動腳本分析 (2)”中詳述。以下是簡略的初始化腳本或函數調用過程

/scripts/init-top
load_modules
/scripts/init-premount
. /scripts/local
. /scripts/nfs
. /scripts/${BOOT}
parse_numeric ${ROOT}
mount_top
mount_premount
mountroot
mount_bottom
nfs_bottom
local_bottom
/scripts/init-bottom

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章