Debian系统初始化是指在安装Debian操作系统后,进行一系列的配置和设置,以确保系统能够正常运行并满足用户的需求。这些操作可以帮助用户更好地理解和掌握Debian系统,提高系统的可用性和安全性。本教程将详细介绍Debian系统初始化的过程。
一、启动过程概述
参考《Debian系统启动过程》。
二、Systemd
参考《Debian Systemd初始化》。
三、内核消息
在控制台上显示的内核错误信息,能够通过设置他们的阈值水平来配置。
# dmesg -n3
内核错误级别表:
错误级别值 | 错误级别名称 | 说明 |
---|---|---|
0 | KERN_EMERG | 系统不可用 |
1 | KERN_ALERT | 行为必须被立即采取 |
2 | KERN_CRIT | 危险条件 |
3 | KERN_ERR | 错误条件 |
4 | KERN_WARNING | 警告条件 |
5 | KERN_NOTICE | 普通但重要的条件 |
6 | KERN_INFO | 信息提示 |
7 | KERN_DEBUG | debug 级别的信息 |
四、系统消息
在 systemd 下, 内核和系统的信息都通过日志服务 systemd-journald.service (又名 journald)来记录,放在”/var/log/journal”下的不变的二进制数据,或放在”/run/log/journal/”下的变化的二进制数据.这些二进制日志数据,可以通过 journalctl(1) 命令来访问。例如,可以显示从最后一次启动以来的日志,按如下所示:
$ journalctl -b
典型的 journalctl 命令片段列表:
操作 | 命令片段 |
---|---|
查看从最后一次启动开始的系统服务和内核日志 | “journalctl -b --system “ |
查看从最后一次启动开始的当前用户的服务日志 | “journalctl -b --user “ |
查看从最后一次启动开始的 “$unit ” 工作日志 |
“journalctl -b -u $unit “ |
查看从最后一次启动开始的 “$unit “的工作日志 (“tail -f ” 式样) |
“journalctl -b -u $unit -f “ |
在 systemd 下,系统日志工具 rsyslogd(8) 可以被卸载。如果安装了它,它会改变它的行为来读取易失性二进制日志数据(代替在 systemd 之前默认的 “/dev/log”)并创建传统的永久性 ASCII 系统日志数据。”/etc/default/rsyslog” 和 “/etc/rsyslog.conf” 能够自定义日志文件和屏幕显示。
五、系统管理
systemd 不仅仅提供系统初始化,还用 systemctl(1) 命令提供通用的系统管理操作。
典型的 systemctl 命令片段列表:
操作 | 命令片段 |
---|---|
列出所有 target 单元配置 | “systemctl list-units --type=target “ |
列出所有 service 单元配置 | “systemctl list-units --type=service “ |
列出所有单元配置类型 | “systemctl list-units --type=help “ |
列出内存中所有 socket 单元 | “systemctl list-sockets “ |
列出内存中所有 timer 单元 | “systemctl list-timers “ |
启动 “$unit “ |
“systemctl start $unit “ |
停止 “$unit “ |
“systemctl stop $unit “ |
重新加载服务相关的配置 | “systemctl reload $unit “ |
停止和启动所有 “$unit “ |
“systemctl restart $unit “ |
启动 “$unit ” 并停止所有其它的 |
“systemctl isolate $unit “ |
转换到 “图形 ” (图形界面系统) |
“systemctl isolate graphical “ |
转换到 “多用户 ” (命令行系统) |
“systemctl isolate multi-user “ |
转换到 “应急模式 ” (单用户命令行系统) |
“systemctl isolate rescue “ |
向”$unit “发送杀死信号 |
“systemctl kill $unit “ |
检查”$unit “服务是否是活动的 |
“systemctl is-active $unit “ |
检查”$unit “服务是否是失败的 |
“systemctl is-failed $unit “ |
检查”$unit|$PID|device “的状态 |
“systemctl status $unit|$PID|$device “ |
显示”$unit|$job “的属性 |
“systemctl show $unit|$job “ |
重设失败的”$unit “ |
“systemctl reset-failed $unit" |
列出所有单元服务的依赖性 | “systemctl list-dependencies --all “ |
列出安装在系统上的单元文件 | “systemctl list-unit-files “ |
启用 “$unit ” (增加符号链接) |
“systemctl enable $unit “ |
禁用 “$unit ” (删除符号链接) |
“systemctl disable $unit “ |
取消遮掩 “$unit ” (删除到 “/dev/null ” 的符号链接) |
“systemctl unmask $unit “ |
遮掩 “$unit ” (增加到 “/dev/null ” 的符号链接) |
“systemctl mask $unit “ |
获取默认的 target 设置 | “systemctl get-default “ |
设置默认 target 为”graphical ” (图形系统) |
“systemctl set-default graphical “ |
设置默认的 target 为”multi-user ” (命令行系统) |
“systemctl set-default multi-user “ |
显示工作环境变量 | “systemctl show-environment “ |
设置环境变量 “variable ” 的值为 “value “ |
“systemctl set-environment variable=value “ |
取消环境变量 “variable ” 的设置 |
“systemctl unset-environment variable “ |
重新加载所有单元文件和后台守护进程(daemon) | “systemctl daemon-reload “ |
关闭系统 | “systemctl poweroff “ |
关闭和重启系统 | “systemctl reboot “ |
挂起系统 | “systemctl suspend “ |
休眠系统 | “systemctl hibernate “ |
上面例子中的”$unit”,可以是一个单元名(后缀.service 和 .target 是可选的),或者,在很多情况下,也可以是匹配的多个单元 (shell 式样的全局通配符”*”, “?”, “[]”,通过使用 fnmatch(3) ,来匹配目前在内存中的所有单元的基本名称).
上面列子的系统状态改变命令,通常是通过”sudo”来处理,用以获得需要的系统管理权限。
“systemctl status $unit|$PID|$device” 的输出使用有颜色的点(“●”)来概述单元状态,让人看一眼就知道。
- 白色的 “●” 表示一个 “不活动”或”变为不活动中”的状态。
- 红色的 “●”表示“失败”或者“错误”状态。
- 绿色”●”表示“活动”、“重新加载中”或“激活中”状态。
六、其它系统监控
这里是 systemd 下其它零星的监控命令列表。
systemd 下其它零星监控命令列表:
操作 | 命令片段 |
---|---|
显示每一个初始化步骤所消耗的时间 | “systemd-analyze time “ |
列出所有单元的初始化时间 | “systemd-analyze blame “ |
加载”$unit “文件并检测错误 |
“systemd-analyze verify $unit “ |
简洁的显示用户调用会话的运行时状态信息 | “loginctl user-status “ |
简洁的显示调用会话的运行时状态信息 | “loginctl session-status “ |
跟踪 cgroups 的启动过程 | “systemd-cgls “ |
跟踪 cgroups 的启动过程 | “ps xawf -eo pid,user,cgroup,args “ |
跟踪 cgroups 的启动过程 | 读取 “/sys/fs/cgroup/ ” 下的 sysfs |
七、系统配置
1、主机名
内核维护系统主机名。在启动的时候,通过 systemd-hostnamed.service 启动的系统单位设置系统的主机名,此主机名保存在 “/etc/hostname”。这个文件应该只包含系统主机名,而不是全称域名。不带参数运行 hostname(1) 命令可以打印出当前的主机名。
2、文件系统
- 硬盘和网络文件系统的挂载选项可以在 “/etc/fstab” 中设置,;
- 加密文件系统的配置设置在“/etc/crypttab”中;
- 软 RAID 的配置 mdadm(8) 设置在 “/etc/mdadm/mdadm.conf”。
每次启动的时候,在挂载了所有文件系统以后,”/tmp”, “/var/lock”, 和 “/var/run” 中的临时文件会被清空。
3、网络接口初始化
对于使用 systemd 的现代 Debian 桌面系统,网络接口通常由两个服务进行初始化:lo 接口通常在“networking.service”处理,而其它接口则由“NetworkManager.service”处理。
4、云系统初始化
云系统实例可作为 “Debian 官方云镜像 “或类似镜像的克隆启动。对于此类系统实例,可使用 cloud-init 和 netplan.io 软件包提供的功能配置主机名、文件系统、网络、本地语言、SSH 密钥、用户和组等个性信息,并使用多种数据源(如原始系统镜像中的文件和启动时提供的外部数据)。这些软件包使用 YAML 数据实现了声明式系统配置。
5、调整 sshd 服务的自定义示例
使用默认安装,通过 systemd 启动的过程中,在 network.target 启动后,很多网络服务 (参见 第 6 章 网络应用)作为后台守护进程(daemon)启动。 “sshd” 也不列外。让我们修改为按需启动”sshd” 作为一个定制化的例子。
首先,禁用系统安装的服务单元。
$ sudo systemctl stop sshd.service $ sudo systemctl mask sshd.service
传统 Unix 服务的按需套接字激活(on-demand socket activation)系统由 inetd (或 xinetd)超级服务来提供。在 systemd 下, 相同功能能够通过增加*.socket 和 *.service 单元配置文件来启用。
sshd.socket 用来定义一个监听的套接字
[Unit] Description=SSH Socket for Per-Connection Servers [Socket] ListenStream=22 Accept=yes [Install] WantedBy=sockets.target
sshd@.service 作为 sshd.socket 匹配的服务文件
[Unit] Description=SSH Per-Connection Server [Service] ExecStart=-/usr/sbin/sshd -i StandardInput=socket
然后重新加载。
$ sudo systemctl daemon-reload
八、udev系统
从 Linux 内核 2.6 版开始,udev系统 提供了自动硬件发现和初始化机制。在内核发现每个设备的基础上,udev 系统使用从 sysfs 文件系统的信息启动一个用户进程,使用 modprobe(8) 程序加载支持它所要求的内核模块, 创建相应的设备节点。
如果由于某些理由,”/lib/modules/kernel-version/modules.dep”没有被 depmod(8) 正常生成,模块可能不会被 udev 系统按期望的方式加载。执行”depmod -a” 来修复它。
“/etc/fstab”里面的挂载规则,设备节点不必需是静态的。能够使用 UUID 来挂载设备,来代替”/dev/sda”之类的设备名. 参见 第 9.6.3 节 “使用 UUID 访问分区”.
1、内核模块初始化
通过 modprobe(8) 程序添加和删除内核模块,使我们能够从用户进程来配置正在运行的 Linux 内核。udev 系统自动化它的调用来帮助内核模块初始化。
下面的非硬件模块和特殊的硬件驱动模块,需要被预先加载,把它们在”/etc/modules”文件里列出 :
- TUN/TAP 模块提供虚拟的 Point-to-Point 网络设备 (TUN) 和虚拟的 Ethernet 以太网网络设备 (TAP);
- netfilter 模块提供 netfilter 防火墙能力;
- watchdog timer 驱动模块;
- modprobe(8) 程序的配置文件是按 modprobe.conf(5)的说明放在”/etc/modprobes.d/” 目录下,(如果想避免自动加载某些内核模块,考虑把它们作为黑名单放在”/etc/modprobes.d/blacklist” 文件里.);
- “/lib/modules/version/modules.dep” 文件由 depmod(8) 程序生成,它描述了 modprobe(8) 程序使用的模块依赖性;
- 如果在启动时出现模块加载问题,或者 modprobe(8)时出现模块加载问题, “depmod -a” 可以通过重构”modules.dep”来解决这些问题;
- modinfo(8) 程序显示 Linux 内核模块信息;
- lsmod(8) 程序以好看的格式展示”/proc/modules”的内容,显示当前内核加载了哪些模块。