ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 起不来怎么办:target、root 密码、fstab、grub2 全救回来

Linux 起不来怎么办:target、root 密码、fstab、grub2 全救回来 文章目录Linux系统启动原理CentOS 7 启动过程**系统target**设置系统运行目标设置系统当前运行target设置系统开机默认运行target在系统启动时选择其它目标重置ROOT密码方法1rd.break官方推荐优先用**方法2init/bin/bash**两种重置root密码方式对比/etc/fstab引起的系统启动问题环境准备故障1挂载点不存在**环境准备****重启系统验证**故障2设备名称写错或者找不到设备环境准备**重启系统验证**故障3破坏文件系统环境准备**重启系统验证**grub2配置配置grub2菜单超时时间Linux系统启动原理CentOS 7 启动过程现代计算机系统是硬件与软件的复杂组合。从断电状态开始到拥有登录提示符的运行中系统这需要 大量的硬件和软件配合工作。以下列表从较高层面概述了启动CentOS 7的物理X86_64系统所涉及的任务。开机自检MBR引导GRUB菜单加载内核 initramfs 虚拟根文件系统切换到真实根文件系统 switch_rootsystemd 执行初始化启动目标单元 target启动本机服务终端启动出现登录界面计算机接通电源。系统固件现代UEFI或更旧的BIOS运行开机自检(POST)并开始初始化硬件。配置在系统启动早期通过按特定的组合键例如F2配置系统固件。系统固件搜索启动设备根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader然后将系统控制权交给boot loaderboot loader是GRand Unified Bootloader version 2(GRUB2)。配置使用grub2‑install命令进行配置它将安装GRUB2作为磁盘上的启动加载器。GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单可以从中选择要启动的系统。配置使用/etc/grub.d/目录、/etc/default/grub文件和grub2‑mkconfig命令进行配置以生成/boot/grub2/grub.cfg文件。boot loader根据选定条目的配置从磁盘中加载kernel和initramfs并将它们放入内存中。initramfs是一个存档其中包含启动时所有必要硬件的内核模块、初始化脚本等等。boot loader将控制权交给kernel并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序并初始化这些硬件。配置使用/etc/dracut.conf.d/目录、dracut命令和lsinitrd命令进行配置以检查initramfs文件。initramfs执行/sbin/init作为PID 1。在CentOS 7中/sbin/init是一个指向systemd的链接。配置使用内核参数initcommand配置系统初始化程序。随后systemd会加载从内核命令行传递的target或者加载系统配置的default.target该目标通常启动一个基于文本的登录或图形登录屏幕。配置使用systemctl设置默认target。default.target依赖sysinit.targetsysinit.target用于初始化系统例如读取/etc/fstab挂载文件系统激活systemd‑journald等。配置使用/etc/fstab配置文件系统开机自动挂载。default.target还会激活开机启动的单元。配置使用systemctl设置开机启用服务。default.target还会激活getty.target该target将打开tty1终端用于用户登录。系统targetsystemd使用类型为target的单元来分组不同单元例如multi-user.target包涵chronyd.service、 crond.service、firewalld.service等服务。target还可以包涵其他target例如graphical.target包涵multi-user.targetmulti-user.target包涵 basic.targetbasic.target包涵sysinit.target。使用以下命令查看target之间依赖关系[rootcentos ~15:51:36]# systemctl list-dependencies graphical.targetgraphical.target ● ├─accounts-daemon.service ● ├─gdm.service ● ├─initial-setup-reconfiguration.service ● ├─network.service ● ├─rtkit-daemon.service ● ├─systemd-readahead-collect.service ● ├─systemd-readahead-replay.service ● ├─systemd-update-utmp-runlevel.service ● ├─udisks2.service ● └─multi-user.target ● ├─abrt-ccpp.service ● ├─abrt-oops.service ● ├─abrt-vmcore.service ● ├─abrt-xorg.service ● ├─abrtd.service ● ├─atd.service ● ├─auditd.service ● ├─avahi-daemon.service ● ├─chronyd.service ● ├─crond.service ● ├─cups.path ● ├─cups.service ● ├─dbus.service ● ├─initial-setup-reconfiguration.service ● ├─irqbalance.service ● ├─ksm.service ● ├─ksmtuned.service ● ├─libstoragemgmt.service ● ├─libvirtd.service ● ├─mcelog.service#查看反向依赖[rootcentos ~15:52:03]# systemctl list-dependencies sshd.service --reversesshd.service ● └─multi-user.target ● └─graphical.target系统启动级别CentOS 6 之前使用启动级别控制系统开机激活哪些服务。CentOS 7 之后使用target控制系统开机激活哪些服务。runleveltarget作用0关机。init 0 同 poweroff 和 systemctl poweroff1emergency.targetrescue.target单用户模式、救援模式和紧急模式用于修复系统2多用户文本界面不具备 NFS 功能3multi‑user.target多用户文本界面4未使用5graphical.target多用户图形界面6重启init 6 同 reboot 和 systemctl reboot设置系统运行目标/etc/inittab文件是rhel6之前版本初始化系统使用的配置文件。# 部分内容如下# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)## 设置运行级别为5也就是图形化方式启动。id:5:initdefault:设置系统当前运行target# 设置系统当前运行target为multi-user.target[rootcentos ~15:56:39]# systemctl isolate multi-user.target# 设置系统当前运行target为graphical.target[rootcentos ~15:57:18]# systemctl isolate graphical.target设置系统开机默认运行target# 查看系统开机默认运行target[rootcentos ~15:57:52]# systemctl get-defaultgraphical.target# 设置系统开机默认运行target[rootcentos ~15:58:03]# systemctl set-default multi-user.targetRemoved symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.在系统启动时选择其它目标要在启动时选择其他目标将systemd.unittarget.target参数附加到内核命令行。该配置是临时生效的经常用于系统启动过程中故障排除。要使用这种选择其他目标的方法请执行以下步骤启动或重新启动系统。按任意键Enter除外它用于执行正常启动中断启动加载器菜单倒计时。将光标移至要启动的内核条目。按e编辑当前条目。将光标移至以linux开头的行。此为内核命令行。附加systemd.unittarget.target。例如systemd.unitemergency.target。按Ctrlx使用这些更改进行启动。重置ROOT密码如果管理员仍处于登录状态不管是作为拥有完全sudo访问权限的非特权用户还是作为root用户这个任务都很简单直接执行passwd命令设置即可。如果管理员未登录则这个任务变得略微复杂。在CentOS6及更早的版本中管理员可以将系统启动到runlevel 1以获得root提示符。在CentOS7之后系统上与runlevel 1最接近的模式是紧急目标和救援目标但是这两个目标都需要root密码才能登录。以下几种方法可用于设置新的root密码。例如系统管理员可以使用Live CD启动系统挂载根文件系统然后编辑/etc/shadow删除root账户密码字段使用已知密码字段替换root密码字段在CentOS7之后版本中可以让initramfs运行的脚本在某些点暂停以提供root身份的shell然后在该shell中重置root密码。方法1rd.break官方推荐优先用中断点: initramfs 阶段还没有切换真实根提示符switch_root:/#重新启动系统。按任意键Enter除外中断启动加载器倒计时。将光标移至要启动的内核条目。按e编辑选定的条目。将光标移到内核命令行以linux开头的行。在这一行最后附加rd.break。利用该选项在系统从initramfs向实际系统移交控制权前系统将会中断。kernel 行可能有多个console参数以最后一个为准有些时候需要设置consoletty0。按Ctrlx使用这些更改进行启动。此时系统会显示root shell且磁盘上的实际根文件系统以只读方式挂载在/sysroot。以读/写形式重新挂载/sysroot。switch_root:/# mount -o remount,rw /sysroot切换root位置把/sysroot做为文件系统树的根。switch_root:/# chroot /sysroot设置新root密码。sh-4.2# passwd root如果系统开启了SELinux功能则需要确保所有未标记的文件包括此时的/etc/shadow)在启动过 程中都会重新获得标记。sh-4.2# touch /.autorelabel键入exit两次。第一个命令将退出chroot存放位置第二个命令将退出initramfs调试shell。此时 系统将继续进行启动执行完整的SELinux重新标记然后再次重新启动。登录验证。方法2init/bin/bash作用内核启动完不启动 systemd (PID1)直接把/bin/bash作为 PID1直接拿到系统 shell。此时根文件系统默认只读挂载重新启动系统。按任意键Enter除外中断启动加载器倒计时。将光标移至要启动的内核条目。按e编辑选定的条目。将光标移到内核命令行以linux开头的行。附加init/bin/bash。利用该选项在系统从initramfs向实际系统移交控制权前系统将会中断 请开启一个root shell。kernel行可能有多个console参数以最后一个为准有些时候需要设置consoletty0。按Ctrlx使用这些更改进行启动。此时系统会显示root shell且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载/。bash-4.2# mount -o remount,rw /设置新root密码sh-4.2# passwd如果系统开启了SELinux功能则需要确保所有未标记的文件包括此时的/etc/shadow)在启动过 程中都会重新获得标记。.执行exec /sbin/init拉起systemd正常走完启动流程sh-4.2# exec /sbin/init登录验证两种重置root密码方式对比对比项rd.breakinit/bin/bash中断阶段initramfs切换真实根之前已经切换到真实根替代 systemd (PID1)根文件系统位置真实根在 /sysroot需要 chroot直接就是真实系统 /SELinux依然生效必须写 /.autorelabelSELinux 依然生效也要 /.autorelabel磁盘支持LVM、RAID、iSCSI 都正常识别initramfs 驱动完整同样加载 initramfs磁盘驱动正常退出方式两次 exit 正常继续启动不能直接断电 / 重启必须执行exec /sbin/init风险点几乎无风险官方标准方式忘记exec /sbin/init直接重启极易损坏文件系统官方态度RHEL/CentOS 官方文档标准方案兼容旧方式不推荐生产使用/etc/fstab引起的系统启动问题环境准备# 设置磁盘分区管理方案[rootcentos79 ~]# parted /dev/sdb mklabel msdos# 创建分区[rootcentos79 ~]# parted /dev/sdb unit MiB mkpart primary 1 10241# 格式化为xfs文件系统[rootcentos79 ~]# mkfs.xfs /dev/sdb1# 创建挂载点[rootcentos79 ~]# mkdir /data01# 设置持久化挂载[rootcentos79 ~]# echo /dev/sdb1 /data01 xfs defaults 0 0 /etc/fstab# 挂载并验证[rootcentos79 ~]# mount -a[rootcentos79 ~]# df -h /data01文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 10G 33M 10G1% /data01故障1挂载点不存在环境准备[rootcentos79 ~]# umount /data01[rootcentos79 ~]# rmdir /data01重启系统验证# 可以正常进入系统挂载点会被自动创建[rootcentos79 ~]# df -h /data01文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 10G 33M 10G1% /data01故障2设备名称写错或者找不到设备环境准备[rootcentos79 ~]# vim /etc/fstab# 将原先的sdb1修改为sdb2/dev/sdb2 /data01 xfs defaults00重启系统验证启动过程中找不到该设备。1分30秒超时后进入emergency模式输入密码进行修复。修改为正确的值或者注释该条目确保系统正常启动。然后输入reboot重新启动系统。如果系统没有继续启动则可以强制关机重启。故障3破坏文件系统环境准备[rootcentos79 ~]# dd if/dev/zero of/dev/sdb1 bs1M count1重启系统验证系统启动过程中尝试修复文件系统修复失败后提示进入emergency模式修复。进入emergency模式修复。# 执行以下命令修复[rootcentos79 ~]# xfs_repair /dev/sdb1grub2配置配置grub2的主要配置文件如下:/boot/grub2grub2的主要配置文件所在目录例如grub.cfg、grubenv、user.cfg。/etc/grub2.cfg/etc/grub2.cfg是指向/boot/grub2/grub.cfg的软连接。不要直接修改/etc/grub2.cfg文件该文件由系统自动生成。如果需要自定义这个文件可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件然后通过grub2-mkconfig命令生成。使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。/etc/grub.d/该目录下存放多个数字开头的脚本按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。/etc/default/grub定义grub启动部分变量信息例如grub启动菜单选择条目的超时时间内核参数等。/boot/grub2/grubenv设定默认启动条目。grub2菜单超时时间[rootcentos79 ~]# vim /etc/default/grub# 修改GRUB_TIMEOUT为10GRUB_TIMEOUT10# 生效grub2.cfg配置文件[rootcentos79 ~]# grub2-mkconfig -o /etc/grub2.cfgGenerating grub configurationfile... Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-c6e36d35c9a846d7b64d9fdf929b09f6 Found initrd image: /boot/initramfs-0-rescue-c6e36d35c9a846d7b64d9fdf929b09f6.imgdone# 重启[rootcentos79 ~]# reboot效果如下:
返回列表