ubuntu定期更新他们的iso,iso引导系统后会有Try/Install Ubuntu两个选项。特别是选择了livecd,仅仅一张盘子就能运行一个图形化的linux,总觉得挺神奇的。在好奇心的推动下我打算拆开iso分析它是怎样引导到系统的。

按常识,完整引导linux系统需要bootloader/kernel/(initrd)/fs这4个组件紧密配合(要不就叫启动4要素吧),光盘引导linux也一定是遵循这个过程,因此下文也按这个顺序展开。第一步当然得挂载iso,很可惜iso是只读的,因此要做修改还得把内容拷出来并修改权限。(注意,后面的命令都是用root帐户运行的)

root@ubuntu:~# rsync /media/Ubuntu\ 14.10\ amd64/ -a ~/Desktop/iso/

root@ubuntu:~# chmod -R 744 ~/Desktop/iso/

嗯,这里安装盘已经被分尸了,后面就可以一块块拿出来看看改改。首先看下bootloader的入口点,网上查了一把安装盘以isolinux.bin作为bootloader,位于isolinux/isolinux.bin。一般bootloader会读取用户配置文件从中取出引导参数。isolinux读取的配置文件位于同层目录isolinux/isolinux.cfg:

path

include menu.cfg

default vesamenu.c32

prompt 0

timeout 50

ui gfxboot bootlogo

打开后并没有见到/proc/cmdline中常见的kernel=xxx initrd=xxx之类的内容,不过仔细一看居然有include menu.cfg语句(具体参考islinux语法),想想就知道肯定是去包含其他配置文件。经过对include语句层层跟进,最终在isolinux/txt.cfg这个文件中找到熟悉的kernel引导项:

default live

label live

menu label ^Try Ubuntu without installing

kernel /casper/vmlinuz

append file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.lz quiet splash --

label live-install

menu label ^Install Ubuntu

kernel /casper/vmlinuz

append file=/cdrom/preseed/ubuntu.seed boot=casper only-ubiquity initrd=/casper/initrd.lz quiet splash --默认引导项是live。kernel文件位于casper/vmlinuz,initrd文件位于casper/initrd.lz同时,isolinux还向kernel提供了一个重要的参数boot=casper,初次看到这个参数,我以为这是告诉bootloader要从casper文件夹下寻找kernel和initrd文件,后来发现,并非如此,后面马上会提到。

既然bootloader都指定kernel的位置了,那我们就跟进到casper文件夹下

root@ubuntu:/media/Ubuntu 14.10 amd64# cd casper/

root@ubuntu:/media/Ubuntu 14.10 amd64/casper# ls

filesystem.manifest filesystem.size initrd.lz

filesystem.manifest-remove filesystem.squashfs vmlinuz.efi

root@ubuntu:/media/Ubuntu 14.10 amd64/casper#

看文件名的输出基本能猜到启动4要素中剩下的3个要素就在这几个文件里了。另外,看文件大小也知道光盘的核心数据在这个文件夹中。假设,bootloader已经把执行权交给kernel,就是casper/vmlinuz了(这个流程过于复杂我就略过了)。vmlinuz的最后会搜索根文件系统,由根文件系统检测系统配置并通过udevadm加载相应的modules,为进一步加载真实的fs做准备。可惜,这里的initrd双击打开什么都看不到,那就这么停止分析了么?当然不会,都分尸了,总的好好利用一下尸体吧~先分析一下initrd.lz的文件性质

root@ubuntu:~/Desktop/iso/casper# file initrd.lz

initrd.lz: LZMA compressed data, streamed    嗯,lzma压缩,好的,解压

root@ubuntu:~/Desktop/iso/casper# mv initrd.lz initrd.lzma

root@ubuntu:~/Desktop/iso/casper# lzma -d initrd.lzma

root@ubuntu:~/Desktop/iso/casper# ls|grep initrd

initrd

root@ubuntu:~/Desktop/iso/casper# file initrd

initrd: ASCII cpio archive (SVR4 with no CRC)

root@ubuntu:~/Desktop/iso/casper#    嗯,真调皮还经过cpio归档,再分解就能看到initrd的目录结构,这个结构和前面文章基本相同,毕竟这个initrd是mkinitramfs做出来的么:

root@ubuntu:~/Desktop/iso/casper# cpio -idmv < initrd

root@ubuntu:~/Desktop/iso/casper# ls

bin sbin

conf lib scripts

etc lib64 usr

init run var    好的,请打开init脚本,这是kernel加载initrd后执行的第一个进程,里面先挂载虚拟的文件系统然后设置了一堆变量:

#!/bin/sh

[ -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

# Some things don't work properly without /etc/mtab.

ln -sf /proc/mounts /etc/mtab

grep -q '\' /proc/cmdline || echo "Loading, please wait..."

# 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

if ! mount -t devtmpfs -o mode=0755 udev /dev; then

echo "W: devtmpfs not available, falling back to tmpfs for /dev"

mount -t tmpfs -o mode=0755 udev /dev

[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1

[ -e /dev/null ] || mknod /dev/null c 1 3

fi

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 /run/initramfs

export init=/sbin/init

export quiet=n

export readonly=y

export rootmnt=/root

...

for x in $(cat /proc/cmdline); do

case $x in

...

boot=*)

BOOT=${x#boot=}

;;

...

esac

done    重要的来了,init脚本分析/proc/cmdline并以此设置参数,前面引导kernel时提到isolinux会向kernel传递参数boot=casper,目的就是设置BOOT变量,再来看下这个变量做了啥?

export BOOT

# Don't do log messages here to avoid confusing graphical boots

run_scripts /scripts/init-top

maybe_break modules

[ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers"

load_modules

[ "$quiet" != "y" ] && log_end_msg

[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"

maybe_break premount

[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"

run_scripts /scripts/init-premount

[ "$quiet" != "y" ] && log_end_msg

maybe_break mount

log_begin_msg "Mounting root file system"

. /scripts/${BOOT} #关键的一行

parse_numeric ${ROOT}

maybe_break mountroot

mountroot #挂载fs函数

log_end_msg    加载modules后,init根据BOOT的值,include几个文件,对于光盘启动就是casper/initrd/scripts/casper这个shell脚本,这个脚本提供了mountroot挂载fs函数的实现

root@ubuntu:~/Desktop/iso/casper/scripts# file casper

casper: POSIX shell script, ASCII text executable

一下摘取了casper脚本的部分代码,具体分析日后再说!

mountroot() {

exec 6>&1

exec 7>&2

exec > casper.log

exec 2>&1

tail -f casper.log >&7 &

tailpid="$!"

parse_cmdline

[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/casper-premount"

run_scripts /scripts/casper-premount

[ "$quiet" != "y" ] && log_end_msg

经过initrd的一番折腾,最终是要去挂载fs了。和initrd一样,fs是个压缩过的镜像,镜像名casper/filesystem.squashfs。为了解剖这个镜像需要换把剔肉刀:squashfs-tools

root@ubuntu:~/Desktop/iso/casper# apt-get install squashfs-tools

解压是个漫长的过程,特别是在虚拟机中可以看一个视频净化一下心灵:

root@ubuntu:~/Desktop/iso/casper# unsquashfs filesystem.squashfs

Parallel unsquashfs: Using 1 processor

174753 inodes (185772 blocks) to write   解压后多了一个squashfs-root的目录,ls看一下里面就是运行livecd时用到的文件系统。

root@ubuntu:~/Desktop/iso/casper/squashfs-root# ls

bin dev home lib media opt root sbin sys usr

boot etc initrd.img lib64 mnt proc run srv tmp

root@ubuntu:~/Desktop/iso/casper/squashfs-root    好,这篇解剖报告到此为止,剧透一下后两篇的安排,制作initrd(6)应该是定制fs 制作initrd(7)是分析initrd中casper脚本的内容

安装linux系统initrd,制作initrd(5):解剖Ubuntu安装盘相关推荐

  1. u 盘安装linux系统,CentOS 7 系统安装之 U 盘安装法

    [TOCM] 一.前言 家里闲置一台神州牌笔记本电脑,由于配置比较低,年代为古董级别,恋旧物情节严重,实在不忍心将其抛弃,于是乎,重新启用,安装 Linux 系统最小安装,用于测试程序开发调试,发挥余 ...

  2. 不用启动盘安装linux系统,不用制作启动盘安装Windows操作系统的最简单办法

    网上流传和被熟知的重装Windows操作系统的办法的前几个步骤通常要制作U盘启动盘或光盘启动盘,在重启计算后全新安装操作系统.这对于没有U盘或者光盘.没有光驱又想全新安装Windows操作系统(也就是 ...

  3. iPhone4S安装Linux系统,用iPhone 4S带着Ubuntu Linux上网

    其实让电脑都过iPhone上网的方式无外乎三种,wifi,蓝牙和USB. 我的上网本上没有蓝牙模块,而通过wifi热点的方式以前也写过帖子了,今天主要来试试USB数据线的方式. 在Windows平台下 ...

  4. linux自定义iso,制作自定义CentOS的ISO安装盘

    一.下载CentOS镜像文件 CentOS镜像链接:http://vault.centos.org/ 本文以CentOS 7.3为例 二.使用vmware安装centos 安装过程自行百度 三.制作I ...

  5. 启动U盘安装linux系统

    启动U盘安装linux系统 1.制作启动U盘 下载 大白菜 等制作工具可做 2.下载linux .ios镜像 网上搜 centos 去下载 3.把镜像植入U盘 下载 uitraios 软件 可植入 未 ...

  6. linux initrd模式,在Linux系统上开启Initrd文件系统的方法

    initial RAM disk Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程.initrd文件中包含了各种可执行程序和驱动程序,它们可 ...

  7. 一键装机linux_linux系统安装,怎样安装linux系统制作步骤

    如何安装linux系统图-6 安装步骤图-7 4,等待镜像制作完毕后,我们就能在系统里看到制作好的U盘,此时U盘的名称都变成了CentOS 7,如下图所示,我们把U盘拔下来,插到要安装Linux的电脑 ...

  8. win10安装linux系统视频播放器,u盘安装linux视频mac制作win10安装u盘

    5. 用柔软的湿布清除打印机内部灰尘.污迹.墨水渍和碎纸屑,防止损坏.其次,用万用表检查外部电压是否符合要求,雨林木风win8系统,电压过高或过低都可能引起主机电源发生过压或欠压电路的自动停机保护 飞 ...

  9. mac+usb安装linux系统安装,Mac OS X下制作安装Linux系统的USB启动盘

    帮同学把Linux安装到他们做的一个类似Mac mini大小(一个小盒子)的机器里面.这个其实就是一个pc,不过是基于atom的cpu.经过一 帮同学把Linux安装到他们做的一个类似Mac mini ...

最新文章

  1. 如何利用 C# 实现 K 最邻近算法?
  2. 修改点击cell时显示的颜色
  3. Eclipse VIM
  4. 【SpringBoot零基础案例02】【IEDA 2021.1】SpringBoot框架集成SpringMVC
  5. NiFi 脚本执行器使用指南 (part 3)
  6. springsecurity文档_今天学了springsecurity
  7. HDUOJ--汉诺塔II
  8. 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个...
  9. 那些月入1万的自媒体大咖,惯用的4个爆款选题分享给你
  10. Collectors.toSet()
  11. L337. 打家劫舍 III
  12. 【解决方案】关于自动生成表hibernate_sequence的问题
  13. 又拍云php接口,又拍云 API 使用的那些小事
  14. forwarding
  15. 一道按顺序排列组合题的几种解法
  16. 如何用本地连接共享无线网络连接
  17. 输入一个字符串,逆序并输出
  18. background-attachment: fixed
  19. vue-router 路由 pushstate replacestate popstate 详解
  20. 《机电一体化系统设计》

热门文章

  1. W ndows主进程已停止,windows主进程rundll32已停止工作的四种解决方法介绍
  2. 如何下载宝坻区卫星地图高清版大图
  3. Linux 常见命令四大类
  4. matlab的mex安装,matlab安装使用mex
  5. 备战NOIP每周写题记录(一)···不间断更新
  6. Android自定义定时闹钟开发详解
  7. STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302
  8. ios开发特殊符号大全:字符+键盘符...
  9. OF-Config介绍
  10. 民航上的第一课和最后一课