Linux 内核配置通常可以在文件/usr/src/linux/.config的内核源代码中找到。不建议直接编辑此文件,而是使用以下配置选项之一:
make config - 启动基于字符的问答会话
make menuconfig - 启动面向终端的配置工具(使用 ncurses)
make xconfig - 启动基于 X 的配置工具
相关帮助按钮显示的这些选择的描述可以在平面 ASCII 文件中找到: /usr/src/linux/Documentation/Configure.help
最终这些配置工具编辑.config 文件。选项将指示某些驱动程序已内置到内核中(“=y”)或将构建为模块(“=m”)或不选择。未选择状态可以通过以“#”开头的行(例如“# CONFIG_SCSI 未设置”)来指示,也可以通过.config文件中缺少相关行来指示。
SCSI 子系统(实际上选择 SCSI 中级驱动程序)的主要选择选项的 3 种状态如下。只有其中之一应该出现在实际的.config文件中:
CONFIG_SCSI=y
CONFIG_SCSI=m
# CONFIG_SCSI 未设置
其他一些常见的 SCSI 配置选项包括:
CONFIG_BLK_DEV_SD [磁盘 (sd) 驱动程序]
CONFIG_SD_EXTRA_DEVS [稍后添加的磁盘的额外插槽]
CONFIG_BLK_DEV_SR [SCSI cdrom (sr) 驱动程序]
CONFIG_BLK_DEV_SR_VENDOR [允许供应商特定的 cdrom 命令]
CONFIG_SR_EXTRA_DEVS [稍后添加的 cdrom 的额外插槽]
CONFIG_CHR_DEV_ST [ 磁带 (st) 驱动器]
CONFIG_CHR_DEV_OSST [OnSteam 磁带 (osst) 驱动程序]
CONFIG_CHR_DEV_SG [SCSI 通用 (sg) 驱动程序]
CONFIG_DEBUG_QUEUES [用于调试多个队列]
CONFIG_SCSI_MULTI_LUN [允许探测 lun 0 以上]
CONFIG_SCSI_CONSTANTS [SCSI 错误的符号解码]
CONFIG_SCSI_LOGGING [允许日志记录选择运行时]
CONFIG_SCSI_<ll_driver> [许多较低级别的适配器驱动程序]
CONFIG_SCSI_DEBUG [用于调试的较低级别驱动程序]
CONFIG_SCSI_PPA [较旧的并行端口 zip 驱动器]
CONFIG_SCSI_IMM [较新的并行端口 zip 驱动器]
CONFIG_BLK_DEV_IDESCSI [ide-scsi 伪适配器]
CONFIG_I2O_SCSI [通过 i2o 的 scsi 命令集]
CONFIG_SCSI_PCMCIA [对于 PCMCIA 总线上的 SCSI HBA]
CONFIG_USB_STORAGE [usb“大容量存储”类型]
CONFIG_MAGIC_SYSRQ [Alt+SysRq+S 用于紧急同步]
[Alt+SyrRq+U 用于紧急重新安装 ro]
如果根文件系统位于 SCSI 磁盘上,那么将 SCSI 中级、sd 驱动程序和磁盘连接到的主机适配器驱动程序构建到内核中是有意义的。在大多数情况下,将 sr、st 和 sg 驱动程序构建为模块通常是安全的,以便根据需要加载它们。如果像扫描仪这样的设备位于单独的适配器上,那么它的驱动程序很可能被构建为模块。在这种情况下,需要先加载该适配器驱动程序,然后才能识别扫描仪。
Linux 发行版将许多 SCSI 子系统驱动程序构建为模块,因为构建所有这些驱动程序将导致非常大的内核,从而超出引导加载程序的功能。这会导致“先有鸡还是先有蛋”的问题,即需要 SCSI 驱动程序来加载根文件系统,反之亦然。initrd 设备使用的 2 相负载解决了这个问题
启动
在 PC 上,主板的 BIOS 与大多数 SCSI 主机适配器提供的 SCSI BIOS 一起负责将引导加载程序的映像从 SCSI 磁盘加载到内存并执行它的问题。这可能需要更改主板 BIOS 中的某些设置。当涉及多个 SCSI 适配器时,可能需要更改 SCSI BIOS 设置以指示哪一个适配器包含带有引导映像的磁盘。启动映像也来自 ATA (IDE) 磁盘、可启动 CD-ROM 或软盘。
lilo和grub都是 Linux 中常用的引导加载程序。它们的配置文件分别位于 /etc/lilo.conf和/etc/grub.conf [ 3 ]中 。一个区别是,更改 lilo 的配置后, 必须执行lilo命令才能使更改生效(并且 grub 没有同等要求)。请参阅他们的“手册”页以获取使用信息。关于 lilo 和 Linux 启动顺序的优秀论文可以在 ftp://icaftp.epfl.ch/pub/people/almesber/booting/bootinglinux-0.ps.gz找到。有关 grub 的更多信息,请参阅 www.gnu.org/software/grub。
一些与SCSI子系统相关的启动参数:
single [进入单用户模式]
<n> [输入运行级别 <n> {0..6}]
root=/dev/sda6 [*]
root=/dev/scsi/host0/bus0/target0/lun0/part6 [ *]
root=/dev/sd/c0b0t0u0p6 [*]
devfs=mount [覆盖 CONFIG_DEVFS_MOUNT=n]
devfs=nomount [覆盖 CONFIG_DEVFS_MOUNT=y]
init=<command> [执行 <command> 而不是 init]
Quiet [将输出减少到启动期间控制台]
debug [启动期间增加控制台的输出]
nmi_watchdog=0 [关闭 SMP 计算机上的 NMI 看门狗]
max_scsi_luns=1 [将 SCSI 总线扫描限制为 lun==0]
- 当使用 devfs 时,根分区的初始只读挂载可以通过旧的 /dev/sd 表示法或新的 devfs 表示法(显示了其中的两个)来完成。当磁盘或适配器更改破坏了内核引导负载时,联合“root=/dev/sda6 single”可能会很有用。
“root=”参数也可以是十六进制数。例如,如果根分区位于/dev/sda3上,则“root=803”是合适的。最后两位数字是前面部分讨论的次设备号。
“init”参数的默认参数是/sbin/init (请参阅 man (8) init)。如果/etc/fstab 等文件的条目不正确,则使用“init=/bin/bash”直接进入 shell 可能会很有用。但是,如果共享库文件或其路径不合适,这也可能会失败。剩下的“init=/sbin/sash”是一个静态链接的 shell,内置了许多有用的命令(用于修复系统)(请参阅 man (8) sash)。
当 Linux 在报告如下消息后无法启动时:
VFS:无法打开根设备 08:02
那么内核期望在设备/dev/sda2 上找到根分区, 但没有找到。错误消息中的数字是主设备号和次设备号(十六进制)[有关到设备名称的映射,请参阅“设备名称”部分]。在这种情况下,“root”引导选项可能很有用(也可以使用rdev命令来修改引导映像在何处查找根分区)。
Lilo 的配置文件/etc/lilo.conf 可以通过两种方式采用“root=”选项。正常的方式是这样一行:‘root=/dev/sda2’。在这种情况下,/dev/sda2会根据执行lilo命令时 系统的状态转换为主编号和次编号。这可能会很麻烦,尤其是在要重新布置硬件的情况下。另一种方式是采用以下形式的行: ‘append=“root=/dev/sda2”’ 在这种情况下,/dev/sda2将在下次启动时传递到内核。这与在内核引导时提示符处给出“root=/dev/sda2”字符串相同。
[ 3 ] grub 的一个小问题是/etc/grub.conf是/boot/grub/grub.conf的符号链接。这对于了解/boot何时是单独的分区 很有用。