Debian参考手册(7-8)

第七章 Debian下的Linux内核

Debian运用自己的方式来编译内核及相关模块。参阅〖2.7 Debian和系统内核〗。

7.1 内核编译

Debian unstable发行版中的gccbinutilsmodutils可用来编译最新的Linux内核。这方面的官方信息,参阅/usr/share/doc/kerenl-package/README.gz文件的后半部分。

 

内核编译是个很困难的议题,由于目标在不断的变化,即使是最受人尊敬的开发者也会有不同的见解:

Manoj Srivastava写到:

--initrd需要Debian专用cramfs补丁。

Herbert Xu写到:

不,它不需要,想使用除CRAMFS以外的文件系统只需在/etc/mkinitrd/mkinitrd.conf中设置MKIMAGE

 

按照ManojKent撰写的/usr/share/doc/kernel-package/README.gz的指导小心行事,如果要编译最新版本的内核请确认安装了最新unstablekernel-package软件包。

 

对于单机内核编译,initrd不是必须的。我用它是希望我新编译的内核与相应的内核镜像一模一样。如果使用initrd,请先阅读一下mkinitrd(8)mkinitrd.conf(5)。亦可参阅http://bugs.debian.org/149236

7.1.1 Debian标准方式

关心一下有关kernel-packagegccbinutilsmodutils的错误报告。如果有必要应使用最的版本。

 

Debian系统中用源码编译自定义内核要特别小心。用make-kpkg--append_to_version选项来创建多重内核镜像比较安全。

# apt-get install debhelper modutils kernel-package libncurses5-dev

# apt-get install kernel-source-2.4.18 # 使用最新版本

# apt-get install fakeroot

# vi /etc/kernel-pkg.conf # 输入我的名字和email

$ cd /usr/src # 创建目录

$ tar --bzip2 -xvf kernel-source-2.4.18.tar.bz2

$ cd kernel-source-2.4.18 # 如果这是你的内核源码

$ 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 kernel-image*.deb pcmcia-cs*.deb # 安装

 

make-kpkg kernel_image实际上执行了make oldconfigmake 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/

或使用Debian所附的等价的源代码:

# 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/bzImageboot ...

... /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

... 启动到新内核 ...

 

7.1.3 内核头文件

绝大多数普通程序不需要内核头文件,事实上如果直接引用它们会出错。这些程序应该引用那些编译glibc所用的头文件,它们位于Debian系统的/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内核

kerntl-mage-2.4.NN提供了新版的Debian 2.4内核,该版内核模块化程度极高。你必须激活相关的模块才能获得想要的内核功能。

 

尽管在接下来的部分中提供了许多通过配置/etc/modules来解决问题的样例,但据说,在/etc/modutils/中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。

 

参阅Linux内核源码目录中的Documentation/*.txt获取详细信息。

 

7.2.1 PCMCIA

要使用PCMCIA,需在/etc/modules中包含下列内容:

# ISA PnP driver

isa-pnp

# Low level PCMCIA driver

# yenta_socket # 我的机器上似乎不需要

剩下的工作就由PCMCIA脚本(来自pcmcia-cs软件包)、depmodkmod负责了。我需要isa-pnp因为我的笔记本电脑使用的是旧ISA-PCMCIA。较新的笔记本电脑使用CardBus/PCMCIA,不再需要它。

 

慷慨的Miquel van Smoorenburgmiquels@cistron.nl)说:

我将笔记中所有有关pcmcia的东西包括cardmgr等一鼓脑全删了,只装了支持cardbus2.4版内核和woody中新的hotplug软件包。

 

只要你使用的是32-bit卡,你就不需要pcmcia软件包;2.4内置了cardservices。标准的tulip驱动亦可在dlink卡上正常工作。

 

——Mike

7.2.2 SCSI

[没有测试过]想要SCSI工作,请在/etc/modules中包含如下内容:

# SCSI core

scsi_mod

# SCSI generic driver

sg

# SCSI disk

sd_mod

# All other needed HW modules

...

 

可用depmod来操作上述某些模块。

7.2.3 网络功能

/etc/modules中需要包含如下内容以扩充网络功能:

# 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

 

上述内容并没有进行优化。可用depmod来操作上述某些模块。

 

7.2.4 EXT3文件系统(>2.4.17)

对预编译内核镜像包(> 2.4.17)执行下述操作可激活EXT3日志文件系统。

# 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

... 安装最新内核并配置bootlilo从这儿运行)

# tune2fs -j -i 0 /dev/hda1

# tune2fs -j -i 0 /dev/hda2

... 将所有EXT2 FS转化成EXT3

# shutdown -r now

 

现在就可使用EXT3日志文件系统了。在fstab“type”中使用ex3ext2的是为了保险起见,如果内核不支持非root分区采用EXT3还可退回到EXT2

 

如果你已安装了2.4版内核并且不想再次重装,执行上述步骤中apt-get命令之前的步骤就行了。接着:

# 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

现在EXT3日志文件系统已生效。

 

如果没有设置/etc/mkinitrd/modulesmkinitrd运行,最好在系统启动时加载一些模块:

 

... initrd提示获取shell时(5秒钟),输入RETURN

# insmod jbd

# insmod ext3 # modprobe ext3会负责一切

# insmod ext2

# ^D

... 继续启动

 

在系统启动屏幕(dmesg)中,会出现“cramfs: wrong magic”,别担心这没有什么害处。在Sarge2002/10)中已解决了这个问题。参阅http://bugs.debian.org/135537http://www.symonds.net/~rajesh/howto/ext3/index.html,或者是/usr/share/doc/HOWTO/en-txt/mini/extra/ext3-mini-HOWTO.gz获得有关详情。

 

激活EXT3功能会造成某些系统发生严重内核死锁的情况,不过我没遇到过这种问题(我的内核是2.4.17)。

7.2.5 对Realtek RTL-8139的支持

不知何故,RTL-8139支持模块已不再叫rtl8139,现在它叫8139too。从2.2版内核升级到2.4版时,请记得在/etc/modules中做相应修改。

7.2.6 并行端口支持

对于kernel-image-2.4.*,并行端口支持已被模块化,要激活可执行:

# modprobe lp

# echo lp >> /etc/modules

 

参阅Linux内核源码目录中的Documentation/parport.txt

7.2.7 打开了太多文件

Linux内核有时会报告“Too many open files”,起因是file-max默认值太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*下的init脚本。)

# echo "65536" >/proc/sys/fs/file-max # 适用于2.22.4版内核

# echo "131072" >/proc/sys/fs/inode-max # 仅适用于2.2版内核

 

其它内核参数操作实例参阅/etc/init.d/networking和〖3.7.5 无法访问某此站点的怪问题〗。


 

第八章 Debian技巧

8.1 启动系统

参阅LDP BootPrompt-HOWTOhttp://www.tldp.org/HOWTO/BootPrompt-HOWTO.html)获得有关系统提示的详细信息。

8.1.1我忘了root密码!(1)

只要能访问控制台键盘,不需要root密码就可以启动系统登录到root帐号。(假设BIOSlilo之类的启动引导器在启动时不需要密码。)

 

整个过程不需要另外的启动盘或对BIOS设置进行修改。在此,“Linux”仅是一个标签,它代表启动Debian默认安装的Linux内核。

 

lilo启动屏幕中,一但出现boot:(对某些系统而言,必须按下shift键以阻止自动启动),就输入:

boot: Linux init=/bin/sh

它会指示系统启动内核后运行/bin/sh而不是init。现在你已获得root特权和root shell。由于当前/是以只读方式挂载,而其它的硬盘分区均未挂载,故你必须完成下列步骤才能获得一个有适当功能的系统。

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

 

(如果在/etc/passwd文件中所有用户的第二个域的数据为“x”,就表明系统使用了影子密码(shadow passwords),必须编辑/etc/shadow。)要删除root密码,请编辑密码文件中第二个数据域,将它设置为空白。重启系统不用密码就能登录到root。当系统启动进入runlevel 1时,Debian(至少是Potato以后的版本)需要密码,一些较老的版本则不需要。

 

/bin下装一个小编辑器是个好习惯,因为有时/usr是无法访问的(参阅〖11.2 应急的编辑器〗)。

 

如果安装sash软件包,当系统无法启动时,还可执行:

boot: Linux init=/bin/sash

/bin/sh不可用时,sash可作为sh的交互式替代品,它是静态链接,内建了许多标准工具(在系统提示符下输入“help”可获得参考列表)。

8.1.2我忘了root密码!(2)

从急救盘启动系统。假设/dev/hda3是原始root分区,可用下面的方法编辑密码文件,与上述方法一样容易。

# mkdir fixit

# mount /dev/hda3 fixit

# cd fixit/etc

# vi shadow

# vi passwd

 

与上面的方法相比,该方法的好处在于不需要知道lilo密码(如果有的话)。但如果系统没有预先设置为从软盘或CD启动,就需要访问BIOS的权限。

8.1.3 无法启动系统

没在安装过程中制作启动盘?没关系。如果lilo损坏了,从Debian安装套件中拿出启动盘,用它来启动系统。假设你的root分区在/dev/hda12,你想进入runlevel 3,在启动提示符后输入:

boot: rescue root=/dev/hda12 3

接下来,系统使用软盘上的内核启动,你可登录到一个几乎拥有全部功能的系统了。(可能有少量特性或模块不可用。)

 

如果想做张自定义启动盘,参阅急救盘中的readme.txt文档。

 

8.1.4 “我不想直接启动到X

 

unstable/sid很有趣,但在启动进程中执行不稳定的xdmgdmkdmwdm会让你焦头烂额。

 

首先,在启动提示符后输入如下指令获得root shell

boot: Linux vga=normal s

其中,Linux代表你要启动的内核镜像,“vga=normal”告诉lilo在普通VGA屏幕下运行,“s”(或“S”)是传给init的参数,告诉它进入单用户模式。在提示符后输入root密码。

有多种方法禁用X启动deaemons

·run update-rc.d ?dm stop 99 1 2 3 4 5 6

 

·insert "exit 0" at the start of all /etc/init.d/?dm files.

 

·rename all /etc/rc2.d/S99?dm files to /etc/rc2.d/K99?dm.

 

·remove all /etc/rc2.d/S99?dm files.

 

·run :>/etc/X11/default-display-manager

 

其中,rc2.d必须与/etc/inittab中指定的runlevel一致。?dm表示所有的xdmgdmkdmwdm

 

Debian下只有第一种方法最正确。最后一种方法比较简单但只适用于Debian,而且还需要使用dpkg-reconfigure重新设置一次。其它方法都是通用的中止daemons的方法。

 

你仍可在任何控制台shell中输入startx启动X

8.1.5 其它用于启动提示符的技巧

使用lilo启动提示符,可指定系统启动到特定的runlevel和配置。详情参阅BootPrompt-HOWTOLDP http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html)。

 

如果希望系统启动到runlevel 4,可以lilo启动提示符后输入:

boot: Linux 4

 

如果希望系统启动到正常功能的单用户模式,而且你知道root密码,可在lilo启动提示符后输入下列任一参数。

boot: Linux S

boot: Linux 1

boot: Linux –s

 

如果希望系统以少于实际内存数的内存启动(也就是说机器有64MB内存,只分配48MB给系统使用),在lilo启动提示符后输入:

boot: Linux mem=48M

 

注意,不要指定大于实际内存数的内存,否则内核会崩溃。如果你有多于64MB的内存,如128MB,应在系统启动时执行mem=128或在/etc/lilo.conf中添加类似的命令行,否则旧内核或使用旧BIOS的主板将无法使用大于64MB的内存。

8.1.6 如何设置启动参数(GRUB)

GRUBHurd项目开发的新型启动管理器,比Lilo更灵活,不过启动参数也与之稍有不同。

grub> find /vmlinuz                                 ;寻找vmlinux

grub> root (hd0,0)                                           ;设置根设备

grub> kernel /vmlinuz root=/dev/hda1          ;设置内核和根文件系统

grub> initrd /initrd

grub> boot                                               ;启动

 

请注意Hurd中的设备名:

 

HURD/GRUB              Linux                         MSDOS/Windows

(fd0)                       /dev/fd0                  A:

(hd0,1)                             /dev/hda1                      C: (usually)
(hd0,4)                             /dev/hda4                      F: (usually)

(hd1,4)                             /dev/hdb4                      ?

 

详情参阅/usr/share/doc/grub/README.Debian/usr/share/doc/grub-doc/html/

8.2 活动记录

8.2.1 记录shell活动

比起普通的个人电脑环境,Unix环境的系统管理包含了更多细致的任务。必须掌握所有基本的配置方法以便进行系统故障恢复。基于XGUI配置工具看上去又好又方便,但不适用于紧急状况。

 

记录shell活动是个好习惯,特别是root用户。

 

Emacs:使用M-x shell在缓冲区中开始记录,使用C-x C-w将缓冲区中的记录写入文件。

 

Shell:使用screen命令和“^A H”,参阅〖8.6.23 screen来定制控制台〗或脚本命令:

$ script

Script started, file is typescript

... do whatever ...

Control-D

$ col -bx <typescript >savefile

$ vi savefile

 

还可使用下面的方法:

$ bash -i 2>&1 | tee typescript

8.2.2 记录X活动

如果需要X应用程序的活动记录图,包括xterm屏显,可使用gimpGUI)。它可以对每个窗口或整个屏幕进行拍照。还可以使用xwdxbase-clients)、importimagemagick)或scrotscrot)。

8.3 拷贝及创建子目录

8.3.1 拷贝整个子目录的基本命令

如果想重新整理文件组织结构,可使用下面的方法移动文件及文件链接:

 

标准方法:

# cp -a /source/directory /dest/directory # requires 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

其中,scp <==> rcpssh <==> rsh

 

下面的有关拷贝整个子目录的信息由Manoj Srivastava<srivasta@debian.org>发表于debian-user@lists.debian.org

8.3.2 cp

传统上,cp并不能真正完成这个任务,因为它既没对符号链接进行区别对待,又不能保存硬链接。另一件需要注意的事就是稀疏文件(有洞的文件)。

 

GNU cp克服了这缺陷,然而对于非GNU系统,cp仍存在问题。而且使用cp无法生成小巧轻便的文档包。

% cp -a . newdir

8.3.3 tar

Tar克服了cp在处理符号链接时出现的问题,然而,cpio可以处理特殊文件,传统的tar却不行。

 

对于某个有多重硬链接的文件,tar的处理方法是只将其中一个链接拷贝到磁带上,所以日后你只能找回拷贝中所保留那个的链接所指的文件;cpio会为每个链接做一个拷贝,日后你可以找回任意一个链接所指的文件。

 

PotatoWoody中,操作.bz2文件的tar命令参数有所变化,所以请在脚本中使用--bzip2而不要简写为-IPotato)或-jWoody)。

8.3.4 pax

全新的,符合POSIXIEEE Std 1003.2-1992pages 380–388 (section 4.48) and pages 936–940 (section E.4.48))标准的,众望所归的,轻便的文档包交互工具。pax可以读、写以及列出文档包的成员,并能拷贝文件目录层次。pax的操作独立于特定的文档包格式,支持各种各样不同的文档包格式。

 

pax工具刚刚成形,还很新。

# apt-get install pax

$ pax -rw -p e . newdir

$ find . -depth | pax -rw -p e newdir

8.3.5 cpio

cpiotar文档包提取/放入文件。该文档包可以是硬盘上的另一个文件,也可以是磁带或管道。

$ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio更善于处理cpio格式的文档包。通常它比cpio要快,且提供了更多磁带选项,并且能更友好的处理有讹误的输入数据。它支持交互式处理多卷文档包。用afio制作压缩文档包比压缩tarcpio文档包更安全。在备份处理脚本中afio是更佳的文档处理引擎

$ find . -depth -print0 | afio -px -0a new-dir

 

对所有的磁带备份我都使用afio

8.4 差异备份与数据同步

要进行差异备份和数据同步可使用下列几种方法:

·rcs:备份并进行历史记录,只支持文本。

 

·rdiff-backup: 备份并进行历史记录。支持链接。

 

·rsync:单路同步

 

·unison:双路同步

 

·cvs:多路同步服务器备份并进行历史记录,只支持文本,技术成熟。参阅〖12.1 CVS〗。

 

·arch:多路同步服务器备份并进行历史记录,但包括处于工作中的目录

 

·subversion:多路同步服务器备份并进行历史记录,专用于Apache

 

有关将这些方法与文档包操作结合应用的讨论参阅〖8.3 拷贝及创建子目录〗,有关自动进行备份的讨论参阅〖8.6.22 日程安排(cronat)〗。

 

我只讲解两个较容易使用的工具。

 

8.4.1 使用rdiff进行差异备份

rdiff-backup提供了简单好用的方法对任何文件包括链接进行历史差异备份。例如要对~/ to /mnt/backup目录下的所有文件做备份:

$ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup

 

从该文档包中取出3天前的旧数据恢复到~/old目录:

$ rdiff-backup -r 3D /mnt/backup ~/old

 

参阅rdiff-backup(1)

8.4.2 使用RCS进行定期差异备份

changetrack会定期对RCS文档包中基于文本格式的配置文件的变化进行记录。参阅changetrack(1)

# apt-get install changetrack

# vi changetrack.conf

8.5 系统冻结恢复

8.5.1 中止一个进程

运行top看看什么进程的活动有异常。按“P”cpu使用率排序,“M”以内存使用率排序,“k”可以中止一个进程。还有一种方法,使用BSD风格的ps aux | lessSystem V风格的ps -efH | lessSystem V风格的排列会显示父进程ID PPID,这对中止出错的(死掉的)子进程十分有用。

 

知道了进程的ID,就可使用kill中止(或发信号给)某个进程,killall的作用正如其名一样。经常使用的信号有:

1: HUP,重启daemon

15: TERM,普通中止

9: KILL,强令中止

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'mountre'b'oot帮你逃离真正的险境。

 

本文写作之时,Debian默认安装的内核并未将该选项编译进去,需要重新编译内核激活该功能。详情参阅/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)

 

对于某些编码系统(EUCw3m可能是更好的选择。

8.6.2 释放内存

freetop能让你了解内存资源的许多有用信息。别担心“Mem:”行中“used”的大小,看看它下面的数字(本例的数字是38792)。

$ free -k # for 256MB machine

total used free shared buffers cached

Mem: 257136 230456 26680 45736 116136 75528

-/+ buffers/cache: 38792 218344

Swap: 264996 0 264996

 

物理内存的准确大小可通过grep '^Memory' /var/log/dmesg得到,本例将显示“Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)”

Total = 262144k = 256M (1k=1024, 1M=1024k)

Free to dmesg = 256984k = Total - kernel - reserved - data – init

Free to shell = 257136k = Total - kernel - reserved – data

 

约有5MB内存系统不能使用,因为内核需要它。

8.6.3 设定时间(BIOS)

# date MMDDhhmmCCYY

# hwclock –utc

# hwclock –systohc

# hwclock –show

 

设定系统时间和硬件时间为MM/DD hh:mm, CCYY。显示时间为本地时间而硬件时间使用UTC

8.6.4 设定时间(NTP)

参考:Managing Accurate Date and Time HOWTO

http://www.tldp.org/HOWTO/TimePrecision-HOWTO/index.html

 

8.6.4.1 拥有永久Internet连接的系统设置时间

 

设置系统时钟通过远程服务器自动对时:

# ntpdate server

 

如果你的系统拥有永久的Internet连接,应该将该命令加入/etc/cron.daily

 

8.6.4.2 偶尔进行Internet连接的系统设置时间

 

使用chrony软件包。

8.6.5 如何禁用屏幕保护程序

对于Linux控制台:

# setterm -powersave off

启动kon2kanji)控制台可执行:

# kon -SaveTime 0

运行X可执行:

# xset s off

# xset –dpms

# xscreensaver-command –prefs

 

参阅相关的帮助页面。

8.6.6 搜索系统管理数据库

Glibc提供了getent(1)搜索管理数据库的各类项目。例如passwdgrouphostsservicesprotocolsnetworks

getent database [key ...]

8.6.7 禁用声音(响铃)

最直接的方法是拔掉PC喇叭;-),对于Bash shell可执行:

echo "set bell-style none">> ~/.inputrc

8.6.8 控制台上的错误信息

不想看屏幕显示的错误信息,首选的方法是检查/etc/init.d/klogd,在该脚本中设置KLOGD="-c 3"然后运行/etc/init.d/klogd restart。另一种方法是执行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-level信息

 

如果你很厌恶详细而无用的错误信息,可以试试这个小补丁shutup-abit-bp6(位于样例脚本子目录)。

 

另一个该看看的地方是/etc/syslog.conf,检查一下是否有信息记录被发送到了控制台设备。

8.6.9 正确设置控制台类型

在类Unix系统中,访问控制台屏幕通常要调用库例程,这就为用户提供了一种独立于终端的方式来优化字符的屏幕更新过程。参阅ncurses(3X)terminfo(5)

 

Debian系统中,有大量预定义项目:

$ toe | less # 所有项目

$ toe /etc/terminfo/ | less # 用户可再配置的项目

 

你的选择可导出到环境变量TERM

 

当登录到远程Debian系统时,如果xtermterminfo项目在非Debianxterm中失效,请将终端类型改为支持较少特性的版本如“xterm-r6”

 

参阅/usr/share/doc/libncurses5/FAQ“dumb”terminfo的最小公分母。

8.6.10 恢复控制台的健壮性

如果执行$ cat some-binary-file后屏幕一片混乱(命令的返回值与你的输入大相径庭)

$ reset

8.6.11 将DOS下的文本文件转换为Unix类型

DOS文本文件(行尾=^M^J)转换成Unix文本文件(行尾=^J)。

# apt-get install sysutils

$ dos2unix dosfile

8.6.12 正规表达式的置换

将所有文件FILES...中的所有FROM_REGEX字段替换成TO_REGEX字段。

$ perl -i -p -e 's/FROM_REGEX/TO_REGEX/g;' FILES ...

;;;类似sed的语法: sed –e ‘s/FROM_REGEX/TO_REGEX/g’ FILES…

-i表示就地编辑-p表示FILES...各文件中循环。如果置换很复杂,应使用参数-i.bak而非-i,这有助于出错恢复;它会将每个原始文件保存为以.bak为后缀的备份文件。

8.6.13 提取源文件修改部分合并到更新包

下面的操作将根据文件位置,提取源文件的修改部分并创建统一的diff文件file.patch0file.patch1

$ diff -u file.old file.new1 > file.patch0

$ diff -u old/file new1/file > file.patch1

diff文件(也称补丁文件)通常用于发送程序更新。收到的补丁文件可使用下面的方法更新另一个文件:

$ patch -p0 file < file.patch0

$ patch -p1 file < file.patch1

如果有3个版本的源代码,使用diff3来合并效率更高:

$ diff3 -m file.mine file.old file.yours > file

8.6.14 分割大文件

$ split -b 650m file # 将大文件分块成多个650MB的小文件

$ cat x* >largefile # 将所有小文件合并成一个大文件

8.6.15 精巧的管道命令辅助脚本

下列脚本做为管道的一部分十分有用。

#find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"

/* find all files in /usr excluding some files */

xargs -n 1 command # run command for all items from stdin

xargs -n 1 echo| # split white-space-separated items into lines

grep -e pattern| # extract lines containing pattern

cut -d: -f3 -| # extract third field separated by : (passwd file etc.)

col -bx | # remove backspace and expand tabs to spaces

expand -| # expand tabs

sort -u| # sort and remove duplicates

tr '/n' ' '| # concatenate lines into one line

tr '/r' ''| # remove CR

tr 'A-Z' 'a-z'| # convert uppercase to lowercase

sed 's/^/# /'| # make each line a comment

sed 's//.ext//g'| # remove .ext

sed -n -e 2p| # print the second line

head -n 2 -| # print the first 2 lines

tail -n 2 -| # print the last 2 lines

8.6.16 从网页上获取文本或邮件列表文档

下面的操作将网页转化为文本文件。从网上拷贝配置文件时十分有用。

$ lynx -dump http://www.remote-site.com/help-info.html >textfile

 

linksw3m也可以这么用,只是生成的文本样式可能略有不同。

 

如果是邮件列表文档,可使用munpack从文本获得mime内容。

8.6.17 打印网页

下面的操作将网页内容打印成PostScript文件或发送到打印机。

$ apt-get install html2ps

$ html2ps URL | lpr

 

参阅〖3.6.1 lpr/lpd〗。还可使用a2psmpage软件包生成PostScript文件。

8.6.18 打印帮助页面

下面的操作将帮助页面打印成PostScript文件或发送到打印机。

$ man -Tps some-man-page | lpr

$ man -Tps some-man-page | mpage -2 | lpr

8.6.19 合并两个Postscript或PDF文件

可以将两个Postscript文件或PDF文件合并。

$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite /

-sOutputFile=bla.ps -f foo1.ps foo2.ps

$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite /

-sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.20 命令耗时

显示某进程的耗时

# time some-command >/dev/null

real 0m0.035s # time on wall clock (elapsed real time)

user 0m0.000s # time in user mode

sys 0m0.020s # time in kernel mode

8.6.21 nice命令

使用nice(来自GNU shellutils软件包)可设置命令启动时的nice值。renicebsdutils)或top可以重设进程的nice值。nice值为19代表最慢的(优先级最低的)进程;负值就“not-nice”,如-20代表非常快的(优先级高的)进程。只有超级用户可以设定负nice值。

# nice -19 top # very nice

# nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # very fast

 

有时极端的nice值对系统弊大于利,所以使用该命令要小心。

8.6.22 日程安排(cron,at)

Linux下使用cronat进行任务日程安排。参阅at(1)crontab(5)crontab(8)

 

执行命令crontab -e创建或编辑crontab文件,为规律事务(按周期循环的事务)安排日程。下面的一个crontab文件样例:

# use /bin/sh to run commands, no matter what /etc/passwd says

SHELL=/bin/sh

# mail any output to `paul', no matter whose crontab this is

MAILTO=paul

# Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)

# run at 00:05, every day

5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

# run at 14:15 on the first of every month -- output mailed to paul

15 14 1 * * $HOME/bin/monthly

# run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:

0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%

23 */2 1 2 * echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"

5 4 * * sun echo "run at 04:05 every sunday"

# run at 03:40 on the first Monday of each month

40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command –args

执行at命令为偶然任务(只执行一次的任务)安排日程:

$ echo 'command -args'| at 3:40 Monday

8.6.23 用screen来定制控制台

screen程序允许在单一的物理终端或终端模拟窗口运行多个伪终端,每个伪终端都拥有自己的交互式shell。即便可以使用Linux伪终端或多个xterm窗口,研究一下如何设置screen丰富的特性仍很有益,这些特性包括:

·回溯历史显示,

·拷贝和粘贴,

·输出到日志,

·图形入口,

·将终端与整个屏幕会话分离,稍后再连接。

 

8.6.23.1 远程访问方案

 

如果你经常从远程终端登录到Linux机器或使用VT100终端程序,screendetach(分离)特性将简化你的生活。

1.    通过拔号连接登录,运行了一个非常复杂的screen会谈,打开了好几个窗口,有编辑器和其它一些程序。

2.    突然你需要离开终端一下,但你并不想挂断连接中止工作。

3.    输入^A d离开会话,然后登出系统。(或者更简单些,输入^A DD离开会话并自动登出系统)。

  1. 当你回来时,需要再次登录,可输入命令screen -rscreen会如魔法般地重新连接上所有打开的窗口。

 

8.6.23.2 典型的screen命令

 

一但打开了screen程序,除了命令按键(默认为^A)所有的键盘输入都被送到当前窗口,所有的screen命令均按特定方式输入:^A加一个单键命令[加一些参数]的。常用的命令有:

^A ? 显示帮助屏幕(显示命令集)

^A c 创建并切换到新窗口

^A n 跳到下一个窗口

^A p 跳到上一个窗口

^A 0 跳到0号窗口

^A w 显示窗口列表

^A a Ctrl-A做为键盘输入发送到当前窗口

^A h 对当前窗口做硬拷贝写入到文件

^A H 开始/中止将当前窗口事件记录到文件

^A ^X 锁定终端(密码保护)

^A d 从终端分离屏幕会话

^A DD 分离屏幕会话并退出登录

 

以上只是screen命令的一个很小的子集。只要是你认为screen能干的事,没准它真就可以!详情参阅screen(1)

 

8.6.23.3 screen会话中的退格键和Ctrl-H

 

在运行screen时,如果发现退格键和/Ctrl-H无法正常工作,可编辑/etc/screenrc,找到这行:

bindkey -k kb stuff "/177"

将这注释掉(例如在句首添加“#”)。

 

8.6.23.4 X下与screen等价的程序

 

找找xmove。参阅xmove(1)。

8.6.24 网络测试基础

安装netkit-pingtraceroutednsutilsipchains(适用于2.2版内核)、iptables(适用于2.4版内核)和net-tools软件包,然后执行:

$ ping yahoo.com # 检查Internet连接

$ traceroute yahoo.com # 跟踪IP数据包

$ ifconfig # 检查主机设置

$ route -n # 检查路由设置

$ dig [@dns-server.com] host.dom [{a|mx|any}] |less

# 检查dns-server.comhost.dom DNS记录

# 查找{mx|any}记录

$ ipchains -L -n |less # 检查包过滤(2.2 kernel)

$ iptables -L -n |less # 检查包过滤(2.4 kernel)

$ netstat -a # 查找系统上所有打开的端口

$ netstat -l --inet # 查找系统监听的端口

$ netstat -ln --tcp # 查找系统监听的TCP端口(端口数字)

8.6.25 从本地缓冲池中收邮件

从本地缓冲池中收的邮件:

# exim -q # flush waiting mail

# exim -qf # flush all mail

# exim -qff # flush even frozen mail

-qff选项用在/etc/ppp/ip-up.d/exim脚本中效果更好。

8.6.26 删除本地缓冲池中的冻结邮件

删除本地缓冲池中的冻结邮件并返回出错信息:

# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`

8.6.27 再分发mbox中的信件

如果home目录没有空间继续处理邮件,就需要对磁盘空间进行扩容,扩容完成后需要手工分发/var/mail/username目录中的邮件到home目录中的分类邮箱,执行:

# /etc/init.d/exim stop

# formail -s procmail </var/mail/username

# /etc/init.d/exim start

8.6.28 清空文件内容

要清空某些文件如日志文件的内容,千万不要使用rm删除文件然后再创建一个新的空文件,因为在两次操作的间隔,系统可能需要访问该文件。下面是清空文件内容的安全方法:

$ :>file-to-be-cleared

8.6.29 空文件

下面的命令可以创建空文件:

$ dd if=/dev/zero of=filename bs=1k count=5 # 5KB of zero content

$ dd if=/dev/urandom of=filename bs=1m count=7 # 7MB of random content

$ touch filename # create 0B file (if file exists, updates mtime)

8.6.30 chroot

假设你在/dev/hda1上安装了一个完整的Linux发行版(可能是Debian的某个发布版或是Red Hat的发行版),当前你正在运行/dev/hda2上安装的另一个Linux系统。采用共享同一个内核的方法,可以运行/dev/hda1上的系统,又不用重启正在运行的/dev/hda2上的系统。

# mount /dev/hda1 /mnt/target

... 假设/dev/hda1中有一个完整的系统

# chroot /mnt/target

... 现在/dev/hda1下的内容被看成是位于root目录。

# mount proc /proc # just in case

... 运行/dev/hda1中的命令

 

该方法可实现在同一台机器上同时安装stable/testing/unstable。同样,当运行需大量内存的程序如dselect时,可在主机上运行该程序,同时将子机硬盘通过NFS方式挂载到主机并开放读/写权限,在主机上使用chroot方法操作子机。

Woody中使用debootstrap命令很容易构造chroot体系:

# mkdir potatochroot

# debootstrap potato potatochroot

# chroot potatochroot

# apt-setup # set-up /etc/apt/sources.list

 

pbuilder是一个更专业化的chroot软件包,它可以构造一个chroot体系并在chroot中编译软件包。该体系可用于检查软件包编译时关联关系是否正确,并确保编译生成的软件包中没有不必要的或错误的关联关系。

 

参阅http://lists.debian.org/debian-user/2002/debian-user-200204/msg01010.html

8.6.31 怎样检查硬链接

检查两个文件是否是指向同一个文件的两个硬链接:

$ ls -li file1 file2

8.6.32 挂载硬盘上的镜像文件

如果file.img文件是硬盘内容的镜像文件,而且原始硬盘的配置参数为xxxx=(bytes/sector) * (sectors/cylinder),那么,下面的命令将其挂载到/mnt

# mount -o loop,offset=xxxx file.img /mnt

注意绝大部分的硬盘都是512 bytes/sector

8.6.33 Samba

获取Windoze文件的基本方法:

# mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid /

//server/share /mnt/smb # mount Windows files to Linux

# smbmount //server/share /mnt/smb /

-o "username=myname,uid=my_uid,gid=my_gid"

# smbclient -L 192.168.1.2 # list the shares on a computer

 

可从Linux检查Samba网上邻居:

# smbclient -N -L ip_address_of_your_PC | less

# nmblookup -T "*" 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值