CentOS

Centos7安装

Centos7安装

  • centos7镜像下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/
    • CentOS-7-x86_64-DVD-1810.iso 标准安装版,一般下载这个就可以了(桌面推荐)
      • 如果无桌面版,可进行安装图形界面,yum -y groupinstall "GNOME Desktop" "Graphical Administration Tools"
      • systemctl set-default graphical.target 将默认模式修改为图形界面模式
      • systemctl set-default multi-user.target 将默认模式修改为命令行模式
    • CentOS-7-x86_64-Minimal-1810.iso 精简版(服务器推荐)
    • CentOS-7-x86_64-NetInstall-1810.iso 网络安装镜像(从网络安装或者救援系统)
    • CentOS-7-x86_64-Everything-1810.iso 对完整版安装盘的软件进行补充,集成所有软件
    • CentOS-7-x86_64-LiveGNOME-1810.iso GNOME桌面版
    • CentOS-7-x86_64-LiveKDE-1810.iso KDE桌面版
  • 使用UltraISO刻录到光盘
  • BIOS启动进入安装命令行进行安装,一般选择第一个命令进行安装
    • 正常会很快一路显示[OK],如果突然卡死后提示dracut-initqueue : Warning: dracut-initqueue timeout - starting timeout scripts解决办法 ^1
      • 等待执行完进入dracut命令行,ls /dev | grep sd 查看U盘对应的盘符,如测试时机器本身包含centos系统且含有两块硬盘,根据U盘大小大致可以猜测为sdcx的盘符名(如:sdc4,如果是CD/DVD安装则可能是/dev/cdrom)
      • reboot重新启动,并重新安装,此时修改执行的安装命令
      • 在安装命令行主界面,按e/Tab进入到命令修改状态
      • 修改vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64.check quietvmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdc4 quiet (/dev/sdc4为U盘所在位置)
      • 然后Ctrl+x执行安装
      • 方式二:修改U盘/isolinux/isolinux.cfghd:LABEL=U盘名称
  • 进入到CentOS图形化安装界面
    • 修改时区Date & Time
    • INSTALLATION DESTINATION进行磁盘分区 - i will configure partitioning手动进行分区 - 选择LVM(会产生/dev/mapper/centos-root的镜像文件)标准分区 - 可通过+-添加新分区或删除历史分区(老系统分区) - 点击+新增分区,其他使用默认值(默认文件系统xfs,也可改成ext4),分区推荐
      • (省略)/boot/efi 500M
      • /boot 1G
      • /swap 4G(8G/16G内存可分配4G,再按内存适当调高,如32G分6G)。最终显示如tmpfs
      • / 80G
      • /home 剩余

Centos7使用

  • 设置家目录为因为,保留系统语音为中文
    • 设置 - 区域语言 - 选择English - 重启 - 注销账户重新登录 - 登录后提示会修改家目录(为英文) - 点击更新成新名称
    • 设置 - 区域语言 - 选择中文 - 重启 - 注销账户重新登录 - 登录后提示会修改家目录(为中文) - 勾选不用再提示 - 点击保持原名称
  • CentOS7设置笔记本合盖后程序仍可以运转

    1
    2
    3
    4
    5
    6
    # https://blog.csdn.net/m0_49400972/article/details/108861639
    vi /etc/systemd/logind.conf
    # 修改 HandleLidSwitch 盒盖行为
    HandleLidSwitch=lock
    # 重启配置
    systemctl restart systemd-logind
  • wifi无法连接

1
2
3
4
5
ip addr
# 开启wifi对应网卡
sudo ip link set wlp5s0 up
# 扫码wifi网络
sudo iw wlp5s0 scan | grep SSID

启动原理及设置

  • 开机启动在/var/log/messages中会打印kernel: Initializing cgroup subsys cpuset的日志,可通过dmesg查看

系统启动顺序boot sequence

linux-boot.png

  • BOIS加电自检:加电后检查,载入UEFi或BIOS的硬件信息,然后按照CMOS设置的启动顺序搜索处于活动状态并可以引导的设备(BIOS页面设置的启动盘先后顺序)。相当于BIOS页面启动完成 ^2
  • 加载主引导程序(MBR):读取第一个引导设备(一般为硬盘)的MBR(master boot record)中保存的引导加载程序(Redhat默认的引导程序是GRUB/GRUB2)

    1
    2
    3
    4
    5
    6
    7
    # 显示MBR内容。dd命令可以读取MBR的内容,然后将读取到的内容写入mbr.dmp文件中。然后以ASCII和十六进制显示文件的内容
    dd if=/dev/sda of=mbr.dmp bs=512 count=1
    od -xa mbr.dmp
    # 结果如
    0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
    k H dle dle so P < nul 0 8 nul nul so X so @
    ...
  • 加载次引导程序(GRUB):加载此引导程序完成后,会进入内核程序选择页面

    • 按上下可选择需要启动的内核,不选择的话,默认过5秒会进入到grub.conf中设置的系统,GRUB确定启动的系统后,他就会定位相应的内核映像所在的/boot/目录
    • 内核映像文件的格式:/boot/vmlinuz-<内核版本>。例如centOS5.5的内核映像文件就是:/boot/vmlinuz-2.6.18-194.el5
    • 接着GRUB会把内核的映像加载到内存中去,内核映像不是一个可以执行的内核,而是一个压缩的内核映像,GRUB会把这个内核的映像解压,加载到内存中并执行,至此GRUB的任务完成了
    • cat /boot/grub2/grub.cfg(centos6使用grub,centos7使用grub2) 查看文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      # 此文件为自动生成的文件,如需修改配置,需要修改 /etc/default/grub
      # DO NOT EDIT THIS FILE
      #
      # It is automatically generated by grub2-mkconfig using templates
      # from /etc/grub.d and settings from /etc/default/grub
      ...
      terminal_output console
      if [ x$feature_timeout_style = xy ] ; then
      set timeout_style=menu
      set timeout=5 # timeout设置超时时间,超过5秒后自动启动default设置的系统
      # Fallback normal timeout code in case the timeout_style feature is
      # unavailable.
      else
      set timeout=5
      fi
      ### END /etc/grub.d/00_header ###
      ...
      ### BEGIN /etc/grub.d/10_linux ###
      # 第0个操作系统(默认启动系统)
      menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-1c209100-7448-47e9-9c52-81100bf323e4' {
      load_video
      set gfxpayload=keep
      insmod gzio
      insmod part_msdos
      insmod xfs
      # (hd0,0) 或 hd0,msdos1 表示的就是第一块硬盘的第一个主分区
      set root='hd0,msdos1'
      if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 921591b3-9fbe-4b53-915c-002f93be36c3
      else
      search --no-floppy --fs-uuid --set=root 921591b3-9fbe-4b53-915c-002f93be36c3
      fi
      linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
      initrd16 /initramfs-3.10.0-957.el7.x86_64.img
      }
      # 第1个操作系统
      menuentry 'CentOS Linux (0-rescue-9fb4cc8b7e504b66bf1e6d2117ade7be) 7 (Core)' --class centos ...
      ...
    • /etc/default/grub 配置说明

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      ### 修改启动内核顺序 
      ## cat /etc/default/grub
      #开机时 grub 默认5秒后启动内核
      GRUB_TIMEOUT=5
      GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
      # 可修改为0/1..., 这里0代表第一个内核,1代表第2个内核
      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.cfg文件,我们在下次启动的时候就会默认选择新的默认内核
      grub2-mkconfig -o /boot/grub2/grub.cfg

      ### 加密grub防止通过单用户系统破解root密码
  • 加载linux内核镜像:GRUB把内核映像加入到内存中后,解压Kernel,并把控制权交给linux内核后,尝试驱动硬件

  • 加载init进程:Kernel执行init程序,进程号永远是1,并获得run-level信息(如3或5)。centos7使用systemd代替init,相关命令参考linux.md#服务相关命令
  • 常规后续启动流程
    • execute /etc/rc.d/sysinit:rc.d 为 runlevel control directory
    • start other modulers(/etc/modules.conf):启动内核外挂模块
    • execute the run level scripts
      • 执行某级别下的脚本如 /etc/rc0.d=>/etc/rc.d/rc0.d/etc/rc1.d (创建的chkconfig会生成文件到对应级别)
      • 运行级别:启动只能配置成某一个级别,查看systemctl get-default,配置目录cat /etc/inittab
        • 0 停机(千万不要把initdefault 设置为0)
        • 1 单用户模式
        • 2 多用户,但是没有 NFS
        • 3 完全多用户模式(服务器常用,一般centos7即默认此级别),multi-user.target
        • 4 系统保留的
        • 5 X11(x window 桌面版),graphical.target
        • 6 重新启动(千万不要把initdefault 设置为6)
      • 修改默认运行级别
        • systemctl set-default graphical.target 将默认模式修改为图形界面模式
        • systemctl set-default multi-user.target 将默认模式修改为命令行模式
      • 对无图像界面的服务器安装图像界面相关软件 yum -y groupinstall "GNOME Desktop" "Graphical Administration Tools"
    • execute /etc/rc.d/rc.local:执行rc.local脚本。可基于此文件配置(或者/etc/rc.local),直接在里面添加某些启动命令。centos7以不推荐使用
    • execute /bin/login
    • shell started…
  • centos7后续启动流程

    • 执行initrd.target所有单元,包括挂载/etc/fstab
    • 从initramfs根文件系统切换到磁盘根目录
    • systemd执行默认target配置,配置文件/etc/systemd/system/default.target
    • systemd执行sysinit.target初始化系统及basic.target准备操作系统
    • systemd启动multi-user.target下的本机与服务器服务
    • systemd执行multi-user.target下的/etc/rc.d/rc.localcentos7以不推荐使用,如需使用必须执行chmod +x /etc/rc.d/rc.local

      • 此时$PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin,profile中尚未生效,命令路径一般需绝对路径

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        # 添加此文件是为了兼容性
        THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
        #创建自己的systemd服务或udev规则是非常明智的
        It is highly advisable to create own systemd services or udev rules
        #在引导过程中运行脚本,而不是使用这个文件。
        to run scripts during boot instead of using this file.
        #与以前的版本相比,由于在引导过程中并行执行
        In contrast to previous versions due to parallel execution during boot
        #此脚本将不会在所有其他服务之后运行。
        this script will NOT be run after all other services.
        #请注意,您必须运行'chmod +x /etc/rc.d/rc.local'
        Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
        #该脚本将在引导期间执行。*
        that this script will be executed during boot.*
    • Systemd执行multi-user.target下的getty.target及登录服务

    • systemd执行graphical需要的服务

启动设置

  • 设置服务自启动,如 systemctl enable nginxchkconfig nginx on
  • 操作 /etc/rc.d/sysinit/etc/rc.d/rc.local~/.bashrc
  • 设置加载模块。如设置 br_netfilter 模块开机自启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建文件
cat > /etc/rc.d/sysinit <<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
# 创建文件
cat > /etc/sysconfig/modules/br_netfilter.modules <<EOF
modprobe br_netfilter
EOF
# 增加权限
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
# 重启后查看模块是否启动
lsmod |grep br_netfilter

系统启动故障排查

  • Centos启动各种故障情况分析
  • 单用户模式和救援模式(系统启动失败时可使用此模式进入系统进行调试)
    • https://www.xujun.org/note-8736.html
    • 单用户模式
      • 进入内核选择列表,光标选择一个内核,按e编辑启动命令,把启动命令linuxefi行中的 “ro” 改成 “rw init=/sysroot/bin/sh”,完成之后按Ctrl+x继续启动
      • 进入系统后,其实只是进入了一个安全模式下的内存系统,并不是原本的系统
        • 此时/sysroot/目录下才是原系统的文件(/home/目录可能没有数据,因为磁盘没有挂载等原因)。有时间配置错误了,可直接修改/sysroot/etc/目录下文件
        • chroot /sysroot/ 切换到正常系统中去
    • 救援模式
      • 插入并启动U盘系统,安装系统界面会有一个Troubleshooting表示故障排查,然后选择Rescue a CentOS Linux system救援系统
      • 同单用户模式,此系统不是原本系统。/mnt/sysimage/目录下才是原系统数据
  • /etc/fstab磁盘挂载配置出错,重启后启动失败

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vi /etc/fstab
    # 历史挂载配置,其中/dev/vdb1后来被创建成了/dev/home/main的LVM卷(解决办法:进入安全模式修改此文件,删除历史配置即可)
    /dev/vdb1 /home xfs defaults 0 0
    # 新挂载配置
    /dev/home/main /home xfs defaults 0 0

    ## 一般完整的fstab目录如下,丢失/etc/fstab时可安装以下初始化
    #UUID=baaf0b5a-7e09-4a52-a409-56b1ddaaafa5 /boot xfs defaults 0 0 # UUID对应的即启动盘,如/dev/vda1的磁盘编号
    /dev/vda1 /boot xfs defaults 0 0
    /dev/mapper/centos-root / xfs defaults 0 0
    /dev/mapper/centos-swap swap swap defaults 0 0
    /dev/home/main /home xfs defaults 0 0
    • 如提示A start job is running for dev-home-main.device或者Timed out waiting for device dev-home-main.device。表示磁盘dev-home-main.device挂载失败,检查/etc/fstab是否书写正确
  • centos7忘记root用户密码找回

参考文章

ChatGPT开源小程序