企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 第 15 章 基本系统 **目录** [](ch15.html#id3066195) [目录结构](ch15s02.html) [启动流程](ch15s03.html) [更改运行级别](ch15s03.html#id3066385) [服务管理](ch15s04.html) [更改启动服务](ch15s04.html#id3066469) [手动控制服务](ch15s04.html#init.d) [常见系统服务](ch15s04.html#id3066659) [配置文件](ch15s05.html) [全局配置文件](ch15s05.html#id3067198) [用户配置文件](ch15s05.html#id3067438) [环境变量](ch15s06.html) [常用环境变量](ch15s06.html#id3067727) ## 目录结构 各种 Linux 发行版的目录结构可能不太一样,但它们都遵循 FHS(Filesystem Hierarchy Stand)。 实际上 FHS 只是规定了根目录下的各主要目录应该放些什么文件,仅了解这些还不够,下面是一般情况下 Linux 系统的目录结构 ``` / 根目录 │ ├boot/ 启动文件。所有与系统启动有关的文件都保存在这里 │ └grub/ Grub 引导器相关的文件 │ ├dev/ 设备文件 ├proc/ 内核与进程镜像 │ ├mnt/ 临时挂载 ├media/ 挂载媒体设备 │ ├root/ root用户 的 $HOME 目录 ├home/ │ ├user/ 普通用户 的 $HOME 目录 │ └.../ │ ├bin/ 系统程序 ├sbin/ 管理员系统程序 ├lib/ 系统程序库文件 ├etc/ 系统程序和大部分应用程序的全局配置文件 │ ├init.d/ SystemV 风格的启动脚本 │ ├rcX.d/ SystemV 启动脚本的链接,定义运行级别 │ ├rc.d/ BSD 风格的启动脚本 │ ├rc.xxx BSD 风格启动脚本,定义运行级别 │ ├network/ 网络配置文件 │ ├X11/ 图形界面配置文件 │ ├usr/ │ ├bin/ 应用程序 │ ├sbin/ 管理员应用程序 │ ├lib/ 应用程序库文件 │ ├share/ 应用程序资源文件 │ ├src/ 应用程序源代码 │ ├local/ │ │ ├soft/ 用户程序 │ │ └.../ 通常使用单独文件夹 │ ├X11R6/ 图形界面系统 │ ├var/ 动态数据 │ ├temp/ 临时文件 ``` ## 启动流程 1. 读取 MBR 的信息,启动 Boot Manager![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) 2. 加载系统内核,启动 init进程![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) 3. init进程 读取 `/etc/inittab` 文件中的信息,并进入预设的运行级别,按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 选项启动,并指向一个系统中的程序。![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) 4. 根据 `/etc/rcS.d/`文件夹中对应的脚本启动 Xwindow 服务器 xorg ![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png) 5. 启动登录管理器,等待用户登录 ![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png) > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s03.html#boot1) Windows 使用 NTLDR 作为 Boot Manager,如果您的系统中安装多个版本的 Windows,您就需要在 NTLDR 中选择您要进入的系统。 Linux 通常使用功能强大,配置灵活的 GRUB 作为 Boot Manager,我们将在[第 22 章 _Grub_](ch22.html "第 22 章 Grub")中向您介绍它的使用方式。 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch15s03.html#boot2) init进程 是 Linux 的根进程,所有的系统进程都是它的子进程。 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch15s03.html#boot3) 通常情况下, `/etc/rcS.d/` 目录下的启动脚本首先被执行,然后是 `/etc/rcN.d/` 目录。例如您设定的运行级别为 3,那么它对应的启动目录为 `/etc/rc3.d/` 。 > [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch15s03.html#boot4) Xwindow 为 Linux 下的图形用户界面系统。 > [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch15s03.html#boot5) 大多 Linux 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中输入用户名和密码后,便可以登录系统。(您可以在 `/etc/rc3.d/` 文件夹中找到一个名为 `S13gdm` 的链接) ### 更改运行级别 在 `/etc/inittab` 文件中找到如下内容: ``` # The default runlevel. id:2:initdefault: ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s03.html#runlevel1) 2 为系统的运行级别,默认的运行级别涵义如下: | | | | --- | --- | | 0 | 关机 | | 1 | 单用户维护模式 | | 2~5 | 多用户模式 | | 6 | 重启 | ## 服务管理 ### 更改启动服务 在运行级别对应的文件夹中,您可以看到许多文件名以 S## 和 K## 起始的启动脚本链接。例如: ``` /etc/rcS.d/S35mountall.sh 挂载文件系统 /etc/rcS.d/S40networking 启用网络支持 /etc/rc2.d/S13gdm 启动登录管理器 /etc/rc2.d/S20makedev 创建设备文件 /etc/rc2.d/S23xinetd 启动超级进程 /etc/rc2.d/K20powernowd 针对某种硬件的电源管理支持 ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s04.html#runlevel21) init进程将以 **start** 为选项,按文件名顺序执行所有以 S## 起始的脚本。脚本名称中的数字越小,它将被越早执行。例如在 `/etc/rc2.d/` 文件夹中, `S13gdm` 文件名中的数字小于 `S23xinetd` , `S13gdm` 将比 `S23xinetd` 先执行。 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch15s04.html#runlevel22) 如果一个脚本链接,以 K## 起始,表示它将以 **stop** 选项被执行。如果相应服务没有启动,则不执行该脚本。 * 如果您想禁止某一服务在启动时自动运行,您可以将相应运行级别中的脚本由 S##xxx 重命名为 K##xxx 。 ### 手动控制服务 您也可以手动运行带有以下选项的启动脚本,来控制系统服务。 **start** 启动 **stop** 停止 **restart** 重启 ``` /etc/rc2.d/K20powernowd start ``` 有时您并不清楚某一运行级别有什么启动脚本;而且此类脚本的前三位字符并不固定,不便于记忆。这时,可以直接使用 `/etc/init.d/` 文件夹中的启动脚本( `/etc/rcX.d/` 中的启动脚本链接到 `/etc/init.d/` 文件夹下相应脚本),这也是推荐的方式。 ``` /etc/init.d/powernowd start ``` > 注意:以上命令的位置并没有包含在环境变量的搜索路径中,所以要输入完整路径。 ### 常见系统服务 | | | | --- | --- | | acpi-support | 高级电源管理支持 | | acpid | acpi 守护程序.这两个用于电源管理,非常重要 | | apmd | acpi 的扩展 | | alsa | 声音子系统 | | alsa-utils | 声音子系统实用工具 | | cron | 任务调度系统,建议开启 | | anacron | cron 的子系统,将系统关闭期间的计划任务,在下一次系统运行时执行 | | atd | 类似于 cron 的任务调度系统。建议关闭 | | binfmt-support | 核心支持其他二进制的文件格式 | | bluez-utiles | 蓝牙设备支持 | | bootlogd | 启动日志。开启它 | | syslog-ng | 系统日志,建议开启 | | klogd | 同上,使用一种就可以了 | | sysklogd | | cupsys | 打印机子系统 | | dbus | 消息总线系统(message bus system)。非常重要 | | dns-clean | 使用拨号连接时,清除 dns信息 | | evms | 企业卷管理系统 | | fetchmail | 邮件用户代理守护进程,用于收取邮件 | | gdm | gnome 登录管理器 | | gpm | 终端中的鼠标支持 | | halt | 别动它 | | hdparm | 调整硬盘的脚本,配置文件为 `/etc/hdparm.conf` | | hibernate | 系统休眠 | | hotkey-setup | 笔记本功能键支持 | | hotplug and hotplug-net | 即插即用支持,比较复杂,建议不要动它 | | ifrename | 网络接口重命名脚本。如果您有十块网卡,您应该开启它 | | inetd | 配置文件为 `/etc/inetd.conf` | | linux-restricted-modules-common | 受限模块支持。![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | | lvm | 逻辑卷管理系统支持 | | makedev | 创建设备文件,非常重要 | | mdamd | 磁盘阵列 | | module-init-tools | 从`/etc/modules`加载扩展模块,建议开启 | | networking | 网络支持。按 `/etc/network/interfaces` 文件预设激活网络,非常重要 | | ntpdate | 时间同步服务,建议关闭 | | pcmcia | pcmcia 设备支持 | | powernowd | 移动 CPU 节能支持 | | ppp | 拨号连接 | | ppp-dns | | readahead | 预加载库文件 | | reboot | 别动它 | | resolvconf | 自动配置 DNS | | rmnologin | 清除 nologin | | rsync | rsync 守护程序 | | sendsigs | 在重启和关机期间发送信号 | | single | 激活单用户模式 | | sshd | ssh服务器 | | sudo | 检查 sudo 状态 | | udev | 用户空间 dev文件系统(userspace dev filesystem)。重要 | | umountfs | 卸载文件系统 | | urandom | 随机数生成器 | | usplash | 开机画面支持 | | vbesave | 显卡 BIOS 配置工具。保存显卡的状态 | | xorg-common | 设置 X 服务 ICE socket | | adjtimex | 调整核心时钟的工具 | | dirmngr | 证书列表管理工具 | | hwtools | irqs 优化工具 | | libpam-devperm | 系统崩溃之后,用于修理设备文件许可的守护程序 | | lm-sensors | 板载传感器支持 | | mdadm-raid | 磁盘陈列管理器 | | screen-cleanup | 清除开机屏幕的脚本 | | xinetd | 管理其他守护进程的一个 inetd 超级守护程序 | > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s04.html#srv11) `/lib/linux-restricted-modules/` 文件夹中的模块为受限模块。例如某些驱动程序,如果您没有使用受限模块,就不需要开启它。 ## 配置文件 > 小心:无论任何情况下,修改配置文件之前,先备份它 建议使用这个命令 ``` sudo cp xxx xxx_`date +%y%m%d_%H:%M` ``` 当然这很麻烦,您可以新建一个名为 bak 的文件,内容如下: ``` #!/bin/bash sudo cp $1 $1_`date +%y%m%d_%H:%M` ``` 把它放在您能够记住的目录下,比如 `/home` ,执行命令 **sh /home/bak xxx** ,就可以将当前文件夹下的文件 `xxx` 另存为 `xxx_yymmdd_HH:MM` 的格式了 ### 全局配置文件 **表 15.1. ** | 系统初始化 | /etc/inittab | 运行级别、控制台数量 | | --- | --- | | /etc/timezone | 时区 | | /etc/inetd.conf | 超级进程 | | 文件系统 | /etc/fstab | 开机时挂载的文件系统 | | /etc/mtab | 当前挂载的文件系统 | | 用户系统 | /etc/passwd | 用户信息 | | /etc/shadow | 用户密码 | | /etc/group | 群组信息 | | /etc/gshadow | 群组密码 | | /etc/sudoers | Sudoer 列表![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | | Shell | /etc/shell | 可用 Shell 列表 | | /etc/inputrc | ReadLine 控件设定 | | /etc/profile | 用户首选项 | | /etc/bash.bashrc | bash 配置文件 | | 系统环境 | /etc/environment | 环境变量 | | /etc/updatedb.conf | 文件检索数据库配置信息 | | /etc/issue | 发行信息 | | /etc/issue.net | | /etc/screenrc | 屏幕设定 | | 网络 | /etc/iftab | 网卡 MAC地址绑定 | | /etc/hosts | 主机列表 | | /etc/hostname | 主机名 | | /etc/resolv.conf | 域名解析服务器地址 | | /etc/network/interfaces | 网卡配置文件 | > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s05.html#conf11) 请使用“visudo”命令修改此文件,而不要直接编辑 ### 用户配置文件 `/etc/` 目录下的文件,只有 root用户 才有权修改。应用软件的全局配置文件,普通用户也不应该修改,因为所有用户都要用到。 如果要通过配置软件,来适应特殊需求,您可以修改用户配置文件。 用户配置文件通常为全局配置文件的同名隐藏文件,放在`$HOME`目录下,例如: | 全局配置文件 | 用户配置文件 | | --- | --- | | /etc/inputrc | /home/user/.inputrc | | /etc/vim/vimrc | /home/user/.vim/vimrc | | /etc/bash.bashrc | /home/user/.bashrc ![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s05.html#conf12) 也有少数例外,通常是系统程序 ## 环境变量 环境变量是作用在整个系统中的变量。 很多软件工作的时候都要读取环境变量[[21](ch15s06.html#ftn.id3067542)]的值来确定其工作方式。例如 cd 这个程序,如果不带任何选项执行,它会读取 `$HOME` 这个变量的值,然后进入到这个目录,也就是用户的 HOME 目录。使用 **echo** 显示一个环境变量: ``` echo $HOME /home/user echo HOME HOME ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s06.html#sys-env) 依据惯例,变量名称通常使用大写字母;`$` 告诉 echo 这是一个变量,不要将字符串“HOME”直接输出到屏幕 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch15s06.html#sys-env1) 输出字符串“HOME”到屏幕 ``` WELCOME="Hello!" echo $WELCOME Hello! env | grep WELCOME export WELCOME env | grep WELCOME Hello! ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s06.html#sys-env2) 定义一个变量 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch15s06.html#sys-env3) 输出这个变量 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch15s06.html#sys-env4) env 输出所有环境变量 > [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch15s06.html#sys-env6) 将输出通过管道发送到 grep,检查其中是否有“WELCOME”这个值 > [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch15s06.html#sys-env5) export 将变量 WELCOME 导出为环境变量 定义一个环境变量,可以将定义变量和导出变量一起进行 ``` export WELCOME ="Hello!" ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch15s06.html#sys-env7) 实际上不会有什么程序要用到 `$WELCOME` 这个变量,定义它只是为了演示 ### 常用环境变量 | 变量名 | 说明 | | --- | --- | | SHELL | 默认 Shell | | HISTSIZE | 历史纪录 | | PATH | 搜索路径 | | EDITOR | 默认编辑器 | | TERM | 默认终端 | | HOME | 用户目录 | | LANG | 系统语言 | | XMODIFIERS=@im | 默认输入法 | * * * > [[21](ch15s06.html#id3067542)] 必须由大量不同程序共享,独立于应用程序的优先选项,通常由环境变量指定, > 如果通过配置文件给每个程序分别指定,既麻烦又容易出差错。 > 例如[语言环境](ch20s03.html "设置 locale"),如果所有能够使用多语言的程序都使用自己的配置文件确定其工作界面的语言,逐一去修改它们的配置文件将是一件苦恼的事情