“UbuntuManual”的版本间的差异
来自Ubuntu中文
小 |
小 |
||
第3,187行: | 第3,187行: | ||
+ | == 第 7 章 - Ubuntu下的 Linux 内核 == | ||
+ | ---- | ||
+ | Ubuntu 使用自己的方法来编译内核及相关模块。参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-kernel-details| Ubuntu 和系统内核, 第 2.7 节]]。 | ||
+ | |||
+ | ---- | ||
+ | === 7.1 内核编译 === | ||
+ | Ubuntu Edgy 发行版中的 gcc、binutils 和 modutils 可用来编译最新的 Linux 内核。这方面的官方信息,参阅 /usr/share/doc/kernel-package/README.gz,特别是文件的后半部分。 | ||
+ | |||
+ | 内核编译是个很困难的议题,由于目标在不断的变化,即使是最受人尊敬的开发者也会有不同的见解。 | ||
+ | |||
+ | 对于单机内核编译,initrd 不是必须的。我用它是希望我新编译的内核与相应的内核镜像一模一样。如果使用 initrd,请先阅读一下 mkinitrd(8) 和 mkinitrd.conf(5)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.1.1 Ubuntu 标准方式 ==== | ||
+ | 关心一下有关 kernel-package、gcc、binutils 和 modutils 的错误报告。在需要时使用较新的版本。 | ||
+ | |||
+ | 在 Ubuntu 系统中用源码编译自定义内核要特别小心。用 make-kpkg 的 --append_to_version 选项来创建多重内核镜像比较安全。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # apt-get install debhelper modutils libncurses5-dev | ||
+ | # apt-get install linux-source-2.6.15 # 使用最新版本 | ||
+ | # apt-get install fakeroot | ||
+ | # vi /etc/linux-pkg.conf # 输入我的名字和 email | ||
+ | $ cd /usr/src # 创建目录 | ||
+ | $ tar --bzip2 -xvf linux-source-2.6.15.tar.bz2 | ||
+ | $ cd linux-source-2.6.15 # 如果这是你的内核源码 | ||
+ | $ cp /boot/config-2.4.18-386 .config # 将当前配置设定为默认配置 | ||
+ | $ make menuconfig # 按自己的喜好来定制 | ||
+ | $ make-kpkg clean # 必须执行这步(per: man make-kpkg) | ||
+ | $ fakeroot make-kpkg --append_to_version -486 --initrd \ | ||
+ | --revision=rev.01 kernel_image \ | ||
+ | modules_image # modules_image 可以是 pcmcia-cs* 等。 | ||
+ | $ cd .. | ||
+ | # dpkg -i linux-image*.deb pcmcia-cs*.deb # 安装 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | make-kpkg kernel_image 实际上执行了 make oldconfig 和 make dep。如果没使用 initrd 就不要使用 --initrd 选项。 | ||
+ | |||
+ | 如果想加载 pcmcia-cs 模块或内核 pcmcia 源码中没有的模块,应该在 make menuconfig 后选“General setup —>”进入“PCMCIA/CardBus support —>”,配置“< > PCMCIA/CardBus support”选项(例如,取消复选项)。 | ||
+ | |||
+ | 对于 SMP 机器,参照 kernel-pkg.conf(5) 的说明设置 CONCURRENCY_LEVEL。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.1.2 经典方式 ==== | ||
+ | 从下列地址获得干净的源代码: | ||
+ | |||
+ | * Linux: http://www.kernel.org/ | ||
+ | * pcmcia-cs: http://pcmcia-cs.sourceforge.net/ | ||
+ | |||
+ | 或使用 Ubuntu 所附的等价的源代码: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # cd /usr/src | ||
+ | # tar xfvz linux-whatever.tar.gz | ||
+ | # rm -rf linux | ||
+ | # ln -s linux-whatever linux | ||
+ | # tar xfvz pcmcia-cs-whatever.tar.gz | ||
+ | # ln -s pcmcia-cs-whatever pcmcia | ||
+ | # cd linux | ||
+ | # make menuconfig | ||
+ | ... 配置内核选项 ... | ||
+ | # make dep | ||
+ | # make bzImage | ||
+ | ... 编辑 lilo/grub ... | ||
+ | ... 移动 /usr/src/linux/arch/i386/boot/bzImage到boot ... | ||
+ | ... /sbin/lilo or whatever you do for grub | ||
+ | # make modules; make modules_install | ||
+ | # cd ../pcmcia | ||
+ | # make config | ||
+ | # make all | ||
+ | # make install | ||
+ | ... 添加需要的模块名称到 /etc/modules | ||
+ | # shutdown -r now | ||
+ | ... 启动到新内核 ... | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 7.1.3 内核头文件 ==== | ||
+ | 绝大多数“普通”程序不需要内核头文件,事实上如果直接引用它们会出错。这些程序应该引用那些'''编译 glibc''' 所用的头文件,它们位于 Ubuntu 系统的 /usr/include/linux 和 /usr/include/asm 目录下。 | ||
+ | |||
+ | 故不要在 /usr/src/linux 目录中创建指向 /usr/include/linux 和 /usr/include/asm 的链接,一些过时的文档曾建议创建它们。 | ||
+ | |||
+ | 如果某些内核类应用程序'''需要'''特定的内核头文件,可修改 Makefile(s),使其包含指向“特定内核头文件目录/include/linux”和“特定内核头文件目录/include/asm”的路径。 | ||
+ | |||
+ | ---- | ||
+ | === 7.2 模块化的 2.4 内核 === | ||
+ | kernel-image-2.4.NN 提供了新版的 Debian 2.4 内核,该版内核模块化程度极高。你必须激活相关的模块才能获得想要的内核功能。 | ||
+ | |||
+ | 尽管在接下来的部分中提供了许多通过配置 /etc/modules 来解决问题的范例。但据说,在 /etc/modutils/ 中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。某些模块也可以被硬件探测程序自动激活,例如 discover。参阅[[UbuntuHelp:../ch-tune.zh-cn.html#s-hdetect-x| X 服务器的硬件侦测, 第 9.4.2 节]]。 | ||
+ | |||
+ | 参阅[[UbuntuHelp:../ch-system.zh-cn.html#s-modules| 模块加载规定, 第 2.7.5 节]]和 Linux 内核源码目录中的 Documentation/*.txt 获取详细信息。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.1 PCMCIA ==== | ||
+ | 要使一些老的 PCMCIA 卡能正常工作,你需在 /etc/modules 中包含下列内容: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # ISA PnP driver | ||
+ | isa-pnp | ||
+ | # New Low level PCMCIA driver | ||
+ | # yenta_socket # 我的机器上似乎不需要 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 剩下的工作就由 PCMCIA 脚本(来自 pcmcia-cs 软件包)、depmod 和 kmod 负责了。我需要 isa-pnp 因为我的笔记本电脑使用的是旧 ISA-PCMCIA。较新的笔记本电脑使用 CardBus/PCMCIA,不再需要它。 | ||
+ | |||
+ | 参阅 [http://www.tldp.org/HOWTO/PCMCIA-HOWTO.html Linux PCMCIA HOWTO] 和[[UbuntuHelp:../ch-gateway.zh-cn.html#s-trigger-pcmcia| 网络设置和 PCMCIA, 第 10.8.5 节]]。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.2 SCSI ==== | ||
+ | [没有测试过] 想要 SCSI 工作,请在 /etc/modules 中包含如下内容: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # SCSI core | ||
+ | scsi_mod | ||
+ | # SCSI generic driver | ||
+ | sg | ||
+ | # SCSI disk | ||
+ | sd_mod | ||
+ | # All other needed HW modules | ||
+ | ... | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 可用 depmod 来操作上述某些模块。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.3 网络功能 ==== | ||
+ | /etc/modules 中需要包含如下内容以扩充网络功能: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # net/ipv-4 | ||
+ | ip_gre | ||
+ | ipip | ||
+ | |||
+ | # net/ipv-4/netfilter | ||
+ | # iptable (in order) | ||
+ | ip_tables | ||
+ | ip_conntrack | ||
+ | ip_conntrack_ftp | ||
+ | iptable_nat | ||
+ | iptable_filter | ||
+ | iptable_mangle | ||
+ | # | ||
+ | ip_nat_ftp | ||
+ | ip_queue | ||
+ | # | ||
+ | ipt_LOG | ||
+ | ipt_MARK | ||
+ | ipt_MASQUERADE | ||
+ | ipt_MIRROR | ||
+ | ipt_REDIRECT | ||
+ | ipt_REJECT | ||
+ | ipt_TCPMSS | ||
+ | ipt_TOS | ||
+ | ipt_limit | ||
+ | ipt_mac | ||
+ | ipt_mark | ||
+ | ipt_multiport | ||
+ | ipt_owner | ||
+ | ipt_state | ||
+ | ipt_tcpmss | ||
+ | ipt_tos | ||
+ | ipt_unclean | ||
+ | # | ||
+ | #ipchains | ||
+ | #ipfwadm | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 上述内容并没有进行优化。可用 depmod 来操作上述某些模块。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.4 EXT3 文件系统(> 2.4.17) ==== | ||
+ | 对预编译内核镜像包(> 2.4.17)执行下述操作可激活 EXT3 日志文件系统。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # cd /etc; mv fstab fstab.old | ||
+ | # sed 's/ext2/ext3,ext2/g' <fstab.old >fstab | ||
+ | # vi /etc/fstab | ||
+ | ... 将 root 文件系统类型设置成“auto”而非“ext3,ext2” | ||
+ | # cd /etc/mkinitrd | ||
+ | # echo jbd >>modules | ||
+ | # echo ext3 >>modules | ||
+ | # echo ext2 >>modules | ||
+ | # cd / | ||
+ | # apt-get update; apt-get install kernel-image-2.4.17-686-smp | ||
+ | ... 安装最新内核并配置 boot(lilo从这儿运行) | ||
+ | # tune2fs -j -i 0 /dev/hda1 | ||
+ | # tune2fs -j -i 0 /dev/hda2 | ||
+ | ... 将所有 EXT2 FS 转化成 EXT3 | ||
+ | # shutdown -r now | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 现在就可使用 EXT3 日志文件系统了。 在 fstab 的“type”中使用 ex3、ext2 的是为了保险起见,如果内核不支持非 root 分区采用 EXT3 还可退回到 EXT2。 | ||
+ | |||
+ | 如果你已安装了 2.4 版内核并且不想再次重装,执行上述步骤中 apt-get 命令之前的步骤就行了。接着: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # mkinitrd -o /boot/initrd.img-2.4.17-686-smp /lib/modules/2.4.17-686-smp | ||
+ | # lilo | ||
+ | # tune2fs -j -i 0 /dev/hda1 | ||
+ | # tune2fs -j -i 0 /dev/hda2 | ||
+ | ... 将所有 EXT2 FS 转化成 EXT3 | ||
+ | # shutdown -r now | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 现在 EXT3 日志文件系统已生效。 | ||
+ | |||
+ | 如果没有设置 /etc/mkinitrd/modules 就 mkinitrd 运行,最好在系统启动时加载一些模块: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | ... 当 initrd 提示获取 shell 时(5秒钟),输入 RETURN | ||
+ | # insmod jbd | ||
+ | # insmod ext3 # modprobe ext3 会负责一切 | ||
+ | # insmod ext2 | ||
+ | # ^D | ||
+ | ... 继续启动 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | 激活 EXT3 功能会造成某些系统发生严重内核死锁的情况,不过我没遇到过这种问题(我的内核是2.4.17)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.5 2.4 版内核对 Realtek RTL-8139 的支持 ==== | ||
+ | 不知何故,RTL-8139 支持模块已不再叫 rtl8139,现在它叫 8139too。从 2.2 版内核升级到 2.4 版时,请记得在 /etc/modules 中做相应修改。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.2.6 并行端口支持 ==== | ||
+ | 对于 kernel-image-2.4.*,并行端口支持已被模块化,要激活可执行: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # modprobe lp | ||
+ | # echo lp >> /etc/modules | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 参阅 Linux 内核源码目录中的 Documentation/parport.txt。 | ||
+ | |||
+ | ---- | ||
+ | === 7.3 通过 proc 文件系统调整内核 === | ||
+ | Linux 内核行为可以在运行状态下通过 proc 文件系统进行调节。 | ||
+ | |||
+ | 有关在 /proc 文件系统下修改内核参数的基础知识,可参阅 Linux 源码包中的 Documentation/sysctl/* 文件。 | ||
+ | |||
+ | 调整内核参数的例子,可参考 /etc/init.d/networking 和[http://qref.sourceforge.net/quick/ch-install.zh-cn.html#s-killecn 无法访问某些站点的怪问题, 第 3.8.5 节]。 | ||
+ | |||
+ | 参阅 sysctl.conf(5) 了解如何使用 /proc 文件系统和脚本 /etc/init.d/procps.sh 来设置内核开机时的配置。此脚本由 /etc/rcS.d/S30procps.sh 执行。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.3.1 打开了太多文件 ==== | ||
+ | Linux 内核有时会报告“Too many open files”,起因是 file-max 默认值(8096)太小。要解决这个问题,可以 root 身份执行下列命令:(或将它们加入/etc/rcS.d/*下的 init 脚本。) | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # echo "65536" > /proc/sys/fs/file-max # 适用于 2.2 和 2.4 版内核 | ||
+ | # echo "131072" > /proc/sys/fs/inode-max # 仅适用于 2.2 版内核 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 或将下列内容放入 /etc/sysctl.conf,做永久性的更改: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | file-max=65536 # 适用于 2.2 和 2.4 版内核 | ||
+ | inode-max=131072 # 仅适用于 2.2 版内核 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 7.3.2 磁盘缓存清除时间(Disk flush intervals) ==== | ||
+ | 可通过 proc 文件系统来修改磁盘缓存清除时间。下面的操作将默认的 5 秒时间间隔缩短到 1 秒。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # echo "40 0 0 0 100 30000 60 0 0" > /proc/sys/vm/bdflush | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 这可能对文件 I/O 性能产生一点儿负面影响。但它能保证文件内容是最近 1 秒的,比默认的 5 秒更短。对日志文件系统来说更是如此。 | ||
+ | |||
+ | ---- | ||
+ | ==== 7.3.3 迟缓的小内存旧机器 ==== | ||
+ | 对某些小内存的旧机器来说,在 proc 文件系统中打开内存的 over-commit 功能会很有效果: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # echo 1 > /proc/sys/vm/overcommit_memory | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | === 7.4 2.6 版内核和 udev === | ||
+ | udev 是取代 /dev/ 的动态设置的系统。我们可以选择很短的设备名字。而 2.4 版内核使用的 devfs 已经被淘汰。 | ||
+ | |||
+ | 安装 Ubuntu 新版的 linux-image-2.6.NN 和 udev 就能启用这个功能。 | ||
+ | |||
+ | |||
+ | |||
+ | == 第 8 章 - Ubuntu 小技巧 == | ||
+ | ---- | ||
+ | === 8.1 启动系统 === | ||
+ | 关于系统启动提示的详细信息请参见 LDP [http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html BootPrompt-HOWTO]。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.1 “我忘记了 root 密码!”(一) ==== | ||
+ | 只要能访问控制台键盘,不需要 root 密码也可以启动系统并以 root 帐号登录。 (这里假设没有 BIOS 密码或 lilo 之类的启动引导器密码用于控制系统启动。) | ||
+ | |||
+ | 下面是一个不需要额外的启动盘或对 BIOS 启动设置进行修改的过程。这里的“Linux”是代表在 Ubuntu 默认安装系统中启动 Linux 内核的标签。 | ||
+ | |||
+ | 在 lilo 的启动屏幕中,当 boot: 一出现时 (在某些系统中,您必须按 shift 键以阻止自动启动;如果 lilo 使用 framebuffer,您需要按 TAB 键才能看到自己输入的选项),就输入: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux init=/bin/sh | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 这会让系统启动内核并运行 /bin/sh 而非其标准的 init。现在你已获得 root 权限和一个 root shell。由于当前 / 是以只读方式挂载,而其它的硬盘分区均未挂载,故你必须完成下列步骤才能获得一个有适当功能的系统。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | init-2.03# mount -n -o remount,rw / | ||
+ | init-2.03# mount -avt nonfs,noproc,nosmbfs | ||
+ | init-2.03# cd /etc | ||
+ | init-2.03# vi passwd | ||
+ | init-2.03# vi shadow | ||
+ | </nowiki></pre> | ||
+ | |||
+ | (如果 /etc/passwd 文件中所有用户的第二个域的数据都为“x”,就表明系统使用了影子(shadow)密码,必须编辑 /etc/shadow。)要删除 root 密码,请编辑密码文件中第二个数据域,将它设置为空白。这样重启系统不用密码就能登录到 root。当系统启动进入 runlevel 1 时,Ubuntu 需要密码。 | ||
+ | |||
+ | 在 /bin 下装一个小编辑器是个好习惯,因为有时 /usr 是无法访问的(参阅[[UbuntuHelp:../ch-edit.zh-cn.html#s-bin-editor| 应急的编辑器, 第 11.2 节]])。 | ||
+ | |||
+ | 另外可以安装 sash 软件包,当系统无法启动时,还可执行: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux init=/bin/sash | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 当 /bin/sh 不可用时,sash 可作为 sh 的交互式替代品,它是静态链接,内建了许多标准工具(在系统提示符下输入“help”可获得参考列表)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.2 “我忘记了 root 密码!”(二) ==== | ||
+ | 从急救盘启动系统。假设 /dev/hda3 是原始 root 分区,可用下面的方法编辑密码文件,与上述方法一样容易。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # mkdir fixit | ||
+ | # mount /dev/hda3 fixit | ||
+ | # cd fixit/etc | ||
+ | # vi shadow | ||
+ | # vi passwd | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 与上面的方法相比,该方法的好处在于不需要知道 lilo 密码(如果有的话)。但如果系统没有预先设置为从软盘或 CD 启动,就需要访问 BIOS 的权限。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.3 无法启动系统 ==== | ||
+ | 没在安装过程中制作启动盘?没关系。如果 lilo 损坏了,从 Debian 安装套件中拿出启动盘,用它来启动系统。假设你的 root 分区在 /dev/hda12,你想进入 runlevel 3,在启动提示符后输入: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: rescue root=/dev/hda12 3 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 接下来,系统使用软盘上的内核启动,你可登录到一个几乎拥有全部功能的系统了。(可能有少量特性或模块不可用。) | ||
+ | |||
+ | 如果系统崩溃,亦可参阅[[UbuntuHelp:../ch-package.zh-cn.html#s-un-bootable| 为无法启动的系统安装软件包, 第 6.3.6 节]]。 | ||
+ | |||
+ | 如果想做张自定义启动盘,参阅急救盘中的 readme.txt 文档。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.4 “我不想直接启动到 X!” ==== | ||
+ | 玩 edgy/dapper 很有趣,但在启动进程中执行不稳定的 xdm、gdm、kdm 和 wdm 会让你焦头烂额。 | ||
+ | |||
+ | 首先,在启动提示符后输入如下指令获得 root shell: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux vga=normal s | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 这里的 Linux 是你要启动的内核的标记,“vga=normal”告诉 lilo 在普通 VGA 屏幕下运行,“s”(或“S”)是传给 init 的参数,告诉它进入单用户模式。在提示符后输入 root 密码。 | ||
+ | |||
+ | 有多种方法禁用 X 启动 daemons: | ||
+ | |||
+ | * 运行 update-rc.d -f ?dm remove ; update-rc.d ?dm stop 99 1 2 3 4 5 6 . | ||
+ | |||
+ | * 在所有 /etc/init.d/?dm 文件的最前面加上“exit 0”。 | ||
+ | |||
+ | * 把所有的 /etc/rc2.d/S99?dm 文件改名为 /etc/rc2.d/K99?dm。 | ||
+ | |||
+ | * 删除所有的 /etc/rc2.d/S99?dm 文件。 | ||
+ | |||
+ | * 运行 :>/etc/X11/default-display-manager | ||
+ | |||
+ | 其中,rc2.d 中的数字必须与 /etc/inittab 中指定的 runlevel 一致。而 ?dm 的意思是你要将同一个命令运行多次,每次将其替换成 xdm、gdm、kdm 和 wdm 中的一个。 | ||
+ | |||
+ | 在 Ubuntu 下只有第一种方法是“唯一正确的方法”。最后一种方法比较简单但只适用于 Ubuntu,而且还需要使用 dpkg-reconfigure 重新设置一次。其它方法都是通用的中 daemons 的方法。 | ||
+ | |||
+ | 你仍可在任何控制台 shell 中用 startx 命令启动 X。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.5 其它用于启动提示符的技巧 ==== | ||
+ | 使用lilo启动提示符,可指定系统启动到特定的runlevel和配置。详情参阅[http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html BootPrompt-HOWTO] (LDP)。 | ||
+ | |||
+ | 如果希望系统启动到runlevel 4,可以lilo启动提示符后输入: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux 4 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 如果希望系统启动到正常功能的单用户模式,而且你知道root密码,可在lilo启动提示符后输入下列任一参数。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux S | ||
+ | boot: Linux 1 | ||
+ | boot: Linux -s | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 如果希望系统以少于实际内存数的内存启动(也就是说机器有64MB内存,只分配48MB给系统使用),在lilo启动提示符后输入: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | boot: Linux mem=48M | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 注意,不要指定大于实际内存数的内存,否则内核会崩溃。如果你有多于64MB的内存,如128MB,应在系统启动时执行mem=128M或在/etc/lilo.conf中添加类似的命令行,否则旧内核或使用旧BIOS的主板将无法使用大于64MB的内存。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.1.6 设置 GRUB 启动参数 ==== | ||
+ | GRUB是Hurd项目开发的新型启动管理器,比Lilo更灵活,不过启动参数也与之稍有不同。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | grub> find /vmlinuz | ||
+ | grub> root (hd0,0) | ||
+ | grub> kernel /vmlinuz root=/dev/hda1 | ||
+ | grub> initrd /initrd | ||
+ | grub> boot | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 请注意Hurd中的设备名: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | HURD/GRUB Linux MSDOS/Windows | ||
+ | (fd0) /dev/fd0 A: | ||
+ | (hd0,0) /dev/hda1 C: (usually) | ||
+ | (hd0,3) /dev/hda4 F: (usually) | ||
+ | (hd1,3) /dev/hdb4 ? | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 详情参阅/usr/share/doc/grub/README.Debian和/usr/share/doc/grub-doc/html/。 | ||
+ | |||
+ | ---- | ||
+ | === 8.2 活动记录 === | ||
+ | ---- | ||
+ | ==== 8.2.1 记录shell活动 ==== | ||
+ | 比起普通的个人电脑环境,Unix环境的系统管理包含了更多细致的任务。必须掌握所有基本的配置方法以便进行系统故障恢复。基于 X11 的GUI配置工具看上去又好又方便,但不适用于紧急状况。 | ||
+ | |||
+ | 记录shell活动是个好习惯,特别是root用户。 | ||
+ | |||
+ | Emacs:使用M-x shell在缓冲区中开始记录,使用 C-x C-w 将缓冲区中的记录写入文件。 | ||
+ | |||
+ | Shell:使用screen命令和 [http://qref.sourceforge.net/quick/ch-tips.zh-cn.html#s-screen 用screen来定制控制台, 第 8.6.28 节] 中描述的“^A H”;或者使用 script 命令。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ script | ||
+ | Script started, file is typescript | ||
+ | ... do whatever ... | ||
+ | Ctrl-D | ||
+ | $ col -bx <typescript >savefile | ||
+ | $ vi savefile | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 还可使用下面的方法: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ bash -i 2>&1 | tee typescript | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.2.2 记录X活动 ==== | ||
+ | 如果需要X应用程序的活动记录图,包括 xterm 屏显,可使用gimp(GUI)。它可以对每个窗口或整个屏幕进行拍照。还可以使用xwd(xbase-clients)、import(imagemagick) 和 scrot(scrot)。 | ||
+ | |||
+ | ---- | ||
+ | === 8.3 拷贝及创建子目录 === | ||
+ | 这些拷贝和归档命令提供系统和数据备份的基本功能。 在 [[UbuntuHelp:../examples/| the example scripts]] 中提供了一个名为 backup 的简单备份脚本例子。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.1 拷贝整个子目录的基本命令 ==== | ||
+ | 如果想重新整理文件组织结构,可使用下面的方法移动文件及文件链接: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | 标准方法: | ||
+ | # cp -a /source/directory /dest/directory # 要求 GNU cp | ||
+ | # (cd /source/directory && tar cf - . ) | \ | ||
+ | (cd /dest/directory && tar xvfp - ) | ||
+ | 如果包含硬链接,则需要更严谨的方法: | ||
+ | # cd /path/to/old/directory | ||
+ | # find . -depth -print0 | afio -p -xv -0a /mount/point/of/new/directory | ||
+ | 如果是远程操作: | ||
+ | # (cd /source/directory && tar cf - . ) | \ | ||
+ | ssh user@host.dom (cd /dest/directory && tar xvfp - ) | ||
+ | 如果没有链接文件: | ||
+ | # scp -pr user1@host1.dom:/source/directory \ | ||
+ | user2@host2.dom:/dest/directory | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 其中,scp <==> rcp,ssh <==> rsh。 | ||
+ | |||
+ | 下面的有关拷贝整个子目录的信息由 Manoj Srivastava srivasta@debian.org 发表于 debian-user@lists.debian.org。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.2 cp ==== | ||
+ | 传统上,cp并不能真正完成这个任务,因为它既没对符号链接进行区别对待,又不能保存硬链接。另一件需要注意的事就是稀疏文件(有洞的文件)。 | ||
+ | |||
+ | GNU cp克服了这缺陷,然而对于非GNU系统,cp仍存在问题。而且使用cp无法生成小巧轻便的文档包。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | % cp -a . newdir | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.3 tar ==== | ||
+ | Tar克服了cp在处理符号链接时出现的问题,然而,cpio可以处理特殊文件,传统的tar却不行。 | ||
+ | |||
+ | 对于某个有多重硬链接的文件,tar的处理方法是只将其中一个链接拷贝到磁带上,所以日后你只能找回拷贝中所保留那个的链接所指的文件;cpio会为每个链接做一个拷贝,日后你可以找回任意一个链接所指的文件。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.4 pax ==== | ||
+ | 全新的,符合POSIX(IEEE Std 1003.2-1992, pages 380–388 (section 4.48) and pages 936–940 (section E.4.48))标准的,众望所归的,轻便的文档包交互工具。pax可以读、写以及列出文档包的成员,并能拷贝文件目录层次。pax的操作独立于特定的文档包格式,支持各种各样不同的文档包格式。 | ||
+ | |||
+ | pax工具刚刚成形,还很新。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # apt-get install pax | ||
+ | $ pax -rw -p e . newdir | ||
+ | or | ||
+ | $ find . -depth | pax -rw -p e newdir | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.5 cpio ==== | ||
+ | cpio从cpio或tar文档包提取/放入文件。该文档包可以是硬盘上的另一个文件,也可以是磁带或管道。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ find . -depth -print0 | cpio --null --sparse -pvd new-dir | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.3.6 afio ==== | ||
+ | afio更善于处理cpio格式的文档包。通常它比 cpio 要快,且提供了更多磁带选项,并且能更友好的处理有讹误的输入数据。它支持交互式处理多卷文档包。用afio制作压缩文档包比压缩tar或cpio文档包更安全。在备份处理脚本中afio是更佳的“文档处理引擎”。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ find . -depth -print0 | afio -px -0a new-dir | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 对所有的磁带备份我都使用afio。 | ||
+ | |||
+ | ---- | ||
+ | === 8.4 差异备份与数据同步 === | ||
+ | 要进行差异备份和数据同步可使用下列几种方法: | ||
+ | |||
+ | * rcs:备份并进行历史记录,只支持文本。 | ||
+ | |||
+ | * rdiff-backup:备份并进行历史记录。支持链接。 | ||
+ | |||
+ | * pdumpfs:对文件系统进行备份和历史记录。支持链接。 | ||
+ | |||
+ | * rsync:单路同步。 | ||
+ | |||
+ | * unison:双路同步。 | ||
+ | |||
+ | * cvs:多路同步服务器备份并进行历史记录,只支持文本,技术成熟。参阅[http://qref.sourceforge.net/quick/ch-vcs.zh-cn.html#s-cvs 并行版本系统 (CVS), 第 12.1 节]。 | ||
+ | |||
+ | * arch:多路同步服务器备份并进行历史记录,但包括“处于工作中的目录”。 | ||
+ | |||
+ | * subversion:多路同步服务器备份并进行历史记录,专用于Apache。 | ||
+ | |||
+ | 有关将这些方法与文档包操作结合应用的讨论参阅[http://qref.sourceforge.net/quick/ch-tips.zh-cn.html#s-archiving 拷贝及创建子目录, 第 8.3 节],有关自动进行备份的讨论参阅[http://qref.sourceforge.net/quick/ch-tips.zh-cn.html#s-cronjob 日程安排(cron,at), 第 8.6.27 节]。 | ||
+ | |||
+ | 我只讲解三个较容易使用的工具。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.4.1 使用rdiff进行差异备份 ==== | ||
+ | rdiff-backup提供了简单好用的方法对任何文件包括链接进行历史差异备份。例如要对~/目录下的所有文件备份到/mnt/backup: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 从该文档包中取出3天前的旧数据恢复到~/old目录: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ rdiff-backup -r 3D /mnt/backup ~/old | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 参阅rdiff-backup(1)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.4.2 使用pdumpfs进行每日备份 ==== | ||
+ | pdumpfs是一种简单的每日备份系统,与Plan9的dumpfs一样,它每天都保存系统快照。任何时候都可以用它来恢复到某天的系统状态。请使用pdumpfs和cron来备份你的home目录。 | ||
+ | |||
+ | 在目标目录中,pdumpfs以YYYY/MM/DD的方式来组织系统快照。 当 pdumpfs 第一次运行时,它将所有源文件拷贝到快照目录。从每二次运行起,pdumpfs仅拷贝更新的或新建的文件,对于没有改变的文件用硬链接方式指向前一天的系统快照,以此来节省硬盘空间。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ pdumpfs src-dir dest-dir [dest-basename] | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 参阅 pdumpfs(8)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.4.3 使用RCS进行定期差异备份 ==== | ||
+ | Changetrack会定期对RCS文档包中基于文本格式的配置文件的变化进行记录。参阅changetrack(1)。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # apt-get install changetrack | ||
+ | # vi changetrack.conf | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | === 8.5 系统冻结恢复 === | ||
+ | ---- | ||
+ | ==== 8.5.1 中止一个进程 ==== | ||
+ | 运行top看看什么进程的活动有异常。按“P”以 CPU 使用率排序,“M”以内存使用率排序,“k”可以中止一个进程。还有一种方法,使用BSD风格的ps aux | less或System V风格的ps -efH | less。System V风格的排列会显示父进程ID (PPID),这对中止出错的(死掉的)子进程十分有用。 | ||
+ | |||
+ | 知道了进程的ID,就可使用kill中止(或发信号给)某个进程,killall的作用正如其名一样。经常使用的信号有: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | 1: HUP,重启daemon | ||
+ | 15: TERM,普通中止 | ||
+ | 9: KILL,强令中止 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.5.2 Alt-SysRq ==== | ||
+ | 内核编译选项“Magic SysRq key”提供系统强心针。在i386机器上按下 ALT-SysRq 组合键后,试试按下列各键r 0 k e i s u b,奇迹产生了: | ||
+ | |||
+ | Un'r'aw让键盘从X崩溃中重生。将控制台loglevel改为'0'以减少错误信息。sa'k'(system attention key)中止当前虚拟控制台的所有进程。t'e'rminate中止当前终端除 init 外的所有进程。k'i'll中止除 init 外的所有进程。 | ||
+ | |||
+ | 'S'ync,'u'mount和re'b'oot帮你逃离真正的险境。 | ||
+ | |||
+ | 本文写作之时,Ubuntu默认安装的内核并未将该选项编译进去,需要重新编译内核激活该功能。详情参阅/usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz或/usr/src/kernel-version/Documentation/sysrq.txt.gz。 | ||
+ | |||
+ | ---- | ||
+ | === 8.6 记住这些可爱的小命令 === | ||
+ | ---- | ||
+ | ==== 8.6.1 Pager ==== | ||
+ | less就是默认的 pager(文件内容浏览器)。按“h”可获得帮助。它比more更有用。在shell启动脚本中运行eval $(lesspipe)或eval $(lessfile)可以让less活力四射。详情参阅/usr/share/doc/lessf/LESSOPEN。使用-R选项可输出生癖字符and enables ANSI color escape sequences.参阅less(1)。 | ||
+ | |||
+ | 对于某些编码系统(EUC)w3m可能是更好的选择。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.2 释放内存 ==== | ||
+ | free和top能让你了解内存资源的许多有用信息。别担心“Mem:”行中“used”的大小,看看它下面的数字(本例的数字是38792)。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | $ free -k # 用 256MB 内存的机器 | ||
+ | total used free shared buffers cached | ||
+ | Mem: 257136 230456 26680 45736 116136 75528 | ||
+ | -/+ buffers/cache: 38792 218344 | ||
+ | Swap: 264996 0 264996 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 物理内存的准确大小可通过grep '^Memory' /var/log/dmesg得到,本例将显示“Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)”。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | Total ==== 262144k ==== 256M (1k=1024, 1M=1024k) | ||
+ | Free to dmesg ==== 256984k ==== Total - kernel - reserved - data - init | ||
+ | Free to shell ==== 257136k ==== Total - kernel - reserved - data | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 约有5MB内存系统不能使用,因为内核需要它。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.3 设定时间(BIOS) ==== | ||
+ | <pre><nowiki> | ||
+ | # date MMDDhhmmCCYY | ||
+ | # hwclock --utc --systohc | ||
+ | # hwclock --show | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 设定系统时间和硬件时间为MM/DD hh:mm, CCYY。显示时间为本地时间而硬件时间使用UTC。 | ||
+ | |||
+ | 如果硬件(BIOS)时间设置为 GMT,在文件 /etc/default/rcS 中改变设置 UTC=yes。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.4 设定时间(NTP) ==== | ||
+ | 参考:[http://www.tldp.org/HOWTO/TimePrecision-HOWTO/index.html Managing Accurate Date and Time HOWTO]。 | ||
+ | |||
+ | ---- | ||
+ | ===== 8.6.4.1 拥有永久Internet连接的系统设置时间 ===== | ||
+ | 设置系统时钟通过远程服务器自动对时: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # ntpdate server </nowiki></pre> | ||
+ | |||
+ | 如果你的系统拥有永久的Internet连接,应该将该命令加入/etc/cron.daily/。 | ||
+ | |||
+ | ---- | ||
+ | ===== 8.6.4.2 偶尔进行Internet连接的系统设置时间 ===== | ||
+ | 使用chrony软件包。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.5 如何禁用屏幕保护程序 ==== | ||
+ | 禁用屏幕保护程序,使用下面的命令。 | ||
+ | |||
+ | 对于Linux控制台: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # setterm -powersave off | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 启动 kon2 (kanji)控制台可执行: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # kon -SaveTime 0 | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 运行X可执行: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # xset s off | ||
+ | 或 | ||
+ | # xset -dpms | ||
+ | 或 | ||
+ | # xscreensaver-command -prefs | ||
+ | </nowiki></pre> | ||
+ | |||
+ | 控制其它的控制台特征,请参阅相关 man 页面。 改变和显示终端行设置,请参阅 stty(1)。 | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.6 搜索系统管理数据库 ==== | ||
+ | Glibc提供了getent(1)搜索管理数据库的各类项目。例如passwd、group、hosts、services、protocols、networks。 | ||
+ | |||
+ | <pre><nowiki> | ||
+ | getent database [key ...] | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.7 禁用声音(响铃) ==== | ||
+ | 最直接的方法是拔掉PC喇叭。;-) 对于Bash shell可执行: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | echo "set bell-style none">> ~/.inputrc | ||
+ | </nowiki></pre> | ||
+ | |||
+ | ---- | ||
+ | ==== 8.6.8 控制台上的错误信息 ==== | ||
+ | 不想看屏幕显示的错误信息,首选的方法是检查/etc/init.d/klogd,在该脚本中设置KLOGD="-c 3"然后运行/etc/init.d/klogd restart。另一种方法是执行dmesg -n3。 | ||
+ |