您现在的位置: 永利注册送56元 > 最新新闻 >
最新新闻 理解Systemd 启动时在做什么
      发布时间:2021-09-05 23:31      作者:admin      点击:

systemd 启动过程挑供的主要线索能够在题目显眼前助你一臂之力最新新闻。

在本系列的第一篇文章《学着喜欢上 systemd》,吾考察了 systemd 的功能和架构,以及围绕 systemd 行为迂腐的 SystemV 初首化程序和启动脚本的替代品的争吵。在这第二篇文章中,吾将最先追求管理 Linux 启动序列的文件和工具。吾会注释 systemd 启动序列、如何更改默认的启动现在的(即 SystemV 术语中的运走级别)、以及在不重启的情况下如何手动切换到迥异的现在的。

【品大事】

中国规模庞大的房地产中介行业,或许正酝酿一场风暴的聚集。

当“内卷”卷到土地市场,许多开发商忍不住了。

8月24日,上海发布《上海国际金融中心建设“十四五”规划》(下称《规划》),对“十四五”期间如何建设上海国际金融中心做了具体要求。

8月23日,人民银行行长、国务院金融稳定发展委员会办公室主任易纲主持召开了金融机构货币信贷形势分析座谈会,研究当前货币信贷形势,部署下一步货币信贷工作。

吾还将考察两个主要的 systemd 工具。第一个 systemctl 命令是和 systemd 交互、向其发送命令的基本手段。第二个是 journalctl,用于访问 systemd 日志,后者包含了大量体系历史数据,比如内核和服务的新闻(包括指使性新闻和舛讹新闻)。

务必行使一个非生产体系进走本文和后续文章中的测试和实验。你的测试体系必要安置一个 GUI 桌面(比如 Xfce、LXDE、Gnome、KDE 或其他)。

上一篇文章中吾写道计划在这篇文章创建一个 systemd 单元并增补到启动序列。由于这篇文章比吾预期中要长,这些内容将留到本系列的下一篇文章。

行使 systemd 追求 Linux 的启动

在不都雅察启动序列之前,你必要做几件事情得使引导和启动序列盛开可见。平常情况下,大无数发走版行使一个开机动画或者启动画面暗藏 Linux 启动和关机过程中的表现细节,在基于 Red Hat 的发走版中称作 Plymouth 引导画面。这些暗藏的新闻能够向追求新闻以倾轧程序故障、或者只是学习启动序列的体系管理员挑供大量相关体系启动和关闭的新闻。你能够经过 GRUB(大同一引导添载器Grand Unified Boot Loader)配置转折这个竖立。

主要的 GRUB 配置文件是 /boot/grub2/grub.cfg ,但是这个文件在更新内核版本时会被遮盖,你不会想修改它的。相逆,答该修改用于转折 grub.cfg 默认竖立的 /etc/default/grub 文件。

最先望一下现在未修改的 /etc/default/grub 文件的版本:

[root@testvm1 ~]# cd /etc/default ; cat 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="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ testvm1/usr rhgb quiet" GRUB_DISABLE_RECOVERY="true" [root@testvm1 default]# 

GRUB 文档 的第 6 章列出了 /etc/default/grub 文件的所有可用项,吾只关注下面的片面:

吾将 GRUB 菜单倒计时的秒数 GRUB_TIMEOUT,从 5 改成 10,以便在倒计时达到 0 之前有更众的时间反答 GRUB 菜单。 GRUB_CMDLINE_LINUX 列出了引导阶段传递给内核的命令走参数,吾删除了其中的末了两个参数。其中的一个参数 rhgb 代外 “红帽图形化引导Red Hat Graphical Boot”,在内核初首化阶段表现一个幼幼的 Fedora 图标动画,而不是表现引导阶段的新闻。另一个参数 quiet,屏蔽表现记录了启动进度和发生舛讹的新闻。体系管理员必要这些新闻,所以吾删除了 rhgb 和 quiet。倘若引导阶段发生了舛讹,屏幕上表现的新闻能够指向故障的因为。

更改之后,你的 GRUB 文件将会像下面相通:

[root@testvm1 default]# cat grub GRUB_TIMEOUT=10 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ testvm1/usr" GRUB_DISABLE_RECOVERY="false" [root@testvm1 default]# 

grub2-mkconfig 程序行使 /etc/default/grub 文件的内容生成 grub.cfg 配置文件,从而转折一些默认的 GRUB 竖立。grub2-mkconfig 输出到 STDOUT,你能够行使程序的 -o 参数指明数据流输出的文件,不过行使重定向也同样浅易。实走下面的命令更新 /boot/grub2/grub.cfg 配置文件:

[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64 Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64 Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64 Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504 Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img done [root@testvm1 grub2]# 

重新启动你的测试体系查望正本会暗藏在 Plymouth 开机动画之下的启动新闻。但是倘若你异国关闭开机动画,又必要查望启动新闻的话又该如何操作?或者你关闭了开机动画,而新闻流过的速度太快,无法浏览怎么办?(实际情况如此。)

有两个解决方案,都涉及到日志文件和 systemd 日志 —— 两个都是你的益友人。你能够行使 less 命令查望 /var/log/messages 文件的内容。这个文件包含引导和启动新闻,以及操作体系实走平常操作时生成的新闻。你也能够行使不添任何参数的 journalctl 命令查望 systemd 日志,包含基原形通的新闻:

[root@testvm1 grub2]# journalctl -- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. -- Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 (mockbuild@bkernel03.phx2.fedoraproject.org) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct > Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd> Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256 Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map: Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present. Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00 Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable <snip

由于数据流能够长达几十万甚至几百万走最新新闻,吾在这边截断了它。(吾的主要做事站上列出的日志长度是 1,188,482 走。)请确保是在你的测试体系尝试的这个命令。倘若体系已经运走了一段时间 —— 即使重启过很众次 —— 照样会表现大量的数据。查望这些日志数据,由于它包含了很众新闻,在进走题目判准时能够特意有用。晓畅这个数据文件在平常的引导和启动过程中的模样,能够协助你在题目显眼前定位题目。

吾将在本系列之后的文章商议 systemd 日志、journalctl 命令、以及如何清理输出的日志数据来追求更详细的新闻。

内核被 GRUB 添载到内存后,必须先将本身从压缩后的文件中解压出来,才能实走任何有意义的操作。解压本身后,内核最先运走,添载 systemd 并转交限制权。

引导boot阶段到此终止,此时 Linux 内核和 systemd 正在运走,但是无法为用户实走任何生产性义务,由于其他的程序都异国实走,异国命令走注释器挑供命令走,异国后台进程管理网络和其他的通信链接,也异国任何东西能够限制计算机实走生产功能。

现在 systemd 能够添载所需的功能性单元以便将体系启动到选择的现在的运走状态。

现在的

一个 systemd 现在的target代外一个 Linux 体系现在的或憧憬的运走状态。与 SystemV 启动脚原形等相通,现在的定义了体系运走必须存在的服务,以及处于现在的状态下必须激活的服务。图外 1 展现了行使 systemd 的 Linux 体系能够的运走状态现在的。就像在本系列的第一篇文章以及 systemd 启动的手册页(man bootup)所望到的相通,有一些开启迥异必要服务的其他中心现在的,包括 swap.target、timers.target、local-fs.target 等。一些现在的(像 basic.target)行为检查点行使,在移动到下一个更高级的现在的之前保证所有必要的服务已经启动并运走。

除非开机时在 GRUB 菜单进走更改,systemd 总是启动 default.target。default.target 文件是指向实在的现在的文件的符号链接。对于桌面做事站,default.target 清淡是 graphical.target,等同于 SystemV 的运走等级 5。对于服务器,默认现在的众半是 multi-user.target,就像 SystemV 的运走等级 3。emergency.target 文件相通单用户模式。现在的和服务service都是一栽 systemd 单元。

下面的图外,包含在本系列的上一篇文章中,比较了 systemd 现在的和迂腐的 SystemV 启动运走等级。为了向后兼容,systemd 挑供了 systemd 现在的又名,批准脚本和体系管理员行使像 init 3 相通的 SystemV 命令转折运走等级。自然,SystemV 命令被转发给 systemd 进走注释和实走。

每个现在的在配置文件中都描述了一组倚赖相关。systemd 启动必要的倚赖,即 Linux 主机运走在特定功能级别所需的服务。添载现在的配置文件中列出的所有倚赖并运走后,体系就运走在谁人现在的等级。倘若情愿,你能够在本系列的第一篇文章《学着喜欢上 systemd》中回顾 systemd 的启动序列和运走时现在的。

追求现在的现在的

很众 Linux 发走版默认安置一个 GUI 桌面界面,以便安置的体系能够像做事站相通行使。吾总是从 Fedora Live USB 引导驱动器安置 Xfce 或 LXDE 桌面。即使是安置一个服务器或者其他基础类型的主机(比如用于路由器和防火墙的主机),吾也行使 GUI 桌面的安置手段。

吾能够安置一个异国桌面的服务器(数据中心的典型做法),但是如许不悦足吾的需求。因为不是吾必要 GUI 桌面本身,而是 LXDE 安置包含了很众其他默认的服务器安置异国挑供的工具,这意味着初首安置之后吾必要做的做事更少。

但是,仅仅由于有 GUI 桌面并意外味着吾要行使它。吾有一个 16 端口的 KVM,能够用于访问吾的大片面 Linux 体系的 KVM 接口,但吾和它们交互的大片面交互是经过从吾的主要做事站竖立的长途 SSH 连接。这栽手段更坦然,而且和 graphical.target 相比,运走 multi-user.target 行使更少的体系资源。

最先,检查默认现在的,确认是 graphical.target:

[root@testvm1 ~]# systemctl get-default graphical.target [root@testvm1 ~]# 

然后确认现在正在运走的现在的,答该和默认现在的相通。你仍能够行使行家段,输出迂腐的 SystemV 运走等级。仔细,前一个运走等级在左边,这边是 N(有趣是 None),外示主机启动后异国修改过运走等级。数字 5 是现在的现在的,正如迂腐的 SystemV 术语中的定义:

[root@testvm1 ~]# runlevel N 5 [root@testvm1 ~]# 

仔细,runlevel 的手册页指出运走等级已经被镌汰,并挑供了一个转换外。

你也能够行使 systemd 手段,命令的输出有很众走,但实在用 systemd 术语挑供了答案:

[root@testvm1 ~]# systemctl list-units --type target UNIT                   LOAD   ACTIVE SUB    DESCRIPTION                 basic.target           loaded active active Basic System               cryptsetup.target      loaded active active Local Encrypted Volumes     getty.target           loaded active active Login Prompts               graphical.target       loaded active active Graphical Interface         local-fs-pre.target    loaded active active Local File Systems (Pre)   local-fs.target        loaded active active Local File Systems         multi-user.target      loaded active active Multi-User System           network-online.target  loaded active active Network is Online           network.target         loaded active active Network                     nfs-client.target      loaded active active NFS client services         nss-user-lookup.target loaded active active User and Group Name Lookups paths.target           loaded active active Paths                       remote-fs-pre.target   loaded active active Remote File Systems (Pre)   remote-fs.target       loaded active active Remote File Systems         rpc_pipefs.target      loaded active active rpc_pipefs.target           slices.target          loaded active active Slices                     sockets.target         loaded active active Sockets                     sshd-keygen.target     loaded active active sshd-keygen.target         swap.target            loaded active active Swap                       sysinit.target         loaded active active System Initialization       timers.target          loaded active active Timers                     LOAD   = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB    = The low-level unit activation state, values depend on unit type. 21 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. 

上面列出了现在添载的和激活的现在的,你也能够望到 graphical.target 和 multi-user.target。multi-user.target 必要在 graphical.target 之前添载。这个例子中,graphical.target 是激活的。

切换到迥异的现在的

切换到 multi-user.target 很浅易:

[root@testvm1 ~]# systemctl isolate multi-user.target 

表现器现在答该从 GUI 桌面或登录界面切换到了一个虚拟限制台。登录并列出现在激活的 systemd 单元,确认 graphical.target 不再运走:

[root@testvm1 ~]# systemctl list-units --type target 

务必行使 runlevel 确认命令输出了之前的和现在的“运走等级”:

[root@testvm1 ~]# runlevel 5 3 
更改默认现在的

现在,将默认现在的改为 multi-user.target,以便体系总是启动进入 multi-user.target,从而行使限制台命令走接口而不是 GUI 桌面接口。行使你的测试主机的根用户,切换到保存 systemd 配置的现在录,实走一次迅速列出操作:

[root@testvm1 ~]# cd /etc/systemd/system/ ; ll drwxr-xr-x. 2 root root 4096 Apr 25  2018  basic.target.wants &lt;snip&gt; lrwxrwxrwx. 1 root root   36 Aug 13 16:23  default.target -> /lib/systemd/system/graphical.target lrwxrwxrwx. 1 root root   39 Apr 25  2018  display-manager.service -> /usr/lib/systemd/system/lightdm.service drwxr-xr-x. 2 root root 4096 Apr 25  2018  getty.target.wants drwxr-xr-x. 2 root root 4096 Aug 18 10:16  graphical.target.wants drwxr-xr-x. 2 root root 4096 Apr 25  2018  local-fs.target.wants drwxr-xr-x. 2 root root 4096 Oct 30 16:54  multi-user.target.wants &lt;snip&gt; [root@testvm1 system]# 

为了强调一些有助于注释 systemd 如何管理启动过程的主要事项,吾萎缩了这个列外。你答该能够在虚拟机望到完善的现在录和链接列外。

default.target 项是指向现在录 /lib/systemd/system/graphical.target 的符号链接(柔链接),列出谁人现在录查望现在录中的其他内容:

[root@testvm1 system]# ll /lib/systemd/system/ | less 

你答该在这个列外中望到文件、现在录、以及更众链接,但是特意追求一下 multi-user.target 和 graphical.target。现在列出 default.target(指向 /lib/systemd/system/graphical.target 的链接)的内容:

[root@testvm1 system]# cat default.target #  SPDX-License-Identifier: LGPL-2.1+ # #  This file is part of systemd. # #  systemd is free software; you can redistribute it and/or modify it #  under the terms of the GNU Lesser General Public License as published by #  the Free Software Foundation; either version 2.1 of the License, or #  (at your option) any later version. [Unit] Description=Graphical Interface Documentation=man:systemd.special(7) Requires=multi-user.target Wants=display-manager.service Conflicts=rescue.service rescue.target After=multi-user.target rescue.service rescue.target display-manager.service AllowIsolate=yes [root@testvm1 system]# 

graphical.target 文件的这个链接描述了图形用户接口必要的所有必备条件。吾会在本系列的下一篇文章起码探讨其中的一些选项。

为了使主机启动到众用户模式,你必要删除已有的链接,创建一个新链接指向正确现在的。倘若你的 PWD 不是 /etc/systemd/system,切换以前:

[root@testvm1 system]# rm -f default.target [root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target 

列出 default.target 链接,确认其指向了正确的文件:

[root@testvm1 system]# ll default.target lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -&gt; /lib/systemd/system/multi-user.target [root@testvm1 system]# 

倘若你的链接望首来纷歧样,删除并重试。列出 default.target 链接的内容:

[root@testvm1 system]# cat default.target #  SPDX-License-Identifier: LGPL-2.1+ # #  This file is part of systemd. # #  systemd is free software; you can redistribute it and/or modify it #  under the terms of the GNU Lesser General Public License as published by #  the Free Software Foundation; either version 2.1 of the License, or #  (at your option) any later version. [Unit] Description=Multi-User System Documentation=man:systemd.special(7) Requires=basic.target Conflicts=rescue.service rescue.target After=basic.target rescue.service rescue.target AllowIsolate=yes [root@testvm1 system]# 

default.target(这边其实是指向 multi-user.target 的链接)其中的 [Unit] 片面现在有迥异的必需条件。这个现在的不必要有图形表现管理器。

重启,你的虚拟机答该启动到虚拟限制台 1 的限制台登录,虚拟限制台 1 在表现器标识为 tty1。现在你已经晓畅如何修改默认的现在的,行使所需的命令将默认现在的改回 graphical.target。

最先检查现在的默认现在的:

[root@testvm1 ~]# systemctl get-default multi-user.target [root@testvm1 ~]# systemctl set-default graphical.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target. [root@testvm1 ~]# 

输入下面的命令直接切换到 graphical.target 和表现管理器的登录界面,不必要重启:

[root@testvm1 system]# systemctl isolate default.target 

吾不晓畅为何 systemd 的开发者选择了术语 isolate 行为这个子命令。吾的钻研外明指的能够是运走指明的现在的,但是“阻隔”并完结其他所有启动该现在的不必要的现在的。然而,命令实走的凶果是从一个运走的现在的切换到另一个——在这个例子中,从众用户现在的切换到图形现在的。上面的命令等同于 SystemV 启动脚本和 init 程序中迂腐的 init 5 命令。

登录 GUI 桌面,确认能平常做事。

总结

本文追求了 Linux systemd 启动序列,最先探讨两个主要的 systemd 工具 systemctl 和 journalctl,还表明了如何从一个现在的切换到另一个现在的,以及如何修改默认现在的。

本系列的下一篇文章中将会创建一个新的 systemd 单元,并配置为启动阶段运走。下一篇文章还会查望一些配置选项,能够协助确定某个特定的单元在序列中启动的位置,比如在网络启动运走后。

资源

关于 systemd 网络上有大量的新闻,但大片面都简短生硬、痴顽、甚至令人误解。除了本文挑到的资源最新新闻,下面的网页挑供了关于 systemd 启动更详细郑重的新闻。

Fedora 项现在有一个优质实用的 systemd 指南,几乎有你行使 systemd 配置、管理、维护一个 Fedora 计算机必要晓畅的总共。 Fedora 项现在还有一个益用的 速查外,交叉引用了迂腐的 SystemV 命令和对答的 systemd 命令。 要获取 systemd 的详细技术新闻和竖立的因为,查望 Freedesktop.org 的 systemd 描述。 Linux.com 上“systemd 的更众有趣”挑供了更高级的 systemd 新闻和挑示。
 
 

Powered by 永利注册送56元 @2018 RSS地图 HTML地图