22、深入探索Linux系统的定制与启动配置

深入探索Linux系统的定制与启动配置

1. 定制启动和关机脚本

LFS启动脚本以高效的方式启动和关闭系统,但可以通过调整 /etc/sysconfig/rc.site 文件中的设置来进一步提高速度,并根据个人偏好调整消息。以下是一些可调整的设置:
- 跳过 udev settle :在 udev 启动脚本中, udev settle 命令可能需要一些时间来完成。如果系统中只有简单分区和单个以太网卡,启动过程可能不需要等待此命令。可以通过设置 OMIT_UDEV_SETTLE=y 来跳过它。
- 跳过 udev_retry 中的 udev settle udev_retry 脚本默认也会运行 udev settle 。只有在 /var 目录单独挂载时,此命令才是必需的。可以通过设置 OMIT_UDEV_RETRY_SETTLE=y 来跳过它。
- 启用 fsck 输出 :默认情况下,文件系统检查是静默的,这可能会在启动过程中造成延迟。可以通过设置 VERBOSE_FSCK=y 来开启 fsck 输出。
- 跳过文件系统检查 :重启时,可以通过创建 /fastboot 文件或使用 /sbin/shutdown -f -r now 命令来跳过文件系统检查 fsck 。也可以通过创建 /forcefsck 文件或使用 -F 参数运行 shutdown 命令来强制检查所有文件系统。设置 FASTBOOT=y 将在启动过程中禁用 fsck ,但不建议长期使用。
- 跳过清理 /tmp 目录 :通常, /tmp 目录中的所有文件在启动时都会被删除,这可能会导致启动过程明显延迟。可以通过设置 SKIPTMPCLEAN=y 来跳过删除这些文件。
- 减少关机延迟 :关机时, init 程序会向它启动的每个程序发送 TERM 信号,等待一段时间(默认3秒),然后发送 KILL 信号并再次等待。可以通过传递 -t0 参数来消除 init 的延迟(例如 /sbin/shutdown -t0 -r now ),并通过设置 KILLDELAY=0 来跳过 sendsignals 脚本的延迟。

2. Bash shell启动文件

/bin/bash 使用一组启动文件来创建运行环境。不同的文件有不同的用途,并且可能会对登录和交互式环境产生不同的影响。 /etc 目录中的文件提供全局设置,如果主目录中存在等效文件,则可能会覆盖全局设置。
- 交互式登录shell :使用 /bin/login 成功登录后,通过读取 /etc/passwd 文件启动。
- 交互式非登录shell :在命令行启动(例如 [prompt]$/bin/bash )。
- 非交互式shell :通常在运行shell脚本时存在,因为它正在处理脚本,不需要在命令之间等待用户输入。

当shell作为交互式登录shell调用时,会读取 /etc/profile ~/.bash_profile 文件。 /etc/profile 文件设置了一些支持本地语言所需的环境变量,正确设置这些变量可以实现以下功能:
- 程序输出翻译成本地语言
- 正确分类字符为字母、数字和其他类别
- 正确的国家字母排序顺序
- 适当的默认纸张大小
- 正确格式化货币、时间和日期值

要设置这些变量,需要将 <ll> 替换为所需语言的双字母代码(例如“en”), <CC> 替换为适当国家的双字母代码(例如“GB”), <charmap> 替换为所选区域设置的规范字符映射。可以使用以下命令获取Glibc支持的所有区域设置列表:

locale -a

为了确定规范名称,可以运行以下命令,其中 <locale name> locale -a 为首选区域设置输出的值(例如“en_GB.iso88591”):

LC_ALL=<locale name> locale charmap

确定正确的区域设置后,可以创建 /etc/profile 文件:

cat > /etc/profile << "EOF"
# Begin /etc/profile
export LANG=<ll>_<CC>.<charmap><@modifiers>
# End /etc/profile
EOF

需要注意的是,“C”(默认)和“en_US.utf8”(美国英语用户推荐)区域设置是不同的。“C”使用US - ASCII 7位字符集,将高位设置为“on”的字节视为无效字符。一些基于UTF - 8的区域设置可能不受某些程序的良好支持。

3. 创建 /etc/inputrc 文件

inputrc 文件是 readline 库的配置文件,它在用户从终端输入命令时提供编辑功能。 readline bash 和大多数其他shell以及许多其他应用程序使用。

大多数人不需要特定于用户的功能,因此可以使用以下命令创建一个全局的 /etc/inputrc 文件,供所有登录用户使用:

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off
# Enable 8-bit input
set meta-flag On
set input-meta On
# Turns off 8th bit stripping
set convert-meta Off
# Keep the 8th bit for display
set output-meta On
# none, visible or audible
set bell-style none
# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word
# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF
4. 创建 /etc/shells 文件

shells 文件包含系统上的登录shell列表,应用程序使用此文件来确定shell是否有效。每个shell应该有一行,包含相对于目录结构根目录( / )的shell路径。可以使用以下命令创建 /etc/shells 文件:

cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
# End /etc/shells
EOF
5. 创建 /etc/fstab 文件

/etc/fstab 文件用于确定文件系统的默认挂载位置、挂载顺序以及在挂载前需要检查的文件系统。可以使用以下命令创建新的文件系统表:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system  mount-point  type     options             dump  fsck
#                                                              order
/dev/<xxx>     /            <fff>    defaults            1     1
/dev/<yyy>     swap         swap     pri=1               0     0
proc           /proc        proc     nosuid,noexec,nodev 0     0
sysfs          /sys         sysfs    nosuid,noexec,nodev 0     0
devpts         /dev/pts     devpts   gid=5,mode=620      0     0
tmpfs          /run         tmpfs    defaults            0     0
devtmpfs       /dev         devtmpfs mode=0755,nosuid    0     0
tmpfs          /dev/shm     tmpfs    nosuid,nodev        0     0
# End /etc/fstab
EOF

需要将 <xxx> <yyy> <fff> 替换为适合系统的值,例如 sda2 sda5 ext4 。对于MS - DOS或Windows起源的文件系统(如 vfat ntfs smbfs cifs iso9660 udf ),需要使用特殊选项 utf8 来正确解释文件名中的非ASCII字符。对于非UTF - 8区域设置, iocharset 的值应设置为与区域设置的字符集相同。对于UTF - 8区域设置,应使用 utf8 选项而不是 iocharset=utf8

对于 ext3 文件系统,可以通过在 /etc/fstab 中添加 barrier=1 挂载选项来提高某些硬盘类型在电源故障时的可靠性。可以使用 hdparm 命令检查磁盘驱动器是否支持此选项,例如:

hdparm -I /dev/sda | grep NCQ

如果输出非空,则支持该选项。需要注意的是,基于逻辑卷管理(LVM)的分区不能使用 barrier 选项。

6. 安装Linux内核

Linux包包含Linux内核,安装内核涉及配置、编译和安装几个步骤。

6.1 准备编译

在编译之前,需要运行以下命令确保内核树绝对干净:

make mrproper
6.2 配置内核选项

可以通过菜单驱动界面来配置内核选项,例如:

make menuconfig

也可以使用 LANG=<host_LANG_value> LC_ALL= 来设置区域设置,以确保在UTF - 8 Linux文本控制台上正确绘制 menuconfig ncurses 界面。

一个好的内核配置起点是运行 make defconfig ,它会根据当前系统架构设置基本配置。同时,需要确保启用或禁用以下功能:
| 功能 | 配置选项 | 说明 |
| ---- | ---- | ---- |
| 构建可重定位内核 | [*] Build a relocatable kernel [CONFIG_RELOCATABLE] | 使内核可重定位 |
| 随机化内核映像地址 | [*] Randomize the address of the kernel image (KASLR) [CONFIG_RANDOMIZE_BASE] | 增强内核安全性 |
| 不将警告视为错误 | [ ] Compile the kernel with warnings as errors [CONFIG_WERROR] | 避免因编译器或配置不同导致构建失败 |
| 不通过 /sys/kernel/kheaders.tar.xz 启用内核头文件 | < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS] | 避免依赖未安装的 cpio |
| 启用栈保护缓冲区溢出检测 | [*] Stack Protector buffer overflow detection [CONFIG_STACKPROTECTOR] | 增强内核安全性 |
| 启用强栈保护 | [*] Strong Stack Protector [CONFIG_STACKPROTECTOR_STRONG] | 进一步增强栈保护 |
| 支持帧缓冲设备 | <*> Support for frame buffer devices ---> | 支持图形显示 |
| 支持帧缓冲控制台 | [*] Framebuffer Console support [CONFIG_FRAMEBUFFER_CONSOLE] | 使Linux控制台在帧缓冲设备上显示 |
| 不支持 uevent 助手 | [ ] Support for uevent helper [CONFIG_UEVENT_HELPER] | 避免与Udev/Eudev设备管理冲突 |
| 维护 devtmpfs 文件系统 | [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS] | 自动创建设备节点 |
| 自动挂载 devtmpfs | [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT] | 在挂载根文件系统后自动挂载 devtmpfs |

如果构建64位系统,还需要按顺序启用以下功能:
- [*] Support x2apic [CONFIG_X86_X2APIC]
- [*] PCI Support ---> [CONFIG_PCI]
- [*] Message Signaled Interrupts (MSI and MSI - X) [CONFIG_PCI_MSI]
- [*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT]
- [*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]

6.3 编译内核

配置完成后,运行以下命令编译内核映像和模块:

make
6.4 安装模块

如果内核配置中启用了模块支持,需要运行以下命令安装模块:

make modules_install
6.5 复制文件到 /boot 目录

编译完成后,需要将一些文件复制到 /boot 目录:

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.1.11-lfs-11.3
cp -iv System.map /boot/System.map-6.1.11
cp -iv .config /boot/config-6.1.11
6.6 安装内核文档
install -d /usr/share/doc/linux-6.1.11
cp -r Documentation/* /usr/share/doc/linux-6.1.11

需要注意的是,内核源目录中的文件可能不是由 root 拥有的。如果要保留内核源树,需要运行 chown -R 0:0 命令确保所有文件都由 root 用户拥有。同时,不要在LFS系统上创建从 /usr/src/linux 指向内核源目录的符号链接,因为这可能会导致后续构建包时出现问题。

以下是内核安装的流程图:

graph TD;
    A[准备编译] --> B[配置内核选项];
    B --> C[编译内核];
    C --> D[安装模块];
    D --> E[复制文件到/boot目录];
    E --> F[安装内核文档];

通过以上步骤,可以定制Linux系统的启动和关机脚本,配置shell环境,创建文件系统表,并成功安装Linux内核,使系统能够顺利启动和运行。在实际操作过程中,需要根据自己的系统需求和硬件情况进行适当调整。

深入探索Linux系统的定制与启动配置

7. 内核配置的详细解释

在配置内核时,各个选项都有其特定的作用和意义,以下是对一些关键配置选项的详细解释:
- Randomize the address of the kernel image (KASLR) :启用此选项( CONFIG_RANDOMIZE_BASE )可以为内核映像启用地址空间布局随机化(ASLR),这有助于减轻一些基于内核中敏感数据或代码固定地址的攻击。通过随机化内核映像的地址,攻击者更难预测和利用内核中的特定地址,从而提高了系统的安全性。
- Compile the kernel with warnings as errors :若启用此选项( CONFIG_WERROR ),编译器会将警告视为错误。然而,如果编译器和/或配置与内核开发者的不同,这可能会导致构建失败。因此,通常建议不启用此选项,以避免不必要的构建问题。
- Enable kernel headers through /sys/kernel/kheaders.tar.xz :启用此选项( CONFIG_IKHEADERS )需要使用 cpio 来构建内核,但在LFS系统中 cpio 并未安装。所以,为了避免依赖未安装的工具,不建议启用此选项。
- Strong Stack Protector :启用此选项( CONFIG_STACKPROTECTOR_STRONG )可以为内核启用强栈保护(SSP)。在配置GCC时,已经为整个用户空间启用了默认的SSP,但内核并不使用GCC的默认SSP设置,因此需要在这里显式启用。
- Support for uevent helper :启用此选项( CONFIG_UEVENT_HELPER )可能会在使用Udev/Eudev进行设备管理时产生干扰。Udev/Eudev有自己的设备管理机制,启用此选项可能会导致冲突,因此不建议启用。
- Maintain a devtmpfs filesystem to mount at /dev :启用此选项( CONFIG_DEVTMPFS )会创建一个由内核自动填充的设备节点文件系统 devtmpfs ,即使在Udev未运行的情况下也能正常工作。Udev会在 devtmpfs 之上运行,负责管理权限和添加符号链接。这是使用Udev/Eudev的所有用户都必需的配置项。
- Automount devtmpfs at /dev :启用此选项( CONFIG_DEVTMPFS_MOUNT )会在内核挂载根文件系统后,自动将 devtmpfs 挂载到 /dev 目录。这确保了在系统启动过程中,设备节点能够及时挂载,为后续的设备管理提供支持。
- Framebuffer Console support :启用此选项( CONFIG_FRAMEBUFFER_CONSOLE )可以使Linux控制台在帧缓冲设备上显示。为了允许内核在启动早期打印调试消息,除非使用initramfs,否则不建议将其构建为内核模块。如果启用了 CONFIG_DRM (直接渲染管理器),可能还需要启用 CONFIG_DRM_FBDEV_EMULATION (为模式设置驱动程序启用传统的fbdev支持)。
- Support x2apic :对于64位x86系统,固件可能会启用x2APIC模式。启用此选项( CONFIG_X86_X2APIC )可以支持64位x86处理器的中断控制器在x2APIC模式下运行。如果固件启用了x2APIC,而内核未启用此选项,系统在启动时可能会崩溃。如果固件禁用了x2APIC,此选项不会产生任何影响,也不会造成损害。

8. 其他配置方式及注意事项

除了使用 make menuconfig 进行内核配置外,还可以使用 make oldconfig make oldconfig 适用于在已有配置的基础上进行更新,它会询问用户关于新出现的配置选项的设置,而对于已有的配置选项则使用之前的设置。具体使用哪种方式取决于个人的需求和情况。

另外,如果希望跳过内核配置过程,可以从主机系统复制内核配置文件 .config 到解压后的 linux - 6.1.11 目录。但不建议这样做,因为手动探索所有配置菜单并从头创建内核配置可以更好地了解系统需求和硬件情况,确保内核配置的准确性和适用性。

9. 模块配置与相关信息

如果在配置内核时启用了模块支持,可能需要对 /etc/modprobe.d 进行模块配置。关于模块和内核配置的信息可以在相关文档中找到,例如在 linux - 6.1.11/Documentation 目录下的内核文档,以及 modprobe.d(5) 手册页。

10. 不同文件系统的挂载选项

在创建 /etc/fstab 文件时,不同类型的文件系统有不同的挂载选项需求:
| 文件系统类型 | 挂载选项说明 |
| ---- | ---- |
| MS - DOS或Windows起源的文件系统(vfat, ntfs, smbfs, cifs, iso9660, udf) | 对于非ASCII字符的文件名,需要使用特殊选项 utf8 。对于非UTF - 8区域设置, iocharset 的值应设置为与区域设置的字符集相同,以确保文件系统能够正确解释文件名。对于UTF - 8区域设置,应使用 utf8 选项而不是 iocharset=utf8 ,以避免文件系统大小写敏感的问题。 |
| ext3文件系统 | 对于某些硬盘类型,可以通过在 /etc/fstab 中添加 barrier=1 挂载选项来提高在电源故障时的可靠性。可以使用 hdparm -I /dev/sda | grep NCQ 命令检查磁盘驱动器是否支持此选项,如果输出非空,则支持该选项。但基于逻辑卷管理(LVM)的分区不能使用 barrier 选项。 |

11. 后续配置和维护建议
  • 区域设置的测试 :在将区域设置添加到Bash启动文件之前,需要进行测试。可以使用以下命令进行测试:
LC_ALL=<locale name> locale language
LC_ALL=<locale name> locale charmap
LC_ALL=<locale name> locale int_curr_symbol
LC_ALL=<locale name> locale int_prefix

这些命令应该分别打印出区域设置的语言名称、字符编码、本地货币和拨打国际电话的前缀。如果任何命令失败并显示类似“locale: Cannot set LC_ to default locale: No such file or directory”的消息,说明该区域设置可能未在之前的步骤中安装,或者不受Glibc的默认安装支持。可以使用 localedef 命令安装所需的区域设置,或者考虑选择其他区域设置。
-
内核源树的管理 :如果打算保留内核源树,需要运行 chown -R 0:0 命令确保所有文件都由 root 用户拥有,以避免因文件所有权问题导致的安全风险。同时,不要在LFS系统上创建从 /usr/src/linux 指向内核源目录的符号链接,因为这可能会导致后续构建包时出现问题。
-
定期更新内核配置 *:在后续安装BLFS中的包时,可能需要更新内核配置。与其他包不同,安装新内核后不需要删除内核源树。可以根据新包的需求,重新配置和编译内核。

12. 总结

通过对启动和关机脚本的定制、Bash shell启动文件的配置、 /etc/inputrc /etc/shells 文件的创建、 /etc/fstab 文件的设置以及Linux内核的安装和配置,可以对Linux系统进行全面的定制和优化。在整个过程中,需要根据系统的硬件情况、个人需求和安全要求进行适当的调整。同时,要注意各个步骤之间的依赖关系和配置选项的含义,确保系统能够稳定、安全地运行。

以下是整个系统配置流程的总结流程图:

graph LR;
    A[定制启动和关机脚本] --> B[配置Bash shell启动文件];
    B --> C[创建/etc/inputrc和/etc/shells文件];
    C --> D[创建/etc/fstab文件];
    D --> E[安装和配置Linux内核];
    E --> F[测试和维护系统];

希望这些步骤和建议能够帮助你成功定制和启动自己的Linux系统。在实际操作中,遇到问题时可以参考相关文档和社区资源,不断探索和学习,以更好地掌握Linux系统的配置和管理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值