Linux自学笔记——grub应用

简介:

 

GRUB(Boot Loader)

      GRUB,GRand Unified Bootlader ,是一个来自GUN项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

grub版本:

      grub 0.x:grub(legacy) centos 5,6

      grub 1.x:grub2              centos 7

grublegacy

      stage1:mbr,主引导目录;

      stage1_5:mbr之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统;

      stage2:磁盘分区(/boot/grub)

      配置文件:/boot/grub/grub.conf <--/etc/grub.conf

      wKiom1murWGin91FAACOwKLMZ_0307.png-wh_50

工作流程:当系统启动时,如果要加载grub所在的磁盘时,会读取这个磁盘的MBR,同时会加载stage1,stage1会尝试读取后扇区的stage1_5阶段,stage1_5阶段会帮助stage1中的bootloader识别stage2所在的分区上的文件系统,然后加载stage2所在的磁盘分区,这个分区不但有stage2阶段,还有内核和ramdisk等。

Stage2及内核等通常放置于一个基本磁盘分区:

功用:

(1)提供菜单、并提供交互式接口

        e:编辑模式,用于编辑菜单;

        c:命令模式,交互式接口;

(2) 加载用户选择的内核或操作系统

        允许传递参数给内核

        可隐藏此菜单

(3)为菜单提供了保护机制

        为编辑菜单进行认证

        为启用内核或操作系统进行认证

      如何识别设备:

      (hd#,#)

           hd#:磁盘编号,用数字表示;从0开始编号

           #:分区编号,用数字表示;从0开始编号

           (hd0,0)

grub的命令行接口

      help:获取帮助列表;

      wKiom1murcqCOwO5AABn2jyiWH0768.png-wh_50

      help KEYWORD:详细帮助信息;

      find (hd#,#)/PATH/TO/SOMEFILE:查找某个磁盘上的某个文件;

      wKiom1murdbRzmyVAAAhH4rZj-A518.png-wh_50

      root (hd#,#):设置grub的根设备

kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核;额外还可以添加许多支持内核使用的cmdline参数:

例如:init=/path/to/init, selinux=0

常用内核启动参数:

磁盘相关启动参数:

   root     #指出启动的根文件系统  如:root=/dev/sda1

   ro  #指定根设备在启动过程中为readly-only,默认情况下一般都是这样配的

   rw  #和ro类似,为read-write,可写

   rootfstype 根文件系统类型,如:rootfstype=ext4

     console和kernel log相关的启动参数:

   console #console的设备和选项,如:console=tty0console=ttyS0

   debug        #enable kerneldebugging   启动中的的所有debug信息

   quiet          静默模式 将kernel loglevel设置为KERN_WARNING,在启动中指非常严重的信息

loglevel        #设置默认的console日志级别,如:loglevel=7(0~7数字分别为KERN_EMERG,…,KERN_DEBUG)

time             #设置在每条kernel log信息前加一个时间戳

              内存相关的启动参数:

                 mem         #指定kernel使用的内存量,mem=n[KMG]

                 hugepages #设置大页表页(4MB大小)的最多个数,hugepages=n

               CPU启动的相关参数:

                 mce          # Enable the machine check exception feature.

                 nosmp      #Run as a single-processor machine. 不使用SMP(多处理器)

                 max_cpus   #max_cpus=n, SMP系统最多能使用的CPU个数(即使系统中有大于n个的CPU)

               Ramdisk相关的启动参数:

                 initrd        #指定初始化ramdisk的位置,initrd=filename

                noinitrd    #不使用initrd的配置,即使配置了initrd参数

            初始化相关启动参数:

                  init       #在启动时去执行的程序,init=filename,默认值为/sbin/init

            PCI相关的启动参数:

                    pci       #pci相关的选项,我常使用pci=assign_buses,也使用过pci=nomsi

            SELinux相关启动参数:

                  enforcing  #SELinux enforcing状态的开关,enforcing=0表示仅仅是记录危险    而不是阻止访问,enforcing=1完全enable,默认值是0

                selinux     #在启动时关闭或开启SELinux,selinux=0表示关闭,selinux=1表示开启selinux

          initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供的额外的文件的ramdisk;

      boot:引导启动选定的内核;

手动在grub命令行接口启动系统:

      grub> root(hd#,#)

      grub> kernel /path/to/kernel_file roroot=/dev/device

      grub> initrd /path/to/initramfs_file

      grub> boot

配置文件:/boot/grub/grub.conf

wKioL1murmDCp7f-AABwh1BAams081.png-wh_50

配置项:

      default=#:设定默认启动的菜单项;落单项(title)编号从0开始;

      timeout=#:指定菜单项等待选项选择的时长;

      splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜单背景图片文件路径;

      hiddenmenu:隐藏菜单;

      password [--md5] STRING菜单编辑认证;

      title TITLE:定义菜单项“标题”,可出现多次;

           root (hd#,#):grub查找stage2及kernel文件所在的设备分区;为grub的根;

           kernel /PATH/TO/VMLINUZ_FILE[PARAMENTERS]:启动的内核

           initrd  /PATH/TO/INITRAMFS_FILE:内核匹配到的ramfs文件;

           password [--md5] STRING:启动选定的内核或操作系统时进行认证;

grub-md5-crypt命令,可生成密钥。

对grub菜单编辑认证和启动选定内核认证:

1.     运用grub-md5-crypt命令生成密钥:

wKiom1murorTRRXSAAAT-1OLVLc062.png-wh_50

2.     编辑grub配置文件:

wKiom1murpWz1MIyAACEJY6VnGs841.png-wh_50

3.     重启系统,进入grub菜单模式,会发现需要密码才能进入菜单;

wKiom1murqChhno0AAAiFgAflVc698.png-wh_50

4.     输入密码,按回车键发现可以编辑;

wKiom1murq3wTTrxAAAlYaORKtk485.png-wh_50

5.     启动启动系统发现也需要密码;

wKioL1murpqS3wFCAAACjHaPipQ102.png-wh_50

6.     输入密码便可进入系统;

 

进入单用户模式:

(1)             编辑grub菜单(选定要编辑的title,而后使用e命令);

wKiom1mursjiiI7lAAAjT9WgUwU667.png-wh_50

(2)             在选定的kernel,键入e命令进入编辑

wKioL1murriDxctPAAAzp3vC280076.png-wh_50

(3)             在选定的kernel后附加1,s,S或single都可以,回车;

wKiom1murwSwIfHbAAAeY_FM4z8223.png-wh_50

(4)             在kernel所在行,键入b命令;

wKioL1murvLylWBTAAA0VmEC4oA340.png-wh_50

(5)             进入单用户模式;

wKiom1murx6xE4i-AAANQra3eq4730.png-wh_50

      如需修改密码,进入单用户模式后可使用passwd命令修改密码;

安装grub:

(1)            grub-install

grub-install--root-directory=ROOT /dev/DISK

(2)            grub

grub>root(hd#,#)

grub > setup(hd#)

练习:

1.     新加磁盘,提供直接单独运行的bash系统

1)          对新加的硬盘进行分区,并检查分区是否成功;

wKiom1muryySadFWAABjJLjS3Ow223.png-wh_50

2)          对分区进行格式化,/dev/sdb1,3格式化为ext4分区,/dev/sdb2格式化为swap分区

wKiom1murzmjP67OAADYgEeDQis854.png-wh_50

3)          创建挂在目录/mnt/boot,并将/dev/sdb1挂载至此目录;

wKioL1mury3Qpw7HAAA-LiXTMDs823.png-wh_50

4)          安装grub至新硬盘的基本文件系统上,使用grub-install,grub-install会自动寻找boot目录,指定根目录时只需要指定到boot目录的上一级目录即可;

wKioL1murzjRt2JjAAA57-llWOI521.png-wh_50

5)          复制内核和initramfs到新硬盘的boot目录下;

wKiom1mur2Sz37uQAAAhunHktvc718.png-wh_50

6)          创建grub配置文件;

wKiom1mur3HDwH-EAAATO0HpyzY877.png-wh_50

7)          为新硬盘的根分区创建常用的一级子目录

wKioL1mur2KAgbwMAAB-B8R7tZU690.png-wh_50

8)          复制bash程序到新硬盘的对应目录下;

wKiom1mur43iAvQkAAAS1Y_Y9Ug158.png-wh_50

9)          复制完bash后需要将bash所依赖的动态库复制到对应目录下,首先查看二进制程序所依赖的动态库;

wKioL1mur3yAqaUTAAAoHQ0ZPHo287.png-wh_50

10)     复制bash所依赖的动态库;

wKiom1mur6aj6dSnAAAtLEM6NuE590.png-wh_50

11)     切换根,并测试bash是否可用;

wKiom1mur7KTGn1dAAAVGGeUo3Y128.png-wh_50

12)     找到磁盘文件,将其作为新的虚拟机的磁盘使用;

wKioL1mur6OTlNwJAACSNMKjvpA733.png-wh_50

13)     新建虚拟机,磁盘选择现有的磁盘;

wKiom1mur9LxuEZKAAAlsfz_aqE824.png-wh_50

14)     此时开启虚拟机,系统启动失败,因为内核默认启用了selinux,故需要通过grub编辑模式在选择init之前输入selinux=0,这时启动将顺利进行,启动完毕后可以使用bash;

wKioL1mur8GgsZiSAABPQyn4dqQ854.png-wh_50

进入grub编辑模式,设置后重新启动,便可进入;

wKiom1mur-qyMXDqAABS6fD1en8247.png-wh_50

 

2.     破坏本机grub stage1,而后在救援模式下修复之;

1)          破坏本机的grub stage1;

#dd if=/dev/sdaof=/root/mbr.bak count=1 bs=512 备份

#dd if=/dev/zeroof=/dev/sda count=200 count=1   破坏

#sync    设置同步到磁盘

2)          如果系统还处于开机状态,使用grub-install命令安装修复;

#grub-install–root-directory=/    /dev/sda

#sync

或者可以用grub命令进入命令行模式进行修复;

#grub

grub>root(hd0, 0)

grub>setup(hd0)

3)          如果系统已经处于关机状态,便需要使用紧急救援模式;

1.     挂载,重启系统,选择rescure installed system,按esc键

wKioL1musCCQvp0OAAZbDu-IQxk841.png-wh_50

2.     输入 linux rescue 回车;

wKiom1musFTBMVbgAABhOrkh2OQ630.png-wh_50

3.     选择语言;

wKioL1musGeztsIDAABF0gVywo0600.png-wh_50

4.     选择键盘;

wKiom1musJjS5F4bAAC9E4UhmqQ230.png-wh_50

5.     开启网卡,此处也可以选择不开启;

wKioL1musJ7i1ut7AACCQiuO9HU361.png-wh_50

6.     选择继续;

wKiom1musMnQT2_FAAGs53R_f5I902.png-wh_50

7.     选择ok继续;

wKioL1musLzyFOqRAABIJrCsTq4733.png-wh_50

8.     点击ok进入修复模式;

wKiom1musPeQIDuBAAAxvSqqx9E314.png-wh_50

9.     切换到实际的根目录,执行grub-install命令;

wKiom1musQKT9hamAABHTcVO4pc714.png-wh_50

10.用exit退出到修复模式,reboot重启系统便可顺利进入系统了;




本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/1962955,如需转载请自行联系原作者

相关文章
|
2月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
134 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
16天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
35 5
|
1月前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
96 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
4月前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
245 3
|
4月前
|
存储 Linux 开发工具
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
|
4月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
|
Linux Shell Web App开发
Linux系统诊断小技巧(13):启停问题之如何修复grub损坏
grub损坏,是导致系统启动失败比较常见的致因之一,重新安装即能修复。但是系统没有启动,怎么重新安装gurb呢?有哪些要注意的事项?
2884 0