第 9 章 系统技巧

目录

9.1. screen 程序
9.1.1. screen(1) 的使用场景
9.1.2. screen 命令的键绑定
9.2. 数据记录和展示
9.2.1. 日志后台守护进程(daemon)
9.2.2. 日志分析
9.2.3. 清晰的记录 shell 活动
9.2.4. 定制文本数据的显示
9.2.5. 定制时间和日期的显示
9.2.6. shell 中 echo 的颜色
9.2.7. 有颜色输出的命令
9.2.8. 记录编辑器复杂的重复操作动作
9.2.9. 记录 X 应用程序的图形
9.2.10. 记录配置文件的变更
9.3. 监控、控制和启动程序活动
9.3.1. 进程耗时
9.3.2. 调度优先级
9.3.3. ps 命令
9.3.4. top 命令
9.3.5. 列出被一个进程打开的文件
9.3.6. 跟踪程序活动
9.3.7. 识别使用文件和套接字的进程
9.3.8. 使用固定间隔重复一个命令
9.3.9. 使用文件循环来重复一个命令
9.3.10. 从 GUI 启动一个程序
9.3.11. 自定义被启动的程序
9.3.12. 杀死一个进程
9.3.13. 单次任务时间安排
9.3.14. 定时任务安排
9.3.15. Alt-SysRq 键
9.4. 系统维护技巧
9.4.1. 谁在系统里?
9.4.2. 警告所有人
9.4.3. 硬件识别
9.4.4. 硬件配置
9.4.5. 系统时间和硬件时间
9.4.6. 终端配置
9.4.7. 声音基础设施
9.4.8. 关闭屏幕保护
9.4.9. 关闭蜂鸣声
9.4.10. 内存使用
9.4.11. 系统安全性和完整性检查
9.5. 数据存储技巧
9.5.1. 硬盘空间使用情况
9.5.2. 硬盘分区配置
9.5.3. 使用 UUID 访问分区
9.5.4. LVM2
9.5.5. 文件系统配置
9.5.6. 文件系统创建和完整性检查
9.5.7. 通过挂载选项优化文件系统
9.5.8. 通过超级块(superblock)优化文件系统
9.5.9. 硬盘优化
9.5.10. 固态硬盘优化
9.5.11. 使用 SMART 预测硬盘故障
9.5.12. 通过 $TMPDIR 指定临时存储目录
9.5.13. 通过 LVM 扩展可用存储空间
9.5.14. 通过挂载另一个分区来扩展可用存储空间
9.5.15. 通过 “mount --bind” 挂载另一个目录来扩展可用存储空间
9.5.16. 使用符号链接扩展可用存储空间
9.5.17. 使用 overlayfs 扩展可用存储空间
9.6. 磁盘映像
9.6.1. 制作磁盘映像文件
9.6.2. 直接写入硬盘
9.6.3. 挂载磁盘映像文件
9.6.4. 清理磁盘映像文件
9.6.5. 制作空的磁盘映像文件
9.6.6. 制作 ISO9660 镜像文件
9.6.7. 直接写入文件到 CD/DVD-R/RW
9.6.8. 挂载 ISO9660 镜像文件
9.7. 二进制数据
9.7.1. 查看和编辑二进制数据
9.7.2. 不挂载磁盘操作文件
9.7.3. 数据冗余
9.7.4. 数据文件恢复和诊断分析
9.7.5. 把大文件分成多个小文件
9.7.6. 清空文件内容
9.7.7. 样子文件
9.7.8. 擦除整块硬盘
9.7.9. 擦除硬盘上的未使用的区域
9.7.10. 恢复已经删除但仍然被打开的文件
9.7.11. 查找所有硬链接
9.7.12. 不可见磁盘空间消耗
9.8. 数据加密提示
9.8.1. 使用 dm-crypt/LUKS 加密移动磁盘
9.8.2. 用dm-crypt加密的交换分区
9.8.3. 使用dm-crypt/LUKS挂载加密的磁盘
9.8.4. 用eCryptfs自动加密文件
9.8.5. 自动挂载 eCryptfs
9.9. 内核
9.9.1. Linux 内核 2.6/3.x
9.9.2. 内核参数
9.9.3. 内核头文件
9.9.4. 编译内核和相关模块
9.9.5. 编译内核源代码:Debian 内核团队推荐
9.9.6. 硬件驱动和固件
9.10. 虚拟化系统
9.10.1. 虚拟化工具
9.10.2. 虚拟化工作流
9.10.3. 挂载虚拟磁盘映像文件
9.10.4. Chroot 系统
9.10.5. 多桌面系统

这里,描述配置和管理系统的基本技巧,大部分在控制台操作。

对通过不可靠或断断续续的连接访问远程主机的人们而言,screen(1) 是一个非常有用的工具,因为它支持可中断的网络连接。


简单地使用 script(1) (参见 第 1.4.9 节 “记录 shell 活动”)记录 shell 活动会产生一个有控制字符的文件。这些控制字符可以按下面的方式,使用 col(1) 去掉。

$ script
Script started, file is typescript

做些操作……按 Ctrl-D 退出 script.

$ col -bx <typescript >cleanedfile
$ vim cleanedfile

如果你没有 script (例如:在 initramfs 里的启动过程中),你可以使用下面的方式代替。

$ sh -i 2>&1 | tee typescript
[提示] 提示

gnome-terminal 之类的x-terminal-emulator 也能够记录。你也许需要增加行缓冲来用滚动条查看。

[提示] 提示

你可以使用 screen(1) 和 "^A H" (参见 第 9.1.2 节 “screen 命令的键绑定”)来进行控制台记录。

[提示] 提示

你可以使用 emacs(1) 和 "M-x shell", "M-x eshell", 或 "M-x term" 来进行控制台记录。你稍后可以使用 "C-x C-w" 将缓冲写到文件。

尽管例如 more(1)less(1) 这样的分页程序(参见 第 1.4.5 节 “分页程序”)和用于高亮和格式的自定义工具(参见 第 11.1.8 节 “高亮并格式化纯文本数据”)可以漂亮地显示文本数据,但通用的编辑器 (参见 第 1.4.6 节 “文本编辑器”)是用途最广的,且可定制性最高。

[提示] 提示

对于 vim(1) 和它的分页模式别名 view(1),“:set hls” 可以启用高亮搜索。

大部分现代终端的 shell 中 echo 能够使用 ANSI 转义字符来显示颜色(参见 “/usr/share/doc/xterm/ctlseqs.txt.gz”)。

尝试下列例子

$ RED=$(printf "\x1b[31m")
$ NORMAL=$(printf "\x1b[0m")
$ REVERSE=$(printf "\x1b[7m")
$ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

你能够记录编辑器复杂的重复操作动作。

对于 Vim,请按下面操作。

  • "qa": 开始记录输入字符到有名字的寄存器 "a".

  • … 编辑器操作

  • "q": 结束记录输入的字符。

  • "@a":执行寄存器 "a 的内容".

对于 Emacs, 请按下面操作。

  • "C-x (": 开始定义一个键盘宏.

  • … 编辑器操作

  • "C-x )":结束定义一个键盘宏.

  • "C-x e": 执行一个键盘宏.

程序活动能够使用特殊的工具监控和控制。


[提示] 提示

procps 包提供了非常基础的监控、控制程序活动功能和启动程序功能。你应当把他们全部学会。

通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式"*.ext".

for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
  • find(1)xargs(1) 联合:

find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
  • find(1) 使用 "-exec" 选项并执行命令:

find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
  • find(1) 使用 "-exec" 选项并执行一个短的 shell 脚本:

find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

上面的列子确保适当处理怪异的文件名(如包含空格)。 find(1) 更多高级的用法,参见 第 10.1.5 节 “查找文件的语法”.

对于 命令行界面(command-line interface,CLI)$PATH 环境变量所指定的目录中第一个匹配相应名称的程序会被执行。参见 第 1.5.3 节 “"$PATH" 变量”

对于遵从 freedesktop.org 标准的 图形用户界面(graphical user interface,GUI)/usr/share/applications/ 目录中的 *.desktop 文件给每个程序的 GUI 菜单显示提供了必要的属性。参见 第 7.2.2 节 “Freedesktop.org 菜单”

举个例子,chromium.desktop 文件中为 “Chromium 网络浏览器” 定义了相关属性,例如程序名 “Name”,程序执行路径和参数 “Exec”,所使用的图标 “Icon” 等等(参见 桌面配置项规范)。文件内容如下:

[Desktop Entry]
Version=1.0
Name=Chromium Web Browser
GenericName=Web Browser
Comment=Access the Internet
Comment[fr]=Explorer le Web
Exec=/usr/bin/chromium %U
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=chromium
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
StartupWMClass=Chromium
StartupNotify=true

这是一个较为简单的说明。*.desktop 文件像下面那样被搜寻。

桌面环境设置 $XDG_DATA_HOME$XDG_DATA_DIR 环境变量。举个例子,在 GNOME 3 中:

  • 未设置 $XDG_DATA_HOME。(将使用默认值 $HOME/.local/share。)

  • $XDG_DATA_DIRS 被设置为 /usr/share/gnome:/usr/local/share/:/usr/share/

基准目录(参见 XDG Base Directory Specification)和应用程序目录如下所示。

  • $HOME/.local/share/$HOME/.local/share/applications/

  • /usr/share/gnome//usr/share/gnome/applications/

  • /usr/local/share//usr/local/share/applications/

  • /usr/share//usr/share/applications/

*.desktop 文件将按照这个顺序在这些 applications 目录中进行搜寻。

[提示] 提示

要建立一个用户自定义的 GUI 菜单项,需要在 $HOME/.local/share/applications/ 目录中添加一个 *.desktop 文件。

[提示] 提示

相似地,如果在这些基准目录下的 autostart 目录中建立了一个 *.desktop 文件,则 *.desktop 文件中指定的程序会在桌面环境启动时自动执行。参见 Desktop Application Autostart Specification

[提示] 提示

相似地,如果在 $HOME/Desktop 目录中建立了一个 *.desktop 文件并且桌面环境被配置为支持桌面图标启动器功能,则点击图标时指定的程序会被执行。请注意,$HOME/Desktop 目录的实际名称与语言环境有关。参见 xdg-user-dirs-update(1)

一些程序会被另一个程序自动启动。下面是自定义该过程的方法。

[提示] 提示

update-mime(8) 会更新 "/etc/mailcap" 文件,期间会用到 "/etc/mailcap.order" 文件 (参见 mailcap.order(5)).

[提示] 提示

debianutils 软件包提供 sensible-browser(1)sensible-editor(1)sensible-pager(1),它们可以分别对要调用的编辑器、分页程序和网络浏览器作出明智的选择。我建议你阅读那些 shell 脚本。

[提示] 提示

为了在 X 下运行例如 mutt 这样的控制台应用程序来作为你的首选应用程序,你应该像下面那样建立一个 X 应用程序并设置 “/usr/local/bin/mutt-term” 为你想要启动的首选应用程序。

# cat /usr/local/bin/mutt-term <<EOF
#!/bin/sh
gnome-terminal -e "mutt \$@"
EOF
chmod 755 /usr/local/bin/mutt-term

使用 cron(8) 来进行定时任务安排。参见 crontab(1)crontab(5).

你能够作为一个普通用户定时运行一个进程,比如, foo 使用 "crontab -e" 命令创建一个 crontab(5) 的文件 "/var/spool/cron/crontabs/foo"。

这里是一个 crontab(5) 文件的列子。

# 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
[提示] 提示

对那些非连续运行的系统,安装 anacron 软件包来定时执行周期性的命令,命令在接近机器启动的时间运行,并允许有特定的时间间隔。参见 anacron(8)anacrontab(5).

[提示] 提示

对于定时系统维护脚本,你能够以root 账户定时运行,把这类脚本放入 "/etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/", 或 "/etc/cron.monthly/". 这些脚本的执行时间,可以通过 "/etc/crontab" 和 "/etc/anacrontab" 来定制。

内核编译选项 "Magic SysRq key" (SAK 键)提供预防系统故障的措施,该选项现在是 Debian 内核的默认值。按 Alt-SysRq 键,接着按下面键中的一个键,会做拯救系统的神奇事情。


[提示] 提示

阅读 signal(7), kill(1)sync(1) 手册页来理解上面的描述。

"Alt-SysRq s", "Alt-SysRq u" 和 "Alt-SysRq r" 组合,有助于跳出真正坏的情形,并可以在不停止系统的情况下获得可用的键盘。

参见 "/usr/share/doc/linux-doc-3.*/Documentation/sysrq.txt.gz".

[小心] 小心

由于允许用户访问 root 权限的功能,Alt-SysRq 特性可能被认为是安全风险。在 "/etc/rc.local" 里面放入"echo 0 >/proc/sys/kernel/sysrq" 或在 "/etc/sysctl.conf" 里放入 "kernel.sysrq = 0"来禁用 Alt-SysRq 特性。

[提示] 提示

从 SSH 终端等,你能够通过向 "/proc/sysrq-trigger" 写入内容来使用 Alt-SysRq 特性。例如,从 root shell 提示符运行 "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" 来 syncs 和 umounts 所有已挂载的文件系统。

下面设置系统的硬件时间为:MM/DD hh:mm, CCYY.

# date MMDDhhmmCCYY
# hwclock --utc --systohc
# hwclock --show

Debian 系统的时间通常显示为本地时间,但硬件时间通常使用 UTC(GMT) 时间。

如果硬件(BIOS)时间设置为 UTC 时间,请在“/etc/default/rcS”里面设置“UTC=yes”。

下面是重新配置 Debian 系统使用的时区。

# dpkg-reconfigure tzdata

如果你希望通过网络来更新系统时间,考虑使用 ntp, ntpdatechrony 这类包提供的 NTP 服务。

[提示] 提示

systemd 下,是使用 systemd-timesyncd 来替代进行网络时间同步。参见 systemd-timesyncd(8).

参见下面内容。

[提示] 提示

ntp 包里面的 ntptrace(8) 能够跟踪 NTP 服务链至原始源。

用于现在的 Linux 的声卡设备驱动程序由 高级 Linux 声音体系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了兼容之前的 开放声音系统(Open Sound System,OSS)的模拟模式。

[提示] 提示

使用 “cat /dev/urandom > /dev/audio” 或 speaker-test(1) 来测试扬声器(^C 停止)。

[提示] 提示

如果你无法听到声音,那你的扬声器可能连接到了一个静音输出。现代的声音系统有许多输出。alsa-utils 软件包中的 alsamixer(1) 可以很好地配置声音和静音设置。

应用软件可被配置为不仅直接访问声音设备,也可以通过一些标准化声音服务器系统来访问它们。


每个流行的桌面环境通常都有一个通用的声音引擎。每个被应用程序使用的声音引擎都可以选择连接到不同的声音服务器。

糟糕的系统维护可能会暴露你的系统,导致它被外部非法使用。

对于系统安全性和完整性的检查,你需要从下面这些方面开始。


下面是一个简单的脚本,用来检测典型的所有人可写的错误文件权限。

# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
[小心] 小心

由于 debsums 软件包使用本地存储的 MD5 校验码,因此面对恶意攻击,也不能完全相信系统安全性检测工具。

使用 live CDdebian-installer CD 以救援模式启动你的系统,可以让你简单地重新配置你的启动设备的数据存储。

对于硬盘分区配置,尽管 fdisk(8) 被认为是标准的配置,但是 parted(8) 工具还是值得注意的。

大多数 PC 使用经典的主引导记录(Master Boot Record,MBR)方案,将硬盘分区数据保存在第一个扇区,即 LBA 扇区 0(512 字节)。

[注意] 注意

一些带有可扩展固件接口(Extensible Firmware Interface,EFI)的新 PC,包括基于 Intel 的 Mac,使用 全局唯一标识分区表(GUID Partition Table,GPT)方案,硬盘分区数据不保存在第一个扇区。

尽管 fdisk(8) 一直是硬盘分区的标准工具,但现在 parted(8) 替代了它。


[小心] 小心

尽管 parted(8) 声称也能用来创建和调整文件系统,但使用维护最好的专门工具来做这些事会更为安全,例如 mkfs(8)mkfs.msdos(8)mkfs.ext2(8)mkfs.ext3(8)mkfs.ext4(8)……)和 resize2fs(8)

[注意] 注意

为了在 GPTMBR 之间切换,你需要直接删除开头的几个块中的内容(参见 第 9.7.6 节 “清空文件内容”)并使用 “parted /dev/sdx mklabel gpt” 或 “parted /dev/sdx mklabel msdos” 来设置它。请注意,这里使用的 “msdos” 是用于 MBR

尽管重新配置你的分区或可移动存储介质的激活顺序可能会给分区产生不同的名字,但你可以使用同一个 UUID 来访问它们。如果你有多个硬盘并且你的 BIOS 没有给它们一致的设备名的话,使用 UUID 是不错的选择。

[提示] 提示

你可以使用 blkid(8) 来查看一个特定块设备的 UUID

[提示] 提示

如果需要的话,设备(例如可移动存储介质)的设备节点可以通过 udev 规则 使其变为静态。参见 第 3.3 节 “udev 系统”

LVM2 是一个用于 Linux 内核的逻辑卷管理器。使用 LVM2 的话,硬盘分区可以创建在逻辑卷上来替代物理硬盘。

LVM 有下列需求。

  • Linux 内核中的设备映射支持(Debian 内核默认支持)

  • 用户自定义设备映射支持库(libdevmapper* 软件包)

  • 用户自定义 LVM2 工具(lvm2 软件包)

请从下面的 man 手册开始了解 LVM2。

  • lvm(8):LVM2 机制的基础知识(列出了所有 LVM2 命令)

  • lvm.conf(5):LVM2 的配置文件

  • lvs(8):报告逻辑卷的相关信息

  • vgs(8):报告卷组的相关信息

  • pvs(8):报告物理卷的相关信息

对于 ext4 文件系统, e2fsprogs 包提供下面的工具。

  • mkfs.ext4(8) 创建新的 ext4 文件系统

  • fsck.ext4(8) 检查和修复现有 ext4 文件系统

  • tune2fs(8) 配置 ext4 文件系统的超级块

  • debugfs(8) 交互式的调试 ext4 文件系统. (它有 undel 命令来恢复已经删除的文件.)

mkfs(8)fsck(8) 命令是由 e2fsprogs 包提供的,是各种文件系统相关程序的前端。(mkfs.fstypefsck.fstype). 对于 ext4 文件系统,它们是 mkfs.ext4(8)fsck.ext4(8) (它们被符号链接到 mke2fs(8)e2fsck(8)).

Linux 支持的每一个文件系统,有相似的命令。


[提示] 提示

Ext4 文件系统是 Linux 系统上默认的文件系统,强烈推荐使用这个文件系统,除非你有特殊的理由不使用。

[提示] 提示

Btrfs 文件系统在 Linux 内核 3.2(Debian wheezy)上存在。它被期望作为 ext4 文件系统之后的下一个默认文件系统。

[警告] 警告

在得到当前内核空间的 fsck(8) 特征和引导管理器支持前,你的关键数据不应当使用 Btrfs 文件系统。

[提示] 提示

一些工具可以在没有 Linux 内核支持的情况下访问文件系统(参见 第 9.7.2 节 “不挂载磁盘操作文件”).

/etc/fstab” 中包含了基础的静态文件系统配置。例如,

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 / ext4 noatime,errors=remount-ro 0 1
UUID=817bae6b-45d2-5aca-4d2a-1267ab46ac23 none swap sw  0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto 0       0
[提示] 提示

UUID(参见 第 9.5.3 节 “使用 UUID 访问分区”)可以替代一般的块设备名称(例如 “/dev/sda1”、“/dev/sda2”……)来识别一个块设备。

一个文件系统的性能和特性可以通过所用的挂载选项来进行优化(参见 fstab(5)mount(8))。值得注意的有以下几点。

  • defaults” 选项隐含的默认选项为:“rw,suid,dev,exec,auto,nouser,async”。(通常)

  • noatime” 或 “relatime” 选项对于加速读取访问非常有效。(通常)

  • user” 选项允许一个普通用户挂载文件系统。这个选项是 “noexec,nosuid,nodev” 选项的组合。(通常,用于 CD 或 usb 存储设备)

  • noexec,nodev,nosuid” 选项组合被用来增强安全性。(通常)

  • "noauto" 选项限制挂载,只有明确进行挂载操作才进行挂载(通常)

  • 用于 ext3fs 的 “data=journal” 选项可以增强电源故障时数据的完整性,但会损失一些写入速度。

[提示] 提示

配置 root 文件系统非默认的日志模式,你需要向内核提供启动参数(参见 第 3.1.2 节 “第二阶段:引载加载程序”),比如说 "rootflags=data=journal"。对于 lenny 版本,默认的日志模式是 "rootflags=data=ordered".对于 squeeze 版本,是"rootflags=data=writeback".

固态硬盘(solid state drive,SSD)的性能和硬盘磨损可以通过下列方式优化。

  • 使用最新的 Linux 内核。(>= 3.2)

  • 减少读取硬盘访问的硬盘写入。

    • /etc/fstab 中设置 “noatime” 或 “relatime” 挂载选项。

  • 启用 TRIM 命令。

    • /etc/fstab 中为 ext4 文件系统、swap 分区、Btrfs 等设置 discard 挂载选项。参见 fstab(5)

    • /etc/lvm/lvm.conf 中为 LVM 设置 “discard” 选项。参见 lvm.conf(5)

    • /etc/crypttab 中为 dm-crypt 设置 “discard” 选项。参见 crypttab(5)

  • 启用 SSD 硬盘空间分配优化方案。

    • /etc/fstab 中为 Brtfs 设置 “ssd” 挂载选项。

  • 对于笔记本电脑,使系统每 10 分钟刷新数据到硬盘。

    • /etc/fstab 中设置 “commit=600” 挂载选项。参见 fstab(5)

    • 设置 pm-utils 使用笔记本模式,即使在 AC 电源供电下。参见 Debian BTS #659260.

[警告] 警告

将刷新间隔从一般的 5 秒改为 10 分钟会导致遇到电源故障时数据容易丢失。

你可以使用兼容 SMARTsmartd(8) 后台守护进程(daemon)来监控和记录你的硬盘。

  1. BIOS 中启用 SMART 功能。

  2. 安装 smartmontools 软件包。

  3. 通过 df(1) 列出硬盘驱动并识别它们。

    • 让我们假设要监控的硬盘为 “/dev/hda”。

  4. 检查 “smartctl -a /dev/hda” 的输出,看 SMART 功能是否已启用。

    • 如果没有,通过 “smartctl -s on -a /dev/hda” 启用它。

  5. 通过下列方式运行 smartd(8) 后台守护进程(daemon)。

    • 消除 /etc/default/smartmontools” 文件中 “start_smartd=yes” 的注释。

    • 通过 “sudo /etc/init.d/smartmontools restart” 重新启动 smartd(8) 后台守护进程(daemon)。

[提示] 提示

smartd(8) 后台守护进程(daemon)可以使用 /etc/smartd.conf 文件进行自定义,文件中包含了相关的警告。

在安装时创建在 Logical Volume Manager 逻辑卷管理(LVM) (Linux 特性) 上的分区,它们可以容易的通过合并扩展或删除扩展的方式改变大小,而不需要在多个存储设备上进行大量的重新配置。

我们在这里讨论磁盘影响的操作。

一个未挂载设备(例如,第二个 SCSI 或 串行 ATA 设备 “/dev/sdb”)的磁盘映像文件 “disk.img” 可以使用 cp(1)dd(1) 通过下列方式建立。

# cp /dev/sdb disk.img
# dd if=/dev/sdb of=disk.img

传统 PC 中位于主 IDE 硬盘第一扇区的主引导记录(MBR)(参见 第 9.5.2 节 “硬盘分区配置”)的磁盘映像可以使用 dd(1) 通过下列方式建立。

# dd if=/dev/hda of=mbr.img bs=512 count=1
# dd if=/dev/hda of=mbr-nopart.img bs=446 count=1
# dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
  • mbr.img”:带有分区表的 MBR

  • mbr-nopart.img”:不带分区表的 MBR

  • mbr-part.img”:仅 MBR 的分区表

如果你使用 SCSI 或 串行 ATA 设备作为启动硬盘,你需要使用 “/dev/sda” 替代 “/dev/hda”。

如果你要建立原始硬盘的一个硬盘分区的映像,你需要使用 “/dev/hda1” 等替代 “/dev/hda”。

可以使用循环设备通过下列方式挂载和卸载包含单个分区映像的磁盘映像 “partition.img”。

# losetup -v -f partition.img
Loop device is /dev/loop0
# mkdir -p /mnt/loop0
# mount -t auto /dev/loop0 /mnt/loop0
...hack...hack...hack
# umount /dev/loop0
# losetup -d /dev/loop0

可以简化为如下步骤。

# mkdir -p /mnt/loop0
# mount -t auto -o loop partition.img /mnt/loop0
...hack...hack...hack
# umount partition.img

可以使用 循环设备 挂载包含多个分区的磁盘映像 “disk.img” 的每个分区。因为循环设备默认不管理分区,因此我们需要通过下列方式重新设置它。

# modinfo -p loop # verify kernel capability
max_part:Maximum number of partitions per loop device
max_loop:Maximum number of loop devices
# losetup -a # verify nothing using the loop device
# rmmod loop
# modprobe loop max_part=16

现在循环设备可以管理多达 16 个分区。

# losetup -v -f disk.img
Loop device is /dev/loop0
# fdisk -l /dev/loop0

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x452b6464

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1         600     4819468+  83  Linux
/dev/loop0p2             601         652      417690   83  Linux
# mkdir -p /mnt/loop0p1
# mount -t ext4 /dev/loop0p1 /mnt/loop0p1
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/loop0p2 /mnt/loop0p2
...hack...hack...hack
# umount /dev/loop0p1
# umount /dev/loop0p2
# losetup -d /dev/loop0

或者,你也可以使用 kpartx 软件包中的 kpartx(8) 建立 设备映射设备来达到相同的效果。

# kpartx -a -v disk.img
...
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/mapper/loop0p2 /mnt/loop0p2
...
...hack...hack...hack
# umount /dev/mapper/loop0p2
...
# kpartx -d /mnt/loop0
[注意] 注意

你也可以使用循环设备利用偏移量来跳过 MBR 等,来挂载此类磁盘映像的单个分区。但这更加容易出错。

按下面的方式使用 dd(1) ,可以制作一个大小为 5GiB 的空磁盘映像文件。

$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

按下面的方式使用环回设备,你能够在这个磁盘映像"disk.img"上创建 ext4 文件系统。

# losetup -f -v disk.img
Loop device is /dev/loop1
# mkfs.ext4 /dev/loop1
...hack...hack...hack
# losetup -d /dev/loop1
$ du  --apparent-size -h disk.img
5.0G  disk.img
$ du -h disk.img
83M disk.img

对于 "disk.img",它的文件大小是5.0 GiB,而它实际磁盘使用仅仅是 83MiB.这个差距可能是由于 ext4 里面有稀疏文件.

[提示] 提示

稀疏文件的实际磁盘使用会随着数据的写入而增加。

回环设备设备映射 设备上使用类似的操作,在这些设备按 第 9.6.3 节 “挂载磁盘映像文件” 挂载后, 你能够使用 parted(8)fdisk(8)对这个磁盘映像"disk.img"进行分区,能够使用 mkfs.ext4(8), mkswap(8)在上面创建文件系统等.

"源目录"下的目录树可以通过如下所示的 cdrkit 提供的 genisoimage(1) 命令来制作 ISO9660 镜像文件,"cd.iso"。

#  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

类似的,可引导的 ISO9660 镜像文件,"cdboot.iso", 能够从 debian-installer 类似目录树 "source_directory" 制作,方式如下。

#  genisoimage -r -o cdboot.iso -V volume_id \
   -b isolinux/isolinux.bin -c isolinux/boot.cat \
   -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

这里的 Isolinux boot loader (参见 第 3.1.2 节 “第二阶段:引载加载程序”) 是用于启动的.

按下面的方式,你可以直接从光驱设备计算 md5sum 值,并制作 ISO9660 镜像。

$ isoinfo -d -i /dev/cdrom
CD-ROM is in ISO 9660 format
...
Logical block size is: 2048
Volume size is: 23150592
...
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
[警告] 警告

为了得到正确结果,你必须小心避免 Linux ISO9600 文件系统预读 bug。

这里,我们讨论直接操作存储介质上的二进制数据。

有硬链接的文件,能够使用 "ls -li" 确认。

$ ls -li
total 0
2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

"baz" 和 "foo" 的链接数为 "2" (>1),表示他们有硬链接。它们的 inode 号都是"2738404".这表示它们是同样的硬链接文件。如果你不想偶然碰巧发现硬链接文件,你可以通过 inode 号来查找它。比如说, 按下面的方式查找 "2738404" 。

# find /path/to/mount/point -xdev -inum 2738404

在可以物理访问您的 PC的情况下,任何人都可以轻易获得 root 权限,访问您的 PC 上的所有文件 (见 第 4.7.4 节 “root 密码安全”)。 这意味着登录密码系统在您的PC被偷盗时并不能保证您私人和敏感数据的安全。您必须部署数据加密技术来实现。尽管 GNU 隐私守护 (见 第 10.3 节 “数据安全基础”) 可以对文件进行加密,但它需要一些用户端的工作。

dm-crypteCryptfs通过 Linux 内核模块与很少的用户操作实现本地自动数据加密。


Dm-crypt 是一个使用 device-mapper 加密的文件系统. Device-mapper 映射一个块设备到另外一个。

eCryptfs 是另外一个加密文件系统,使用了堆叠文件系统。堆叠文件系统把它自己堆叠在已挂载文件系统的一个已有目录之上。

[小心] 小心

数据加密会消耗 CPU 时间等资源,请权衡其利弊。

[注意] 注意

通过 debian-installer (lenny 或更新版),整个 Debian 系统能够被安装到一个加密的磁盘上,使用 dm-crypt/LUKS 和 initramfs.

[提示] 提示

请参阅 第 10.3 节 “数据安全基础” 用户空间加密实用程序: GNU Privacy Guard

您可以用dm-crypt/LUKS加密大容量可移动设备上数据,例如挂载在“/dev/sdx”上的USB 记忆棒。你只需按如下步骤简单地把它格式化。

# badblocks -c 1024 -s -w -t random -v /dev/sdx
# fdisk /dev/sdx
... "n" "p" "1" "return" "return" "w"
# cryptsetup luksFormat /dev/sdx1
...
# cryptsetup open --type luks /dev/sdx1 sdx1
...
# ls -l /dev/mapper/
total 0
crw-rw---- 1 root root  10, 60 2008-10-04 18:44 control
brw-rw---- 1 root disk 254,  0 2008-10-04 23:55 sdx1
# mkfs.vfat /dev/mapper/sdx1
...
# cryptsetup luksClose sdx1

然后,它就可以正常的在现代桌面环境下,例如 GNOME 桌面可以使用 gnome-mount(1),挂载到 "/media/<disk_label"。只不过它会要求输入密码 (参见第 10.1.7 节 “可移动存储设备”)。不同的是写入的数据都是加密的。你可以把它格式化成其他格式的文件系统,例如用 "mkfs.ext4 /dev/mapper/sdx1" 把它格式化为 ext4。

[注意] 注意

如果您对数据的安全性要求很高,您可能需要重写多次(在上述示例中的"badblocks"命令)。虽然这个操作非常耗费时间。

让我们假设你原先的"/etc/fstab"包含以下内容。

/dev/sda7 swap sw 0 0

您可以使用 dm-crypt 通过如下步骤启用加密的交换分区。

# aptitude install cryptsetup
# swapoff -a
# echo "cswap /dev/sda7 /dev/urandom swap" >> /etc/crypttab
# perl -i -p -e "s/\/dev\/sda7/\/dev\/mapper\/cswap/" /etc/fstab
# /etc/init.d/cryptdisks restart
 ...
# swapon -a

您可以用eCryptfsecryptfs-utils包对~/Private/下的创建的文件自动加密。

  • 根据下面的提示运行ecryptfs-setup-private(1)并设置~/Private/

  • 通过运行ecryptfs-mount-private(1)激活“~/Private/”。

  • 将敏感数据文件移动到"~/Private/"并根据要求创建符号链接。

    • 候选:"~/.fetchmailrc"、"~/.ssh/identity","~/.ssh/id_rsa","~/.ssh/id_dsa"和"go-rwx"的其他文件

  • 将敏感数据目录移动到"~/Private/"的子目录中并按要求创建符号链接。

    • 候选:"~/.gnupg"和"go-rwx的其他目录

  • 创建从“~/Desktop/Private/”到“~/Private/的符号链接,实现更方便的桌面操作。

  • 通过运行 ecryptfs-umount-private(1) 停用"~/Private/"。

  • 在你需要加密文件时,使用“ecryptfs-mount-private”命令激活“~/Private/”目录。

[提示] 提示

因为 eCryptfs 只是选择性的加密敏感数据,它的花费比使用 dm-crypt 在 root 或 "/home" 设备加密的花费少的多。它不需要任何特殊的磁盘上的存储分配,但是其不能保证文件系统所有元数据的秘密性。

如果您使用您的登录密码为环绕加密密钥,您可以通过 PAM (可插拔身份验证模块)自动化安装 eCryptfs。

在"/etc/pam.d/common-auth"文件中的 "pam_permit.so"前插入下面的行。

auth required pam_ecryptfs.so unwrap

在"/etc/pam.d/common-session"文件中插入下面的行作为最后一行。

session optional pam_ecryptfs.so unwrap

在"/etc/pam.d/common-password"中的第一个活动行插入下面的行。

password required pam_ecryptfs.so

这相当方便。

[警告] 警告

PAM的配置错误可能会把您锁在自己的系统外。请参阅 第 4 章 认证

[小心] 小心

如果你使用你自己的登录密码作为环绕加密密钥,加密的数据和用户登录密码的安全性一样 (参见第 4.3 节 “好密码”)。除非你已认真设置了一个强密码,否则你的数据仍然处在危险中,当别人偷了笔记本以后,然后运行密码破解 软件 (参见第 4.7.4 节 “root 密码安全”)。

对于支持的架构,Debian 使用软件包来分发模块化的 Linux内核.

相对于 2.4 版来说,Linux 内核的 2.6/3.x 版有一些值得注意的特征。

Linux 版本从 2.6.39 跳到 3.0,不仅仅是一个主要的技术改变,也是第 20 个周年纪念日。

许多 Linux 特性可以按下面的方式,通过内核参数来配置。

参见 "kernel-parameters.txt(.gz)" 和 linux-doc-3.* 软件包提供的其它相关文档 ("/usr/share/doc/linux-doc-3.*/Documentation/filesystems/*")。

Debian 有它自己的方式来编译内核和相关模块。


如果你在 第 3.1.2 节 “第二阶段:引载加载程序” 使用 initrd , 请一定阅读 initramfs-tools(8), update-initramfs(8), mkinitramfs(8)initramfs.conf(5) 里的相关信息。

[警告] 警告

在编译 Linux 内核源代码时,请不要放置从"/usr/include/linux" 和 "/usr/include/asm" 到源代码树(比如:"/usr/src/linux*") 里目录的符号链接。(一些过期的文档建议这样做.)

[注意] 注意

当在 Debian stable 版里编译最新的 Linux 内核时, 可能需要使用一些从Debian unstable 版里 backported 向后移植的最新版本的工具。

[注意] 注意

dynamic kernel module support (DKMS)动态内核模块支持 是一个新的分布式独立框架,被设计用来允许单个的内核模块在不改变整个内核的情况下升级。这可以用于维护内核代码树外部的模块。这也使你升级内核时,重新编译模块变得非常简单。

硬件驱动是运行在目标系统上的代码。大部分硬件驱动现在是自由软件,已经包含在普通的 Debian 内核软件包里,放在 main 区域。

  • GPU 驱动

    • Intel GPU 驱动 (main)

    • AMD/ATI GPU 驱动 (main)和/

    • NVIDIA GPU 驱动 (nouveau 驱动放在 main , 由厂家支持的二进制驱动,放在 non-free.)

  • Softmodem 驱动

    • martian-modem 和 sl-modem-dkms 软件包 (non-free)

固件是加载在设备上的代码(比如说,CPU microcode, GPU 运行的渲染代码, 或 FPGA / CPLD 数据……)部分固件包是作为自由软件存在,但是很多固件包由于包含有没有源代码的数据,二进制不是作为自由软件存在。

  • firmware-linux-free (main)

  • firmware-linux-nonfree (non-free)

  • firmware-linux-* (non-free)

  • *-firmware (non-free)

  • intel-microcode (non-free)

  • amd64-microcode (non-free)

请注意 non-freecontrib 的软件包不是 Debian 系统的一部分。启用和禁用 non-freecontrib 区域的配置,在 第 2.1.4 节 “Debian 档案库基础” 里描述。你应当注意到 第 2.1.5 节 “Debian 是100% 的自由软件” 里的描述,使用 non-freecontrib 软件包会有负面影响。

通过使用虚拟系统,我们能在单个机器上同时运行多个系统。

除了简单的 chroot 工具外,Debian上还有一些有关系统虚拟化仿真的软件包。这些软件包能够帮你创建虚拟系统。


参见维基百科 Comparison of platform virtual machines 来获得不同平台的虚拟化解决方案的详细比较信息。

[注意] 注意

这里所描述的功能只在 squeeze 或以后的版本中是可用的。

[注意] 注意

自从 lenny 之后,默认的 Debian 内核就是支持 KVM 的。

典型的虚拟化工作流涉及以下几个步骤。

对于原始磁盘映像文件,参见 第 9.6 节 “磁盘映像”.

对于其它虚拟磁盘映像文件,你能够用使用 network block device网络块设备 协议的 qemu-nbd(8) 来导出他们,并使用内核模块 nbd 来挂载它们.

qemu-nbd(8) 支持 QEMU 所支持的磁盘格式: QEMU 支持下列磁盘格式: raw, qcow2, qcow, vmdk, vdi, bochs, cow (user-mode Linux copy-on-write), parallels, dmg, cloop, vpc, vvfat (virtual VFAT)和主机设备.

网络块设备 能够用和回环设备一样的方式支持分区 (参见 第 9.6.3 节 “挂载磁盘映像文件”). 你能够按下面的方式挂载 "disk.img" 的第一个分区.

# modprobe nbd max_part=16
# qemu-nbd -v -c /dev/nbd0 disk.img
...
# mkdir /mnt/part1
# mount /dev/nbd0p1 /mnt/part1
[提示] 提示

你可以给 qemu-nbd(8) 使用 "-P 1" 选项来导出"disk.img"的第一个分区.

chroot(8) 提供最基本的方式来运行一个不同的 GNU/Linux 系统实例,并且不需要重启原有的系统。

[小心] 小心

下面的列子假设根源系统和 chroot 系统都共享相同的 CPU 架构。

你可以按下面的方式学会怎样建立和使用 chroot(8),通过在 script(1) 下运行 pbuilder(8) 程序。

$ sudo mkdir /sid-root
$ sudo pbuilder --create --no-targz --debug --buildplace /sid-root

你能够看到 debootstrap(8)cdebootstrap(1) 是如何在 "/sid-root" 下部署 sid 环境的系统数据.

[提示] 提示

这些 debootstrap(8)cdebootstrap(1) 是 Debian 安装器用来安装 Debian 的.这些也可以用来在不使用 Debian 安装盘的情况下,给一个系统安装 Debian,也可以替代安装其它 GNU/Linux 发行版。

$ sudo pbuilder --login --no-targz  --debug --buildplace /sid-root

你可以看到一个 sid 环境的系统 shell 是如何按下面的方式创建的。

  1. 拷贝本地配置 ("/etc/hosts", "/etc/hostname", "/etc/resolv.conf")

  2. 挂载 "/proc" 文件系统

  3. 挂载 "/dev/pts" 文件系统

  4. 创建 "/usr/sbin/policy-rc.d" 的过程,总是 101 退出

  5. 运行 "chroot /sid-root bin/bash -c 'exec -a -bash bin/bash'"

[注意] 注意

一些在 chroot 下的程序,需要访问比根源系统上的 pbuilder 能够提供的文件之外更多的文件.例如,"/sys", "/etc/passwd", "/etc/group", "/var/run/utmp", "/var/log/wtmp"等等.也许需要使用 bind-mounted 或拷贝.

[注意] 注意

"/usr/sbin/policy-rc.d" 文件阻止在 Debian 系统上自动启动后台守护程序。参见 "/usr/share/doc/sysv-rc/README.policy-rc.d.gz".

[提示] 提示

专用的 chroot 软件包 pbuilder 的原始用途,是构建一个 chroot 系统,并在 chroot 里面打包软件包。它是一个理想的系统,可以用来检查软件包的安装依赖性是否正确,确保不需要的和错误的安装依赖在最终的软件包中不存在。

[提示] 提示

类似的 schroot 软件包可以给你一个这样的主意,在 amd64 根源系统上运行 i386 chroot 系统。

我建议在 Debian 稳定版上使用 QEMU 或者 VirtualBox,这些软件应用虚拟化技术安全的运行多桌面系统。这能让你运行 Debian 不稳定版测试版上的桌面应用并且没有与之相关的通常意义上的风险。

因为单纯的 QEMU 工具是非常慢的,当主机系统支持 KVM 的时候,建议使用它来加速。

按下面的方法,能够创建一个可以用于QEMU 的包含有 Debian 系统的虚拟磁盘映像 "virtdisk.qcow2",这个 Debian 系统使用 debian 安装器:小 CD安装。

$ wget http://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
$ qemu-img create -f qcow2 virtdisk.qcow2 5G
$ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
...

Debian wiki: QEWU 可以查看更多信息。

VirtualBox 自带的 Qt 图形界面工具是相当直观的。关于它的图形界面和命令行工具的解释可以在 VisualBox 用户手册VirtualBox 用户手册(PDF) 中查看。

[提示] 提示

虚拟化下运行 UbuntuFedora 之类的其它 GNU/Linux 发行版,是一个不错的学习其配置技巧的方法。其它专有操作系统也可以在这个 GNU/Linux 虚拟化下很好的运行。