zoukankan      html  css  js  c++  java
  • linux日常运维(三) GRUB 2的维护

    GRUB 2简介
    GRUB

    GRUB是linux系统默认的引导加载程序。linux加载一个系统前,它必须有一个引导加载程序中特定指令(比如MBR记录)去引导系统。这个程序一般是位于系统的主硬盘驱动器或其他介质驱动器上。

    linux安装程序允许用户快速、方便地配置引导加载程序,将其存放在主硬盘驱动的主引导记录中来引导操作系统。

    GUN GRUB是一个将引导加载程序安装到主引导记录的程序,主引导记录是位于一个硬盘开始的扇区。它允许位于主引导记录区中特定的指令来加载一个GRUB菜单或是GRUB的命令环境。这使得用户能够开始操作系统的选择,在内核引导时传递特定指令给内核,或是在内核引导前确定一些系统参数(如可以的RAM大小)

    GRUB支持直接和链式加载的引导方法。GRUB能用户几乎所有操作系统、绝大多数流行的文件系统以及几乎所有的系统BIOS所能识别的硬盘。

    GRUB 2

    GRUB 2是GRUB的升级版,它实现了以下一些GRUB中所不具备的功能

    1. 图形接口
    2. 使用模块机制,通过动态加载需要的模块来扩展功能。
    3. 支持脚本语言,比如条件判断、循环、变量和函数
    4. 支持救援模式,可以用于系统无法引导的情况。
    5. 国际化语言。包括支持非ASCII额字符集和类似gettext的消息分类、字体、图形控制台等。
    6. 有一个灵活的命令行接口。如更不存在配置文件,GRUB 2会自动进入命令模式。
    7. 针对文件系统、文件、设备、驱动、终端、命令、分区表、系统加载的模块化、层次化、基于对象的框架。
    8. 支持多种文件系统格式。
    9. 可以访问以及安装设备上的数据。
    10. 支持自动解压。

    GRUB 2中设备和分区命名规则

    GRUB 2同样以fd表示软盘,hd表示硬盘(包括IDE和SCSI硬盘)设备是从0开始编号、分区则是从1开始,主分区为1~4,逻辑驱动器从5开始。下面介绍设备和分区的使用方法:

    • (fd0):表示第一个软盘
    • (hd0):表示第一个硬盘(大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待)
    • (hd0,msdos1):表示第一个硬盘的第一个分区
    • (hd0,msdos1)/boot/vmlinuz-3.10.0-327.e17.x86_64:表示第一个硬盘的第一个分区下的boot目录下的vmlinuz-3.10.0-327.e17.x86_64文件
    • (hd1,msdos1):表示第二硬盘的第一个分区
    • (cd):启动光盘(仅在从光盘启动GRUB时可用)
    • (cd0):第一个光盘
    GRUB 2主配置文件
    • /boot/grub2/grub.cfg文件(/etc/grub2.cfg文件是/boot/grub2/grub.cfg文件的软链接)
    • /etc/grub.d目录
    • /etc/default/grub文件(/etc/sysconfig/grub文件是/etc/default/grub文件的软链接)

    它们之间的关系是:/bot/grub2/grub.cfg文件里面通过"####BEGIN####"这种格式安装顺序调用/etc/grub.d目录中的脚本实现不同的功能。/etc/grub.d目录中有很多数字开头的脚本,按照从小到大的顺序执行。以00_header为例,它又会调用/etc/default/grub配置文件来实现最基本的开机界面配置。

    比如在/boot/grub2/grub.cfg文件里面调用/etc/grub.d/10_linux来配置不同的内核,这里面有两个menuentry(菜单项),所以开机的时候会看见两个默认选项,一个是普通模式,一个是救援模式。

    需要注意的是,最好不要直接去修改/boot/grub2/grub.cfg文件,这个是因为后期升级内核,所有 的配置都会失效。如更需要自定义这个文件,可以修改/etc/grub.d目录中对应的脚本或者/etc/default/grub文件,然后通过使用grub2-mkconfig命令重新生成/boot/grub22/grub.cfg文件。

    1. /etc/grub.d目录

    定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。

    在使用grub2-mkconfig命令生成配置文件时,需要加载/etc/grub.d目录。该文件描述如下

    文件描述
    00_header 设置grub默认参数
    10_linux 系统中存在多个linux版本
    20_ppc_terminfo 设置tty控制台
    30_os_prober 设置其他分区中的系统(硬盘中有多个操作系统时设置)
    40_custom和41_custom 用户自定义的配置
    1. /etc/default/grub是一个文本文件,可以在该文件中设置通用配置变量和GRUB2菜单的其他特性。在更改/etc/default/grub文件后,需要使用grub2-mkconfig命令更新GRUR2配置文件才能使更改生效。

    /etc/sysconfig/grub文件是根据/etc/default/grub文件生成的软链接文件,两者文件内容是一样的。

    [root@localhost ~]# ls -l /etc/sysconfig/grub
    lrwxrwxrwx. 1 root root 15 Jun  9 14:17 /etc/sysconfig/grub -> ../default/grub
    [root@localhost ~]# cat /etc/default/grub
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
    GRUB_DISABLE_RECOVERY="true"
    

    (一)GRUB_TIMEOUT=5 该参数用于设置进入默认启动项的等待实际,默认值5秒。可以设置为-1,这样就无限等待。

    (二)GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" 该参数由GRUB 的发布者设置它们的标识名。这用于产生更具信息量的菜单项名称。

    (三)GRUB_DEFAULT=saved 该参数用于设置默认启动项。比如要默认从第1个菜单项启动设置为0;要默认从第2个菜单项启动,设置为1;如果设置为saved,则默认为上次启动项。

    (四)GRUB_TERMINAL_OUTPUT="console" 该参数用于选择终端输出设备。在这可能可以选择多个设备,以空格分开。有效的终端输出名依赖于平台,不过可能包括console(PC BIOS及EFI控制台)、serial(串行终端)、gfxterm(图形模式输出)、ofconsole(开放固件控制台)或vga_text(VGA文本输出,主要用在Coreboot)

    (五)GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" 该参数用于手动添加内核启动参数。

    (六)GRUB_DISABLE_RECOVERY="true" 该参数用于设置是否启用修复模式。

    (七)GRUB_DISABLE_LINUX_RECOVERY="true" 该参数用于设置是否创建修复模式菜单项。

    (八)GRUB_HIDDEN_TIMEOUT=0 该参数不显示菜单,但会显示空白界面,设置实际内按任意键出现菜单。

    (九)GRUB_HIDDEN_TIMEOUT_QUIET=true 该参数用于显示空白界面时是否不出现倒计时。

    (十)GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 该参数用于添加默认内核启动参数

    (十一)GRUB_TERMINAL=console 该参数用于设置使用终端还是图形界面来引导。

    (十二)GRUB_GFXMODE=640x480 该参数用于设置图形界面分辨率。只能使用显卡支持的分辨率,具体可以在grub模式下输入vbeinfo查看。

    (十三)GRUB_DISABLE_LINUX_UUID=true 该参数用于设置是否使用UUID引导,即使用root=/dev/sdax h还是root=UUDI=XXX

    (十四)GRUB_INIT_TUNE="480 440 1" 该参数用于在GRUB启动时,调整扬声器的音量。

    设置GRUB 2加密

    由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。

    在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。

    GRUB 2密码支持以下两种格式

    • 明文密码:密码数据没有经过加密,安全性差
    • PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。
    设置GRUB 2PBKDF2加密口令

    先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。

    在/etc/grub.d/00_header文件中添加用户和PBKDF2加密口令的格式如下。

    cat << EOF
    set superusers="用户" 
    password_pbkdf2 用户  加密密码
    EOF
    
    1. 生成加密口令
    [root@localhost ~]# grub2-mkpasswd-pbkdf2
    
    1. 编辑/etc/grub.d/00_header文件
    2. 生成GRUB 2配置文件
    [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
    
    设置GRUB 2明文密码
    1. 修改/etc/grub.d/00_header文件在文件末尾添加以下内容
    cat << EOF
    set superusers="zhangsan"
    password zhangsan redhatlinux
    EOF
    
    1. 生成GRUB 2配置文件 使用以下命令生成GRUB 2配置文件/boot/grub2/grub.cfg
    [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
    
    GRUB 2解锁
    1. 重启linux系统,按e键编辑启动菜单项,此时提示输入"Enter username",输入上面加密的zhangsan用户和密码,解锁成功。
    2. 才可以进入启动菜单项的编辑界面。
    GRUB 2配置案例

    一.破解root用户密码

    centos7

    方法一:

    1. 在启动linux系统时按e键开始编辑GRUB 2配置文件。
    2. 将"ro crashkernel=auto rhgb quiet"可读属性更改为可写模式"rw crashkernel=auto rhgb quiet",并在其后加上"rd.break enforcing=0";按住Ctrl+x键进入命令行模式。
    3. 显示命令行模式"switch_root:/#"
    4. 重新挂载文件系统
    switch_root:/# mount -o remount, rw /sysroot
    

    改变根目录

    switch_root:/# chroot /sysroot
    

    会发现命令提示符变成

    sh-4.2#
    

    就可以使用命令更改root密码了

    sh-4.2# passwd
    

    按提示输入两遍,提示

    passwd:all authentication tokens updated successfully.
    

    说明root密码已经更改成功。 为了使selinux生效,必须执行/.autorelabel命令

    sh-4.2# /.autorelabel
    

    最后重启即可。

    sh-4.2# exec /sbin/reboot
    

    方法二

    1. 同上1
    2. 将"ro crashkernel=auto rhgb quiet"可读属性更改为可写模式"rw crashkernel=auto rhgb quiet",并在其后加上"init=/bin/sh";按住Ctrl+x键进入命令行模式。(注意必须在quiet后空格且在同一行增加)
    3. 显示命令行模式"sh-4.2#"
    4. 重新挂载文件系统
    sh-4.2# mount -o remount, rw /
    

    更改root密码

    sh-4.2# passwd root
    sh-4.2# touch /.autorelabel
    

    按提示输入两遍密码,提示成功。为了使selinux生效,必须执行touch /.autorelabel命令,输入exec /sbin/init或者exec /sbin/reboot重启即可。

    sh-4.2# exec /sbin/init
    

    二. 修改网卡名称

    1. 修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中添加net.ifnames=0 biosdevname=0。如下图
    [root@localhost ~]# vi /etc/default/grub
    [root@localhost ~]# cat /etc/default/grub
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"
    GRUB_DISABLE_RECOVERY="true"
    
    1. 生成GRUB 2配置文件
    [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-7ad525c9157940e3847220b1bdb8be06
    Found initrd image: /boot/initramfs-0-rescue-7ad525c9157940e3847220b1bdb8be06.img
    
    1. 查看网卡名称(先重启再查看)
    [root@localhost ~]# ip addr list
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:11:59:7c brd ff:ff:ff:ff:ff:ff
        inet 192.168.64.148/24 brd 192.168.64.255 scope global noprefixroute dynamic eth0
           valid_lft 1599sec preferred_lft 1599sec
        inet6 fe80::93e0:500f:62fc:c2a0/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    

    centos7 运行ifconfig提示命令不存在,而又想使用该命令时

    1. 查看ifconfig命令是否存在 说明命令存在
    [root@localhost ~]# ls /sbin/ifconfig
    /sbin/ifconfig
    

    如果ifconfig命令存在,查看环境变量设置

    [root@localhost ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sbin
    

    如果环境变量中没有包含ifconfig命令的路径 临时修改环境变量:在shell中输入

    [root@localhost ~]# $export PATH=$PATH:/sbin
    

    然后再输入ifconfig命令即可,但是这只是临时更改了shell中的PATH,如果关闭shell,则修改消失,下次还需要重复如上操作

    永久修改PATH变量使之包含/sbin路径:

    打开/etc/profile文件,在其中输入export PATH=$PATH:/sbin,保存并重启即可,这样一来,PATH路径永久修改成功,以后任何时候只输入ifconfig命令即可

    1. 如果命令不存在
    [root@localhost ~]# ifconfig
    -bash: /usr/sbin/ifconfig: No such file or directory
    [root@localhost ~]# yum install net-tools
    [root@localhost ~]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.64.148  netmask 255.255.255.0  broadcast 192.168.64.255
            inet6 fe80::93e0:500f:62fc:c2a0  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:11:59:7c  txqueuelen 1000  (Ethernet)
            RX packets 87945  bytes 127182988 (121.2 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8930  bytes 1058671 (1.0 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    摘自:《Linux实用教程》人民邮电出版社出版发行 於岳编著

  • 相关阅读:
    RAID中的Stripe size对性能的影响?
    TCP segmentation offload
    传统网络配置命令与IP高级路由命令
    WebTrends Log Analyzer
    linux使用vi中文乱码的解决办法
    链接静态库的顺序问题
    tcpdump命令格式
    怎样取得文件行数
    Tcpdump命令的使用与示例——linux下的网络分析
    Linux系统面面观 PROC文件系统详细介绍
  • 原文地址:https://www.cnblogs.com/mylive/p/11280241.html
Copyright © 2011-2022 走看看