Linux系统配置与操作全解析
1. 窗口管理器与桌面环境
不同的Linux发行版和桌面环境有不同的方式来更改窗口管理器。一般来说,更改桌面环境通常会将窗口管理器更改为该桌面环境的默认窗口管理器。在当前的Fedora Linux版本中,可以在显示管理器登录屏幕上更改桌面环境。如果还安装了独立的窗口管理器,它们也会与桌面环境一起显示在列表中。
在安装大多数带有桌面环境的现代发行版时,安装程序通常会选择要安装和激活的显示和窗口管理器。对于大多数用户来说,通常不需要更改这些选择。但对于有不同需求或更具探索精神的用户,有许多选项和组合可供选择。
2. 恢复模式
恢复模式通常有三个术语:恢复(recovery)、救援(rescue)和维护(maintenance),它们在功能上是相同的。维护模式通常在Linux主机由于启动和启动过程中发生的某些错误而无法引导到其默认目标时使用。
恢复模式的功能是允许系统管理员在系统以低级别运行时访问系统,此时没有系统服务运行,除root用户外,其他用户无法登录。这可以防止用户丢失数据,同时也可以防止未经授权的远程访问,例如通过SSH,因为这可能使远程用户安装恶意软件或窃取数据。root用户可以在恢复模式下自由工作,而不必担心对其他用户的影响。
许多维护任务在图形目标(graphical.target)或多用户目标(multi - user.target)下无法执行,因此这些任务必须在维护模式下执行。
2.1 进入恢复模式的实验
- 实验16 - 8:恢复模式 :尝试选择恢复内核,但可能会失败,计算机最终可能会运行图形目标。不过,此问题未来可能会修复,所以了解这种进入方式还是有必要的。
-
实验16 - 9:另一种进入恢复模式的方法
:当进入救援模式失败时,可以采用这种方法。步骤如下:
- 按“E”键编辑内核命令行。
- 在核命令行末尾添加“1”。
- 按“F10”键引导进入救援模式。
2.2 在救援模式下工作
进入救援模式后,可以进行一些简单的实验来了解该模式的使用。例如,使用
lsblk
实用程序可以看到所有文件系统都已正确挂载,使用
nmcli
命令可以看到网络尚未启动。计算机正在运行,但处于非常最小化的操作模式,只有最基本的服务可用以解决问题。
runlevel
命令将显示主机相当于旧的SystemV运行级别1。
graph LR
A[开机] --> B[选择恢复内核(可能失败)]
B -->|失败| C[按E键编辑内核命令行]
C --> D[添加1到内核命令行末尾]
D --> E[按F10键进入救援模式]
E --> F[使用root密码进入维护模式]
F --> G[使用lsblk查看文件系统挂载情况]
F --> H[使用nmcli查看网络状态]
F --> I[使用runlevel查看运行级别]
3. 登录相关
Linux主机开机后,会经过启动过程。启动过程完成后,会显示图形或命令行登录屏幕。没有登录提示就无法登录到Linux主机。
3.1 CLI登录屏幕
CLI登录屏幕由一个名为
getty
(代表GEt TTY)的程序启动。历史上,
getty
的功能是等待来自远程哑终端的连接通过串行通信线路传入。
getty
程序会生成登录屏幕并等待登录。当远程用户登录时,
getty
会终止,用户账户的默认shell将启动,允许用户在命令行上与主机进行交互。当用户注销时,
init
程序会生成一个新的
getty
来监听下一个连接。
现代的过程与此类似,但有一些更新。现在使用
agetty
(
getty
的高级形式)与
systemd
服务管理器结合使用,以处理Linux虚拟控制台以及越来越少见的传入调制解调器线路。现代Linux计算机中的事件序列如下:
1.
systemd
启动
systemd - getty - generator
守护进程。
2.
systemd - getty - generator
使用
serial - getty@.service
在每个虚拟控制台上生成一个
agetty
。
3.
agetty
等待虚拟控制台连接,即用户切换到其中一个VC。
4.
agetty
在显示器上显示文本模式登录屏幕。
5. 用户登录。
6. 启动
/etc/passwd
中指定的shell。
7. 运行shell配置脚本。
8. 用户在shell会话中工作。
9. 用户注销。
10.
systemd - getty - generator
在已注销的虚拟控制台上生成一个
agetty
。
11. 回到步骤3。
从步骤3开始,这是一个循环过程,只要主机运行就会重复。用户注销旧会话后,新的登录屏幕会立即显示在虚拟控制台上。
3.2 GUI登录屏幕
由显示管理器显示的GUI登录屏幕的处理方式与
systemd - getty - generator
处理文本模式登录的方式非常相似:
1. 在启动序列结束时,
systemd
启动指定的显示管理器(dm)。
2. 显示管理器显示图形登录屏幕,通常在虚拟控制台1上。
3. 显示管理器等待登录。
4. 用户登录。
5. 启动指定的窗口管理器。
6. 启动指定的桌面GUI(如果有)。
7. 用户在窗口管理器/桌面中工作。
8. 用户注销。
9.
systemd
重新生成显示管理器。
10. 回到步骤2。
显示管理器的功能类似于
agetty
的图形版本。
| 登录类型 | 启动程序 | 登录流程 |
|---|---|---|
| CLI登录 | agetty | systemd启动守护进程 -> 生成agetty -> 等待连接 -> 显示登录屏幕 -> 用户登录 -> 启动shell -> 运行脚本 -> 用户工作 -> 用户注销 -> 重新生成agetty |
| GUI登录 | 显示管理器 | systemd启动显示管理器 -> 显示图形登录屏幕 -> 等待登录 -> 用户登录 -> 启动窗口管理器 -> 启动桌面GUI -> 用户工作 -> 用户注销 -> 重新生成显示管理器 |
4. 总结与练习
前面我们详细探讨了Linux的启动过程、窗口管理器的使用、恢复模式的进入与操作以及登录相关的知识。下面是一些相关的练习问题,帮助大家巩固所学内容:
1. 描述Linux启动过程。
2. 描述Linux启动流程。
3. GRUB的作用是什么?
4. GRUB的阶段1在硬盘的什么位置?
5. systemd在启动期间的功能是什么?
6. systemd启动目标文件和链接位于何处?
7. 配置主机,使默认目标为
reboot.target
并重启系统。观察几次重启后,将默认目标重新配置为
graphical.target
并再次重启。
8. 在救援模式下能否卸载根(/)分区?
9.
agetty
的功能是什么?
10. 描述显示管理器的功能。
11. 哪个Linux组件连接到虚拟控制台并显示文本模式登录屏幕?
12. 列出并描述用户从登录到虚拟控制台到注销期间涉及的Linux组件和发生的事件序列。
13. 当在桌面上的root终端会话中使用
systemctl restart display - manager.service
命令重启显示管理器服务时会发生什么?
5. Shell配置
接下来我们将学习如何配置bash shell,因为它是几乎每个Linux发行版的默认shell。其他shell也有非常相似的配置文件,并且其中许多与bash配置文件共存于
/etc
目录(用于全局配置)和用户的主目录(用于本地配置)中。
5.1 启动Shell
启动shell时发生的事件序列为我们提供了理解其配置所需的信息。这个序列从全局配置文件开始,然后到本地配置文件,这允许用户覆盖全局配置设置。这里涉及的所有文件都是ASCII文本文件,因此它们是开放且可知的。有些文件不应该被更改,但可以在本地配置文件中覆盖其内容。
启动shell有两种情况,会导致不同的环境和不同的shell初始化执行顺序:
-
登录shell
:需要使用用户ID和密码才能访问的shell。例如虚拟控制台或使用SSH远程登录时。GUI桌面在很多方面也可以被视为登录shell。
-
非登录shell
:从另一个已经运行的shell中派生或启动的shell。父shell可以是登录shell或另一个非登录shell。非登录shell可以在GUI桌面内、通过
screen
命令或在终端模拟器中启动,其中多个标签或窗口可以各自包含一个shell实例。
用于配置bash环境的主要有五个文件和一个包含系统级配置文件的目录,它们及其主要功能如下:
|文件/目录|功能|
| ---- | ---- |
|
/etc/profile
|系统范围的环境和启动程序|
|
/etc/bashrc
|系统范围的函数和别名|
|
~/.bash_profile
|用户特定的环境和启动程序|
|
~/.bashrc
|用户特定的别名和函数|
|
~/.bash_logout
|用户注销时执行的特定命令|
|
/etc/profile.d/
|包含用于配置各种CLI工具(如vim和mc)的系统范围脚本,系统管理员也可以在该目录中放置自定义配置脚本|
当创建每个新用户账户时,位于
/etc/skel
目录中的所有用户shell配置文件(如
~/.bash_profile
和
~/.bashrc
)都会被复制到新账户的主目录中。
graph LR
A[启动shell] -->|登录shell| B[查找~/.bash_profile, ~/.bash_login, ~/.profile]
B --> C[执行找到的第一个文件]
C --> D[执行~/.bashrc]
D --> E[返回~/.bash_profile完成配置]
A -->|非登录shell| F[执行~/.bashrc]
F --> G[执行/etc/bashrc]
G --> H[执行/etc/profile.d/*.sh和sh.local]
H --> I[返回/etc/bashrc完成配置]
5.2 非登录Shell启动
非登录shell的启动路径会执行
~/.bashrc
,它会调用
/etc/bashrc
。
/etc/bashrc
程序包含调用
/etc/profile.d
中以
.sh
结尾的每个文件和
sh.local
文件的代码。该目录中还有其他shell的配置文件。当
/etc/profile.d
中的所有bash配置文件执行完成后,控制权返回
/etc/bashrc
,它会进行一些清理工作然后退出。此时bash shell已完全配置好。
5.3 登录Shell启动
登录shell的启动和配置序列比非登录shell更复杂,但大部分配置是相同的。shell会按顺序查找三个文件:
~/.bash_profile
、
~/.bash_login
和
~/.profile
,并运行找到的第一个文件,忽略其他文件。Fedora主目录通常包含
~/.bash_profile
文件,因此会执行该文件。另外两个文件通常不存在,因为在现代系统中它们没有必要。不过,为了保持向后兼容性,shell仍然会查找它们。一些软件(如Torch机器学习框架)会将其环境变量存储在
~/.profile
中,其他软件也可能使用这些旧文件。
~/.bash_profile
配置文件还会调用
~/.bashrc
文件并执行它,然后控制权返回
~/.bash_profile
。当
~/.bash_profile
执行完成后,shell配置完成。
5.4 探索全局配置脚本
/etc
、
/etc/profile
和
/etc/bashrc
中的脚本以及
/etc/profile.d
中的所有
.sh
脚本都是bash shell的全局配置脚本。全局配置会被所有用户继承。了解这些脚本的内容有助于我们更好地理解整个配置过程。
以下是一个探索全局配置脚本的实验:
1. 以学生用户身份执行此实验。将
/etc
设置为当前工作目录(PWD),然后查看
/etc/profile
的权限:
# cd /etc ; ll profile
-rw-r--r--. 1 root root 2078 Apr 17 2018 profile
可以看到它对所有用户可读,但只能由root用户修改。注意,这些配置文件没有设置执行权限,因为shell会“源”(source)这些文件,即使用
source
命令或更短的替代符号“.”来执行文件中的指令。
2. 使用
less
查看
/etc/profile
的内容,了解它的功能。虽然不需要详细分析整个文件,但应该能够看到一些环境变量是如何通过编程方式设置的。搜索
PATH
实例,查看
$PATH
是如何设置的。文件开头的注释之后是一个名为
pathmunge
的过程,当需要修改初始路径时,下面的代码会调用它:
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
-
接着有一些代码用于确定启动shell的用户的有效用户ID($EUID)。然后根据$EUID是root(值为0)还是其他非root、非零用户来设置
$PATH环境变量的第一个元素:
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
可以看到root用户和其他用户的路径是不同的,这就是实现这种差异的bash shell代码。
4. 文件底部附近的代码用于定位并执行
/etc/profile.d
中的bash配置脚本:
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
-
列出
/etc/profile.d目录中的文件:
$ ll /etc/profile.d/*.sh
-rw-r--r--. 1 root root 664 Jun 18 06:41 /etc/profile.d/Bash_completion.sh
-rw-r--r--. 1 root root 201 Feb 7 2018 /etc/profile.d/colorgrep.sh
-rw-r--r--. 1 root root 1706 May 29 12:30 /etc/profile.d/colorls.sh
-rw-r--r--. 1 root root 56 Apr 19 2018 /etc/profile.d/colorsysstat.sh
-rw-r--r--. 1 root root 183 May 9 2018 /etc/profile.d/colorxzgrep.sh
-rw-r--r--. 1 root root 220 Feb 9 2018 /etc/profile.d/colorzgrep.sh
-rw-r--r--. 1 root root 757 Dec 14 2017 /etc/profile.d/gawk.sh
-rw-r--r-- 1 root root 70 Aug 31 08:25 /etc/profile.d/gnome-ssh-askpass.sh
-rw-r--r-- 1 root root 288 Mar 12 2018 /etc/profile.d/kde.sh
-rw-r--r--. 1 root root 2703 May 25 07:04 /etc/profile.d/lang.sh
-rw-r--r--. 1 root root 253 Feb 17 2018 /etc/profile.d/less.sh
-rwxr-xr-x 1 root root 153 Aug 3 2017 /etc/profile.d/mc.sh
-rw-r--r-- 1 root root 488 Oct 3 13:49 /etc/profile.d/myBashConfig.sh
-rw-r--r--. 1 root root 248 Sep 19 04:31 /etc/profile.d/vim.sh
-rw-r--r--. 1 root root 2092 May 21 2018 /etc/profile.d/vte.sh
-rw-r--r--. 1 root root 310 Feb 17 2018 /etc/profile.d/which2.sh
这里有一个自定义添加的文件
myBashConfig.sh
,其内容如下:
#####################################################################
# The following global changes to Bash configuration added by me
#####################################################################
alias lsn='ls --color=no'
alias vim='vim -c "colorscheme desert" '
alias glances='glances -t1'
# Set vi for Bash editing mode
set -o vi
# Set vi as the default editor for all apps that check this
# Set some shell variables
EDITOR=vi
TERM=xterm
可以查看
/etc/profile.d
中其他bash配置文件的内容,了解它们的功能。
6.
/etc/profile
中的最后一段代码用于源并运行
/etc/bashrc
文件(如果存在),并检查
$BASH_VERSION-
变量是否不为空:
if [ -n "${BASH_VERSION-}" ] ; then
if [ -f /etc/bashrc ] ; then
# Bash login shells run only /etc/profile
# Bash non-login shells run only /etc/bashrc
通过以上内容,我们详细了解了Linux系统的启动、登录、恢复模式以及shell配置等方面的知识,希望这些内容能帮助大家更好地掌握Linux系统的操作和管理。
超级会员免费看

被折叠的 条评论
为什么被折叠?



