Grub&initrd&initramfs详解

一、GRUB(Boot loader)
二、Grub命令行
三、Grub加密
四、进入单用户模式
五、Grub损坏,修复
六、救援模式
七、内核模块获取
八、ramdisk和initrd
九、内核信息输出的伪fs
十、initramfs和initrd的区别

一、GRUB(Boot loader)
    Grub:GRand Unified Bootloader
        Grub 0.x:grub legacy
        Grub 1.x:grub2
    grub legacy:
        stage:mbr
        stage1_5:mbr之后的扇区中,让stage1中的bootloader能识别stage2所在的分区上的fs
            //提供stage2的文件系统所需的驱动
        stage2:磁盘分区之上的,提供选择界面,供用户选择os
            stage2及内核等通常放置于一个基本磁盘分区
    配置文件:/boot/grub/grub.conf链接文件:/etc/grub.conf
    功用:
        
    1.提供菜单,并提供交互式接口
        e:编辑模式,用于编辑菜单
        c:命令模式,交互式接口
            root (hd0,0)  //CentOS7的
            kernel /vmlinuz-x86_64 ro root=/dev/mapper/vg0-root
            initrd /intramfs*.img
            boot //开机即可
        
        CentOS7:
            insmod gzio
            insmod part_msdos
            insmod xfs
            set root=(hd0,msdos1)/Centos7如何使用
            linux16 /vmlinuz-3.*.x86_64 root=/dev/mapper/centos-root ro //linux取代centos 6的kernel
                        //注意vmlinuz前面的 / 不能去掉
            initrd16 /initramfs-*.img
            boot //重新启动即可
        注意:linux16 root=/dev/mapper/centos-root 必须指定,否则会出错
            指定root文件路径
    2.加载用户选择的内核或OS
        允许传递参数给内核
        可隐蔽此菜单
    3.为菜单提供了保护机制
        为编辑菜单进行认证
        为启用内核或os系统进行认证
        
二、Grub命令行窗口
    help:获取帮助列表
    help root //查看root的帮助信息,设置grub的根设备
            //此时os尚未启动,但是grub有自己的fs驱动可以直接访问
            //但是grub的fs驱动是有限的,不可能太大,因此不能识别软fs,raid,lvm等
    help KEYWORD:详细帮助信息
            //boot是可以不单独分区的,根fs如果使用基本分区的话
            //但是根fs,必须能够被grub识别才可以
            //如果root直接指定根所在分区,boot文件也放在跟分区中也是可以的
            //这时grub root需要指定根所在分区,并能够识别该分区
    如何标识设备:
        (hd#,#) //第#块磁盘的,第#个分区
        (hd0,0) //
    find (hd#,#)/vmlinuz-   
    root DEVICE //设置根设备 root (hd0,0)
    kernel /PATH/TO/KERNEL_FILE  //vmlinuz:z标识压缩存放,设定本次启动时用到的内核文件
        //额外内核支持的很多参数
        init=/paht/to/init
        selinux=0
        root=/dev/mapper/centos-root //根文件系统所在
        ro 只读
        quiet 静默模式    
    initrd /PATH/TO/INITRAMFS_FILE //设定为选定的内核提供的额外的文件的ramdisk
    boot :引导启动选定的内核
============grub命令行窗=====================

一、菜单命令 
菜单命令只能用于grub配置文件的全局配置部分,不能用在grub命令行交互界面,菜单命令在配置文件中应放在其它命令之前。 
1、default  //设置默认启动的菜单项 
2、fallback  //设置启动某菜单项失败后反回的菜单项 
3、hiddenmenu //隐藏菜单界面 
4、timeout //设置菜单自动启动的延时时间 
5、title  //开始一个菜单项 
二、常规命令 
常规命令可以应该于配置文件和grub命令行交互界面,可使用的常规命令有 
1、bootp //通过bootp初始化网络设备 
2、color //设置菜单界面的颜色 
3、device //指定设备文件作为驱动器 
4、dhcp //通过DHCP初始化网络设备 
5、hide  //隐藏某分区 
6、ifconfig //手工配置网络设备 
7、pager //改变内部页程序的状态 
8、partnew //新建一个主分区 
9、parttype //改变分区的类型 
10、password 为菜单界面设置口令 
11、rarp //通过RARP初始化网络设置 
12、serial //设置串口设备 
13、setkey //设置键盘映射 
14、splashimage //设置GRUB启动时的背景图片文件 
15、termainal //选择终端类型  
16、tftpserver //指定TFTP服务器 
17、unhide //还原某隐藏分区 
三、命令行和菜单项命令 
命令行和菜单项命令可应该于GRUB配置文件的菜单项设置中,也可以用在GRUB命令交互界面。 
1、bolcklist //显示某文件所在分区位置(block list notation) 
2、boot //启动操作系统 
3、cat //显示文件内容  
4、chainloader //把启动控制权软交给另外的启动引导器 
5、cmp //比较两个文件 
6、configfile //加载已存在的GRUB配置文件 
7、debug //设置为debug模式 
8、displayapm //显示APM BIOS信息 
9、displaymem //显示内存配置 
10、embed //嵌入Stage 1.5文件 
11、find //查找包括某文件的所有设备 
12、fstest //测试文件系统 
13、geometry //显示某驱动器的物理信息 
14、halt //停止计算机运行(软件关机) 
15、help //显示GRUB的命令帮助信息 
16、impsprobe //查询对称多处理器(SMP)的信息 
17、initrd //加载initrd文件 
18、install //安装GRUB 
19、ioprobe //查询某驱动器的输入输出(I/O)端口 
20、kernel //引导操作系统内核  
21、lock //锁定某GRUB导菜单项,使其输入密码后才可启动 
22、makeactive //激活某主分区 
23、map //虚拟映射某驱动器 
24、md5crypt //使用MD5加密口令 
25、module //加载模块 
26、modulenounzip //加载模块不进行解压 
27、pause //暂停并等待按键 
28、quit //退出GRUB 
29、reboot //重新启动计算机 
30、read //读取内存中的内容 
31、root //设置GRUB的root设备 
32、rootnoverify //设备GRUB的root设备但不装载文件系统 
33、savedefault //保存当前的启动菜单项为默认启动 
34、setup //自动安装GRUB 
35、testload //从文件系统中测试读取某文件 
36、testvbe //测试VESA BIOS EXTENSION 
37、uppermem //强制设置主机上位内存的大小 
38、vbeprobe //查询VESA BIOS EXTENSION信息    
===============================================

三、Grub加密
    /etc/grub/grub.conf :Centos5,6
    配置项:        
        default=# //哪个用来默认启用,菜单项(title)编号从0开始
        timeout=5 //指定菜单选项等待选项的时长
        splashimage=(hd#,#)/PATH/TO/INITRAMFS_FILE //默认启用的界面
        //password [--md5] STRING:菜单编辑认证 //可以不用
        hiddenmenu=[0/1] //隐藏菜单
        title TITLE //定义菜单项“标题”
            root (hd#,#):grub查找stage2及kernel文件所在的设备分区,为grub的“根”
            kernel /PATH/TO/VMLINUZ_FILE [ARG] :启动的内核
            initrd /PATH/TO/INITRAMFS_FS  :内核匹配的ramfs文件
            //password [--md5] STRING:启动选定到的内核或os时进行认证
    加密命令:grub-md5-crypt    
        password --md5 jisdjfidjsifjsdiyeou
        password xiaoxin //可以明文存放,但是不安全
    CentOS7:
        grub2-setpassword
    
四、进入单用户模式
        1.编辑grub菜单(e命令)
        2.kernel 最后加上 single/1,s/S
        3.在kernel所在行,键入“b”命令 //Cenetos7 ctrl+x
    CentOS7:也是如此,只是仍然需要输入root密码来进入单用户模式            
        
五、Grub-instll/grub2-install
grub-install
    安装grub
        //建议先安装windows后安装linux
        grub-install / grub2-install
    安装新的grub        
        mkdir /mnt/boot
        mount /dev/sdb1 /mnt/boot //sdb是一个新硬盘
        grub-install --root-directory=/mnt /dev/sdb
                //指定root目录/mnt只需指定mnt即可,而不是/mnt/root
        grub将安装在sdb这个硬盘上的mbr中
        
    新加一个硬盘://当拆了第一个硬盘之后,他就变成了sda
        sdb1:boot
        sdb2:swap
        sdb3:/
    vim /mnt/boot/grub/grub.conf
        default=0
        timeout=5
        title CentOS (EXpress)
            root (hd0,0)
            kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash  //
            initrd /initramfs.img
    cp /boot/vmlinuz*  /mnt/boot/vmlinuz
    cp /boot/initramfs /mnt/boot/initramfs.img
    mkdir /mnt/boot/sysroot ; cd /mnt/boot/sysroot
    mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home mnt media
    
    ldd /bin/bash //查看bash依赖的库
    cp bash命令
    chroot /mnt/sysroot/   //切换根就可以了
    创建一个新的虚拟机
        然后使用刚才建立的硬盘
    
    
    破坏分区表:
        dd if=/dev/zero of=/dev/sda bs=200 count=1 //小于446,分区表不要破坏
        1.grub-install --roo-directory=/   /dev/sda
        2.grub 命令模式修复
            root (hd0,0) //必须有grub目录,里面的stage1,stage1_5都是存在的
            setup (hd0) //安装第一阶段到第一块硬盘上
            exit

六、救援模式    
    借助于光盘实现
    linux rescue //命令行键入,进入救援模式
    默认会挂载原有的os到/mnt/sysimage上
    chroot /mnt/sysimage
    grub-install --root-directory=/  /dev/sda
    exit //退出到光盘镜像
    reboot即可
    
    
练习:
    1.新加硬盘,提供直接单独运行bash系统
        硬盘:新加硬盘-->分区-->mount--
            sdb1:/mnt/boot: //sdb1挂载地        :: /mnt/boot/[vmliuz,intramfs,grub{grub.conf}]    //切换目录
            sdb3:/mnt/sysroot: //sdb3挂在地      ::bin[bash],etc,sbin..                            //真实的根
            grub-install: /mnt
            grub文件
                kernel ...  init=/bin/bash
        注:创建grub的那台主机,需要关机,才可以,否则kernel panic
    2.破坏本机bootloader,grub stage1,在救援模式下修复
    3.为grub设置保护功能
    
    ldd命令:输出共享库依赖
        ldd /bin/ls
        //第一个没有定义任何的,是真正定义调用其他库文件的入口
        左侧:库文件的名称
        右侧:库文件的路径
    ldd /bin/ls | grep -o "/lib.*.so.[[:digit:]]"
    ldd /bin/ls | grep -o "/lib.*.so.[^[:space:]]*" //非空白字符出现一次
    
七、内核模块获取
    uname命令:显示系统信息
    uname -s //kernel-name
        -r release
        -m machine,x86_64,i386
        -v 编译版本
        -n hostname
    lsmod //查看模块信息
        /proc/modules
        查看模块状态信息
    modinfo //显示模块的详细信息
        modinfo ext4
        modinfo //默认查找路径是/lib/modules/VERSION-release/
        -k kerel //多内核,指定其他kernel
        -F field //只显示指定字段的value值
            modinfo -F filename btrfs
        -n //显示文件路径
    modprobe:添加和删除模块
        modprobe -r //删除
        modprobe mou_name //装载
        -C //指定配置文件,默认配置文件/etc/modprobe.d/*.conf
        注意:正在使用的模块千万不要卸载
    depmode命令
        生成依赖关系,modules.dep和map files
        内核模块依赖关系文件及系统信息映射文件的生成工具
    模块装载和卸载的另一组命令
        insmod:
            insmod [filename] [module options...]
                filename:模块文件的文件路径
                insmod `modinfo -n btrfs` //存在依赖
                modprobe会自动解决依赖关系,而insmod需要手动解决    
                modinfo btrfs //会显示依赖关系
        rmmod :
            rmmod btrfs //不需要完整路径
            
    
八、ramdisk和initrd
    1.mkinitrd ,Centos5,6
    2.dracut,Centos6,7
    mkinitrd [options] [initrd-img] kernel-versio
    //为当前正在使用中的内核重新制作ramdisk文件
    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
    --with=[module] //手动加载其他模块到initrd文件中
    --preload //initramfs所听的模块,需要预先加载的模块
    dracut 命令
        //更底层,更功能更强悍
        dracut /boot/initramfs-$(uname -r).img $(uname -r)
    mkinitrd -v -f myinitrd.img $(uname -r)
        -f指定要创建的映像文件,指定内核版本
    
来自: http://man.linuxde.net/mkinitrd
        内核模块支持动态装载和卸载
    ramdisk:
        辅助性文件,并非必须,取决于内核是否能够直接驱动rootfs所在的设备
        目标设备驱动:例如
                目标设备驱动:scsi设备驱动
                逻辑设备驱动:逻辑设备驱动
                文件系统:例如xfs文件系统
        ramdisk是一个简装版的rootfs
    
九、内核信息输出的伪fs
    /proc :内核状态及统计信息的输出接口;同时,还提供了一个配置接口,/proc/sys
        参数:
            只读:信息输出,数字标识的进程目录
            可写:可接受用户指定的一个新value
                (1)sysctl命令
                    专用于查看和设置/proc/sys目录中的值的
                    sysctl -a //查看所有可供调的值
                    sysctl net.ipv4.ip_forward
                    sysctl -w net.ipv4.ip_forward=1 //赋值,临时生效
                    sysctl kernel.hostname=www.test.com //-w可带可不带
                    -w :仅仅是写入,默认不带
                    -p:重读配置文件
                (2)echo "value" >
                    文件系统命令(cat和echo)
                    查看:cat /proc/sys/PATH/TO/FILE
                    设定:echo "VALUE" > /proc/sys/PATH/TO/FILE

注意:上述两种方式的设定,仅当前运行内核有效
        配置文件
            /etc/sysctl.conf :CentOS6
            /etc/sysctl.d/*.conf :CentOS7
                net.ipv4.ip_forward = 1
            sysctl -p /etc/sysctl.d/a.conf //重读配置文件,立即生效
            注意:linux的地址是系统的不是网卡的,
                //一个ip能够达到该主机,则该主机上的所有网卡的地址都可以ping到,即使不在同一个网段
            echo 3 > /proc/sys/vm/drop_caches    //清空缓存
            
    /sys:    
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all //忽略别人的ping操作
        输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性可设置参数
        因此可通过此目录修改硬件特性
        
        udev //linux2.6之后,按需创建设备文件
            //读取/sys目录下硬件设备信息,按需为各硬件设备,创建设备文件
            //udev是用户空间程序,正是/sys的存在,使他能够读取设备信息,根据设备信息,创建设备文件
            //专用工具:udevadm,hotplug
            //有的是内核自己创建的,例如/dev/sda,结合udev实现
            
            udev为设备创建设备文件时,会去读其实现定义好的规则文件,一般在/etc/udev/rules.d/目录下,以及/usr/lib/udev/rules.d/目录下,以及/usr/lib/udev/rules.d目录下
            
    问题:克隆的虚拟机只有个eth1,就是没有eth0
        1./etc/udev/rules.d/70-persistent-net.rules
        2.修改网卡的配置文件
        3.卸载网卡模块,然后重新装载

十、initramfs和initrd的区别
boot loader装入kernel, 然后kernel需要执行/sbin/init, 读取 这个文件就必须先mount根文件系统, 早期是通过启动时的root=参数告诉内核根文件系统在哪个设备上,  随着硬件和技术的发展,现在根文件系统可能位于一个网络存储如NFS上, 可能由于RAID而
散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,这时root=参数就显得不够了. 为了应付这种局面, 先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动 过程的桥梁: initrd和initramfs, 两者有类似的地方, 比如都是
由内核执行其上的某个程序(initrd是/linuxrc, initramfs是/init),由这个程序决定加载什么驱动以及如何装载根文件系统.

initrd:
 ram disk是一个基于ram的块设备,因此它占据了一块固定的内存, 而且事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统 驱动来读写其上的文件。
 如果这个disk上的空间没有用完,这些未用的内存就浪费掉了,并且 这个disk的空间固定导致容量有限,要想装入更多的文件就需要重新格式化。
 由于Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache (对于文件数据)和dentry cache(对于目录项), 这个也导致内存浪费.

initramfs:
最初的想法是Linus提出的: 把cache当作文件系统装载. 他在一个叫ramfs的cache实现上加了一层很薄的封装, 其它内核开发人员编写了一个改进版tmpfs, 这个文件系统上的数据可以写出到交换分区, 而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存. initramfs就是
tmpfs的一个应用.
优点:
     (1)tmpfs随着其中数据的增减自动增减容量.
     (2)在tmpfs和page cache/dentry cache之间没有重复数据.
     (3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.
     (4)不需要额外的文件系统驱动.

另外, initrd机制被设计为旧的"root="机制的前端, 而非其替代物,它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统, 最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的. initrd机制找到真正的根设备后将
其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由其装载根文件系统并启动/sbin/init.

initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计.

Grub&initrd&initramfs详解

时间: 2024-08-07 07:12:41

Grub&initrd&initramfs详解的相关文章

linux下grub相关知识详解

一.grub相关知识详解 (1)grub:GRand Unified Bootloader grub 0.x :grub legacy grub 1.x : grub2 grub legacy: stage1:mbr的bootloader阶段 stage1_5:mbr之后的扇区,让stage1的bootloader能够识别stage2所在分区的文件系统 stage2:磁盘分区(/boot/grub/) 配置文件:/etc/grub.conf-->/boot/grub/grub.conf stag

grub救援修复详解(CentOS 5/6)

一.BootLoader引导加载程序 1.BootLoader(MBR中)分类: (1)Windows上引导加载器:ntloader (2)Linux上引导加载器: 1) LILO: 短小精悍的linux加载器,1024柱面之后无法加载,现在多用于安卓手机启动 2)GRUB:Grand Uniform Bootloader统一引导加载器 GRUB 0.X(CentOS 5/6):Grub Legacy传统版 GRUB 1.X(CentOS 7):Grub2,完全重写,设计理念上很大改变 2.GR

grub工具的详解

#Forever twenly one ,I have a lot of things to do.The morning sun always don't wake me. 阴天有小雨,我坐在17楼的窗前开始思考一台电脑是如何启动的,它怎么就那么神奇可以做那么多的事情,给我们的世界带来这么大的变化,虽然它只是一台没有生命的机器.假如它能够说话,它会对我说什么呢?它会说喊我出去玩吗或者喊我留下来陪它吗?它会思考我现在的烦恼吗?它会笑着对我唱歌吗?是我想太多还是它需要我去想它?都不是吧,是我一直离

3、linux启动顺序以及grub.conf文件详解

本节课主要讲解了linux的启动顺序以及grub.conf文件的详细讲解,后期的课程会更详细讲解linux的启动过程. 更多视频试听课程:http://yunpan.cn/cVSrHAk8ExAd9  访问密码 aa19

24、Linux启动流程和grub详解

还记得Windows的启动流程吗?相信大家能说出来个大概,为什么说出个大概呢,因为Windows是图形界面启动的,但是开机过程都做了什么,你知道吗,相反,Linux启动的时候,会把这些加载到屏幕上面显示,那接下来我们来看看Linux启动都发生了些什么把!!! Linux启动流程图 简解开机启动流程 当用户打开电源后,BIOS开机自检,确定启动设备,安装启动设备启动设备上面安装的GRUB开始引导Linux,Linux首先先进行内核引导,通过跟切换,执行init程序,init程序确定启动级别,根据启

redhat 5开机启动流程详解

(1)POST(Power On Self Test) 加电自检 电脑主机打开电源的时候随后会听到滴的一声响系统启动开始了开机自检POST. 自检开始这个过程中主要是检测计算机硬件设备比如CPU内存主板显卡等设备是否有故障存在.如果有硬件故障的话将按两种情况理对于严重故障(致命性故障)则停机此时由于各种初始化操作还没完成不能给出任何提示或信号对于非严重故障则给出提示或声音报警信号等待用户处理如果没有故障POST完成自己的接力任务将尾部工作交接给BIOS处理. (2)BIOS(bootloader

Centos6系统启动详解......

一.Linux内核的组成 Linux系统的组成部分:内核+根文件系统 内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序.安全功能(selinux) IPC(Inter-Process Communication进程间通信):就是指多个进程之间相互通信,交换信息的方法.Linux IPC基本上都是从Unix平台上继承而来的.主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC.另外,Linux也支持POSIX IPC. 运行中的系统环境可分为两层:内核空间.

详解 linux中的grub

grub是什么: grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后, 内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统 对应的驱动,挂载根分区,从而达到启动操作系统的目的. 在了解grub以前,请先大体上了解一下centos5/6的启动过程,然后再理解grub就更容易了, 还记的我们以前总结过的centos5系统启动流程吗,如下图,此处我们重点讨论下图红框中的步骤. centos5/6中使用grub作为bootl

引导工具GRUB详解

引导工具GRUB详解 导读 引导程序是驻留在硬盘第一个扇区(MPR.主引导记录)的程序.GRUB是一个功能强大的多系统引导程序,专门处理Linux与其它操作系统共存的问题.下面就由我介绍一下grub.conf文件里的具体内容及其含义. 使用一下命令可以查看grub.conf文件内容: #vi /boot/grub/menu.lst 参数解释 1. default=0 # default后加一个数字n,表示n+1个"title"操作系统,0表示第一个"title"?的