- 第 9 章 系统技巧
- 9.1. screen 程序
- 9.2. 数据记录和展示
- 9.3. 监控、控制和启动程序活动
- 9.4. 系统维护技巧
- 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. 通过 overlay 挂载(overlay-mounting)另一个目录来扩展可用存储空间
- 9.5.17. 使用符号链接扩展可用存储空间
- 9.6. 磁盘映像
- 9.7. 二进制数据
- 9.8. 数据加密提示
- 9.9. 内核
- 9.10. 虚拟化系统
第 9 章 系统技巧
这里,描述配置和管理系统的基本技巧,大部分在控制台操作。
9.1. screen 程序
对通过不可靠或断断续续的连接访问远程主机的人们而言,screen(1) 是一个非常有用的工具,因为它支持可中断的网络连接。
表 9.1. 支持可中断网络连接的程序列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
screen | V:127, I:281 | 1013 | VT100/ANSI 终端模拟器混合复用的终端 |
tmux | V:34, I:136 | 830 | 终端复用的备选方案(使用 “Control-B”代替) |
9.1.1. screen(1) 的使用场景
screen(1) 不但允许一个终端窗口运行多个进程,还允许远程 shell 进程支持中断的连接.这里是一个典型的 screen(1) 使用场景.
登录到一个远程机器。
在单个控制台上启动
screen
。使用
^A c
(“Control-A” 接着 “c”)在screen
中创建的窗口执行多个程序.按
^A n
(“Control-A” 接着”n”)来在多个screen
窗口间转换.突然,你需要离开你的终端,但你不想丢掉正在做的工作,而这些工作需要连接来保持。
你可以通过任何方式分离
screen
会话。残忍地拔掉你的网络连接
输入
^A d
(“Control-A” 接着 “d”) 并手工从远程连接退出登录输入
^A DD
(“Control-A” 接着 “DD”) 分离screen
并退出登录
你重新登录到同一个远处主机(即使从不同的终端)。
使用 “
screen -r
“ 启动screen
.screen
魔术般的重新附上先前所有的screen
窗口和所有在活动运行的程序.
提示 | |
---|---|
对于拨号或者按包计费的网络连接,你可以通过 |
9.1.2. screen 命令的键绑定
在 screen
会话里,除了命令按键外的所有键盘输入都会被发送到当前窗口。 screen
所有命令按键是通过 ^A
(“Control-A”) 加单个键[加任何参数] 来输入.这里有一些重要的命令按键需要记住。
表 9.2. screen 键绑定列表
键绑定功能 | 说明 |
---|---|
^A ? | 显示帮助屏幕(显示键绑定) |
^A c | 创建一个新的窗口并切换到该窗口 |
^A n | 到下一个窗口 |
^A p | 到前一个窗口 |
^A 0 | 到 0 号窗口 |
^A 1 | 到 1 号窗口 |
^A w | 显示窗口列表 |
^A a | 作为键盘输入发送 Ctrl-A 到当前窗口 |
^A h | 把当前窗口的硬拷贝写到一个文件 |
^A H | 开始/结束 当前窗口到文件的记录 |
^A ^X | 锁定终端(密码保护) |
^A d | 从终端分离 screen 会话 |
^A DD | 分离 screen 会话并退出登录 |
细节参见 screen(1).
9.2. 数据记录和展示
9.2.1. 日志后台守护进程(daemon)
许多程序在”/var/log/
“ 目录下记录它们的活动.
- 系统日志后台守护进程(daemon): rsyslogd(8)
参见 第 3.2.5 节 “系统消息” 和 第 3.2.4 节 “内核消息”.
9.2.2. 日志分析
这里是主要的日志分析软件 (“~Gsecurity::log-analyzer
“ 在 aptitude(8) 中).
表 9.3. 系统日志分析软件列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
logwatch | V:16, I:18 | 2265 | 用 Perl 写的日志分析软件,有好的输出 |
fail2ban | V:112, I:123 | 2092 | 禁用造成多个认证错误的 IP |
analog | V:4, I:109 | 3534 | web 服务器日志分析 |
awstats | V:9, I:15 | 6910 | 强大和特性全面的 web 服务器日志分析 |
sarg | V:3, I:3 | 843 | 生成 squid 分析报告 |
pflogsumm | V:1, I:4 | 111 | Postfix 日志条目概要 |
syslog-summary | V:0, I:2 | 30 | 总结 syslog 日志文件内容 |
fwlogwatch | V:0, I:0 | 479 | 防火墙日志分析软件 |
squidview | V:0, I:1 | 189 | 监控和分析 squid access.log 文件 |
swatch | V:0, I:0 | 101 | 有正则表达式、高亮和曲线的日志文件查看器 |
crm114 | V:0, I:0 | 1119 | Controllable Regex Mutilator 和垃圾邮件过滤 (CRM114) |
icmpinfo | V:0, I:0 | 44 | 解释 ICMP 信息 |
注意 | |
---|---|
CRM114 提供语言架构来写模糊 过滤器,使用了 TRE 正则表达式库 。它主要在垃圾邮件过滤器中使用,但也能够用于日志分析。 |
9.2.3. 清晰的记录 shell 活动
简单地使用 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
提示 | |
---|---|
像 |
提示 | |
---|---|
你可以使用 screen(1) 和 “ |
提示 | |
---|---|
你可以使用 emacs(1) 和 “ |
9.2.4. 定制文本数据的显示
尽管例如 more(1) 和 less(1) 这样的分页程序(参见 第 1.4.5 节 “分页程序”)和用于高亮和格式的自定义工具(参见 第 11.1.8 节 “高亮并格式化纯文本数据”)可以漂亮地显示文本数据,但通用的编辑器 (参见 第 1.4.6 节 “文本编辑器”)是用途最广的,且可定制性最高。
提示 | |
---|---|
对于 vim(1) 和它的分页模式别名 view(1),“ |
9.2.5. 定制时间和日期的显示
“ls -l
” 命令默认的时间和日期显示格式取决于语言环境(相关的值参见 第 1.2.6 节 “时间戳”)。“$LANG
” 变量将被首先考虑,但它会被 “$LC_TIME
” 变量覆盖。
每个语言环境实际的默认显示格式取决于所使用的 C 标准库的版本(libc6
软件包),也就是说,不同的 Debian 发行版有不同的默认情况。
如果你真的想自定义超出语言环境的时间和日期显示格式,你应该通过 “--time-style
” 参数或 “$TIME_STYLE
” 的值来设置时间样式值(参见ls(1)、date(1)、“info coreutils 'ls invocation'
”)。
表 9.4. wheezy
中 “ls -l
” 命令时间和日期的显示案例
时间样式值 | 语言环境 | 时间和日期显示 |
---|---|---|
iso | 任何值 | 01-19 00:15 |
long-iso | 任何值 | 2009-01-19 00:15 |
full-iso | 任何值 | 2009-01-19 00:15:16.000000000 +0900 |
语言环境 | C | Jan 19 00:15 |
语言环境 | en_US.UTF-8 | Jan 19 00:15 |
语言环境 | es_ES.UTF-8 | ene 19 00:15 |
+%d.%m.%y %H:%M | 任何值 | 19.01.09 00:15 |
+%d.%b.%y %H:%M | C 或 en_US.UTF-8 | 19.Jan.09 00:15 |
+%d.%b.%y %H:%M | es_ES.UTF-8 | 19.ene.09 00:15 |
提示 | |
---|---|
你可以使用命令别名以避免在命令行中输入长的选项,例如 “ |
提示 | |
---|---|
ISO 8601 遵循这些 iso 格式。 |
9.2.6. shell 中 echo 的颜色
大部分现代终端的 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}"
9.2.7. 有颜色输出的命令
在交互式的环境下,命令的输出带颜色,能够给检查命令的输出带来便利。 我在我的”~/.bashrc
“里加入了下面内容.
if [ "$TERM" != "dumb" ]; then
eval "`dircolors -b`"
alias ls='ls --color=always'
alias ll='ls --color=always -l'
alias la='ls --color=always -A'
alias less='less -R'
alias ls='ls --color=always'
alias grep='grep --color=always'
alias egrep='egrep --color=always'
alias fgrep='fgrep --color=always'
alias zgrep='zgrep --color=always'
else
alias ll='ls -l'
alias la='ls -A'
fi
在交互式命令中,使用别名来限制颜色的影响范围。导出环境变量 “export GREP_OPTIONS='--color=auto'
“ 也有好处,这样能够让 less(1) 之类的页面程序看到颜色。当使用管道到其它命令时,你想去掉颜色,上面列子 “~/.bashrc
“ 中的内容,可以使用 “--color=auto
“ 代替.
提示 | |
---|---|
在交互式的环境中,通过” |
9.2.8. 记录编辑器复杂的重复操作动作
你能够记录编辑器复杂的重复操作动作。
对于 Vim),请按下面操作。
“
qa
“: 开始记录输入字符到有名字的寄存器 “a
“.… 编辑器操作
“
q
“: 结束记录输入的字符。“
@a
“:执行寄存器 “a
的内容”.
对于 Emacs, 请按下面操作。
“
C-x (
“: 开始定义一个键盘宏.… 编辑器操作
“
C-x )
“:结束定义一个键盘宏.“
C-x e
“: 执行一个键盘宏.
9.2.9. 记录 X 应用程序的图形
有少量方法可以记录 X 应用程序的图像,包括xterm
显示。
表 9.5. 图形图像处理工具列表
软件包 | 流行度 | 大小 | 命令 |
---|---|---|---|
xbase-clients | I:26 | 46 | xwd(1) |
gimp | V:68, I:341 | 22313 | GUI 菜单 |
imagemagick | I:400 | 218 | import(1) |
scrot | V:8, I:80 | 70 | scrot(1) |
9.2.10. 记录配置文件的变更
有特定的工具可以通过 DVCS 系统的帮助来记录配置文件的变更。
表 9.6. 在 VCS 中记录配置历史的软件包
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
etckeeper | V:27, I:32 | 162 | 使用 Git(默认)、Mercurial 或 Bazaar(新)来保存配置文件和它们的元数据 |
changetrack | V:0, I:0 | 71 | 使用 RCS(旧)保存配置文件 |
我建议使用带有 git(1) 的 etckeeper
软件包,它将整个 “/etc
” 置于 VCS 控制之下。它的安装指南和教程参见 “/usr/share/doc/etckeeper/README.gz
”。
从本质上讲,运行 “sudo etckeeper init
” 来为 “/etc
” 初始化 git 仓库,与 第 10.6.5 节 “记录配置历史的 Git” 中所解释的过程相似,但需要特殊的 hook 脚本来进行更全面的设置。
当你改变你的配置时,你可以使用 git(1) 来正常地记录它们。你每次运行软件包管理命令时,它也会自动记录变更。
提示 | |
---|---|
你可以通过执行 “ |
9.3. 监控、控制和启动程序活动
程序活动能够使用特殊的工具监控和控制。
表 9.7. 监控和控制程序活动工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
coreutils | V:891, I:999 | 17478 | nice(1): 用指定的调度优先权运行一个程序 |
bsdutils | V:673, I:999 | 393 | renice(1): 调整一个目前在运行的进程的调度优先权值 |
procps | V:739, I:999 | 792 | “/proc “ 文件系统工具: ps(1), top(1), kill(1), watch(1), … |
psmisc | V:427, I:845 | 679 | “/proc “ 文件系统工具: killall(1), fuser(1), peekfd(1), pstree(1) |
time | V:15, I:279 | 82 | time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用 |
sysstat | V:161, I:183 | 1918 | sar(1), iostat(1), mpstat(1), …: linux 系统性能工具 |
isag | V:0, I:3 | 116 | sysstat 的交互式的系统活动图 |
lsof | V:391, I:946 | 451 | lsof(8): 使用 “-p “ 选项列出被一个系统进程打开的文件 |
strace | V:16, I:153 | 2367 | strace(1):跟踪系统调用和信号 |
ltrace | V:1, I:21 | 363 | ltrace(1): 跟踪库调用 |
xtrace | V:0, I:0 | 353 | xtrace(1):跟踪 X11 客户端和服务器端之间的通信 |
powertop | V:9, I:217 | 662 | powertop(1):系统能耗使用信息 |
cron | V:805, I:997 | 263 | 根据 cron(8) 后台守护进程(daemon)的调度运行一个进程 |
anacron | V:409, I:482 | 99 | 用于非整天 24 小时运行系统的命令计划,类 cron |
at | V:162, I:310 | 161 | at(1) 或 batch(1): 在一个特定的时间运行任务或在某一系统负载下运行 |
提示 | |
---|---|
|
9.3.1. 进程耗时
显示 命令调用进程的时间消耗。
# time some_command >/dev/null
real 0m0.035s # 执行时间 (占用的真实时间)
user 0m0.000s # 用户模式时间
sys 0m0.020s # 内核模式时间
9.3.2. 调度优先级
进程的调度优先级是被一个进程优先级值控制。
表 9.8. 调度优先级值列表
进程优先级值 | 调度优先级 |
---|---|
19 | 最低优先级进程 |
0 | 非常高的普通用户优先级进程 |
-20 | root 用户非常高的优先级进程 |
# nice -19 top # 非常优先
# nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # 非常快
在某些情况下,极端的进程优先级值会对系统造成伤害。小心使用这个命令。
9.3.3. ps 命令
在 Debian 系统上的 ps(1) 命令同时支持 BSD 和 SystemV 特征,有助于识别静态的进程活动。
表 9.9. ps 命令样式列表
样式 | 典型的命令 | 特征 |
---|---|---|
BSD | ps aux | 显示 %CPU %MEM |
System V | ps -efH | 显示 PPID |
对于僵尸(死了的)子进程,你能够通过 “PPID
“ 字段的父进程 ID 来杀死它们。
pstree(1) 命令显示进程树。
9.3.4. top 命令
Debian 系统上的 top(1) 拥有丰富的特征,有助于识别进程有趣的动态行为。
它是一个交互式的全屏程序。你可以通过按”h”键来得到它的使用帮助,按”q”键来终止该程序。
9.3.5. 列出被一个进程打开的文件
你能够通过一个进程 ID(PID)来列出该进程所有打开的文件,例如,PID 为 1 的进程,使用下面的方式。
$ sudo lsof -p 1
PID=1 通常用于 init
程序.
9.3.6. 跟踪程序活动
你能够跟踪程序活动,使用strace(1), ltrace(1), xtrace(1) 来跟踪系统调用和信号、库调用、X11 客户端和服务器端之间的通信。
跟踪 ls
命令的系统调用。
$ sudo strace ls
9.3.7. 识别使用文件和套接字的进程
你可以通过 fuser(1) 来识别出使用文件的进程,例如,用下面的方式识别出 “/var/log/mail.log
“ 由哪个进程打开。
$ sudo fuser -v /var/log/mail.log
USER PID ACCESS COMMAND
/var/log/mail.log: root 2946 F.... rsyslogd
你可以看到 “/var/log/mail.log
“ 是由 rsyslogd(8) 命令打开并写入。
你可以通过 fuser(1) 来识别出使用套接字的进程,例如,用下面的方式识别出 “smtp/tcp
“ 由哪个进程打开。
$ sudo fuser -v smtp/tcp
USER PID ACCESS COMMAND
smtp/tcp: Debian-exim 3379 F.... exim4
现在你知道你的系统运行 exim4(8) 来处理连接到 SMTP 端口 (25)的 TCP 连接.
9.3.8. 使用固定间隔重复一个命令
watch(1) 使用固定间隔重新执行一个命令,并全屏显示输出。
$ watch w
显示哪些人登录到系统,每 2 秒钟更新一次。
9.3.9. 使用文件循环来重复一个命令
通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式”*.ext
“.
- Shell 循环方式(参见 第 12.1.4 节 “shell 循环”):
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 节 “查找文件的语法”.
9.3.10. 从 GUI 启动一个程序
对于 命令行界面(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 菜单项,需要在 |
提示 | |
---|---|
相似地,如果在这些基准目录下的 |
提示 | |
---|---|
相似地,如果在 |
9.3.11. 自定义被启动的程序
一些程序会被另一个程序自动启动。下面是自定义该过程的方法。
应用程序配置菜单:
GNOME3 桌面:“设置” → “系统” → “详细信息” → “默认应用程序”
KDE 桌面: “K” → “Control Center 控制中心” → “KDE Components 组件” → “Component Chooser 组件选择器”
Iceweasel 浏览器:“编辑” → “首选项” → “应用程序”
mc(1):“
/etc/mc/mc.ext
”
例如 “
$BROWSER
”、“$EDITOR
”、“$VISUAL
” 和 “$PAGER
” 这样的环境变量(参见 eviron(7))- 用于例如 “
editor
”、“view
”、“x-www-browser
”、“gnome-www-browser
” 和 “www-browser
” 这样的程序的 update-alternatives(1) 系统(参见 第 1.4.7 节 “设置默认文本编辑器”)
- 用于例如 “
“
~/.mailcap
” 和 “/etc/mailcap
” 文件的内容关联了程序的 MIME 类型(参见 mailcap(5))“
~/.mime.types
” 和 “/etc/mime.types
” 文件的内容关联了 MIME 类型的文件扩展名(参见 run-mailcap(1))
提示 | |
---|---|
update-mime(8) 会更新 “ |
提示 | |
---|---|
|
提示 | |
---|---|
为了在 X 下运行例如 |
# cat /usr/local/bin/mutt-term <<EOF
#!/bin/sh
gnome-terminal -e "mutt \$@"
EOF
chmod 755 /usr/local/bin/mutt-term
9.3.12. 杀死一个进程
使用 kill(1) 通过进程 ID 来杀死(发送一个信号)一个进程。
使用 killall(1) 或 pkill(1) 通过进程命令的名字或其它属性来做同样的事情。
表 9.10. kill 命令常用信号列表
信号值 | 信号名 | 功能 |
---|---|---|
1 | HUP | 重启后台守护进程(daemon) |
15 | TERM | 普通 kill |
9 | KILL | 硬 kill |
9.3.13. 单次任务时间安排
运行 at(1) 命令来安排一次性的工作。
$ echo 'command -args'| at 3:40 monday
9.3.14. 定时任务安排
使用 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
提示 | |
---|---|
对那些非连续运行的系统,安装 |
提示 | |
---|---|
对于定时系统维护脚本,你能够以root 账户定时运行,把这类脚本放入 “ |
9.3.15. Alt-SysRq 键
内核编译选项 “Magic SysRq key” (SAK 键)提供预防系统故障的措施,该选项现在是 Debian 内核的默认值。按 Alt-SysRq 键,接着按下面键中的一个键,会做拯救系统的神奇事情。
表 9.11. SAK命令键列表
Alt-SysRq 之后的键 | 行为描述 |
---|---|
r | 在 X 崩溃后,从 raw 模式恢复键盘 |
0 | 把控制台日志级别改变到 0 来减少错误信息 |
k | kill 在当前虚拟控制台上的所有进程 |
e | 发送 SIGTERM 到所有进程,除开 init(8) |
i | 发送 SIGKILL 到所有进程,除开 init(8) |
s | sync 所有已经挂载的文件系统来避免数据损坏 |
u | 重新以只读方式挂载所有已挂载的文件系统 (umount) |
b | reboot 系统,不同步或卸载 |
提示 | |
---|---|
阅读 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 特性可能被认为是安全风险。在 “ |
提示 | |
---|---|
从 SSH 终端等,你能够通过向 “ |
9.4. 系统维护技巧
9.4.1. 谁在系统里?
你可以通过下面的方法检查谁登录在系统里。
who(1) 显示谁登录在系统里面。
w(1) 显示谁登录在系统里面,他们在做什么。
last(1) 显示用户最后登录的列表。
lastb(1) 显示用户最后错误登录的列表。
提示 | |
---|---|
“ |
9.4.2. 警告所有人
你可以通过下面的方式使用 wall(1) 给登录系统的每一个人发送信息。
$ echo "We are shutting down in 1 hour" | wall
9.4.3. 硬件识别
对于 PCI 类设备(AGP, PCI-Express, CardBus, ExpressCard 等), 一开始就使用 lspci(8) (也许加上 “-nn
“ 选项) 进行硬件识别比较好。
此外,你可以通过阅读 “/proc/bus/pci/devices
“ 里面的内容或浏览”/sys/bus/pci
“ 下面的目录树来进行硬件识别(参见 第 1.2.12 节 “procfs 和 sysfs”).
表 9.12. 硬件识别工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
pciutils | V:195, I:992 | 196 | Linux PCI 工具: lspci(8) |
usbutils | V:84, I:862 | 324 | Linux USB 工具: lsusb(8) |
pcmciautils | V:13, I:21 | 97 | Linux PCMCIA 工具: pccardctl(8) |
scsitools | V:0, I:3 | 390 | SCSI 硬件管理工具集: lsscsi(8) |
procinfo | V:0, I:13 | 135 | 从 “/proc “: lsdev(8) 获得系统信息 |
lshw | V:12, I:94 | 842 | 硬件配置信息: lshw(1) |
discover | V:41, I:947 | 90 | 硬件识别系统: discover(8) |
9.4.4. 硬件配置
像 GNOME 和 KDE 这类现代图形桌面系统,虽然大部分硬件的配置都能够通过相应的图形配置工具来管理,但知道一些配置它们的基础方式,也是一个好的主意。
表 9.13. 硬件配置工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
console-setup | V:137, I:959 | 411 | Linux 控制台字体和键盘表工具 |
x11-xserver-utils | V:282, I:534 | 511 | X 服务端工具: xset(1), xmodmap(1) |
acpid | V:145, I:318 | 176 | 管理高级可配置和电源接口(ACPI)事件分发的后台守护进程(daemon) |
acpi | V:17, I:302 | 45 | 显示 ACPI 设备信息的工具 |
sleepd | V:0, I:0 | 86 | 在笔记本空闲时,使其进入休眠状态的后台守护进程(daemon) |
hdparm | V:408, I:718 | 256 | 硬盘访问优化 (参见 第 9.5.9 节 “硬盘优化”) |
smartmontools | V:134, I:197 | 2117 | 使用 S.M.A.R.T. 控制和监控存储系统 |
setserial | V:5, I:9 | 117 | 串口管理工具集 |
memtest86+ | V:1, I:29 | 2391 | 内存硬件管理工具集 |
scsitools | V:0, I:3 | 390 | SCSI 硬件管理工具集 |
setcd | V:0, I:1 | 35 | 光驱访问优化 |
big-cursor | I:1 | 27 | X 系统的大鼠标光标 |
提示 | |
---|---|
现代系统的 CPU 频率调整功能,是由内核模块 |
9.4.5. 系统时间和硬件时间
下面设置系统的硬件时间为: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
, ntpdate
和 chrony
这类包提供的 NTP 服务。
提示 | |
---|---|
在 systemd 下,是使用 |
参见下面内容。
ntp-doc
包
提示 | |
---|---|
在 |
9.4.6. 终端配置
有几个组件可以用来配置字符控制台和 ncurses(3) 系统功能。
“
/etc/terminfo/*/*
” 文件(terminfo(5))“
$TERM
” 环境变量(term(7))setterm(1)、stty(1)、tic(1) 和 toe(1)
如果 xterm
的 terminfo
对非 Debian 的 xterm
不起作用,则当你从远程登陆到 Debian 系统时,你需要改变你的终端类型 “$TERM
”,从 “xterm
” 更改为功能受限的版本(例如 “xterm-r6
”)。更多内容参见 “/usr/share/doc/libncurses5/FAQ
”。“dumb
” 是 “$TERM
” 中最通用的。
9.4.7. 声音基础设施
用于现在的 Linux 的声卡设备驱动程序由 高级 Linux 声音体系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了兼容之前的 开放声音系统(Open Sound System,OSS)的模拟模式。
提示 | |
---|---|
使用 “ |
提示 | |
---|---|
如果你无法听到声音,那你的扬声器可能连接到了一个静音输出。现代的声音系统有许多输出。 |
应用软件可被配置为不仅直接访问声音设备,也可以通过一些标准化声音服务器系统来访问它们。
表 9.14. 声音软件包
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
alsa-utils | V:341, I:476 | 2283 | 配置和使用 ALSA 的工具 |
oss-compat | V:2, I:29 | 20 | 在 ALSA 下兼容 OSS,预防 “/dev/dsp not found ” 错误 |
jackd | V:4, I:27 | 9 | JACK Audio Connection Kit. (JACK) 服务器(低延迟) |
libjack0 | V:1, I:13 | 338 | JACK Audio Connection Kit. (JACK) 库(低延迟) |
nas | V:0, I:0 | 243 | 网络音频系统(Network Audio System,NAS)服务器 |
libaudio2 | V:60, I:488 | 165 | 网络音频系统(Network Audio System,NAS)库 |
pulseaudio | V:350, I:471 | 6398 | PulseAudio 服务器,替代 ESD |
libpulse0 | V:289, I:604 | 969 | PulseAudio 客户端库,替代 ESD |
libgstreamer1.0-0 | V:372, I:574 | 5280 | GStreamer:GNOME 声音引擎 |
libphonon4 | I:121 | 680 | Phonon:KDE 声音引擎 |
每个流行的桌面环境通常都有一个通用的声音引擎。每个被应用程序使用的声音引擎都可以选择连接到不同的声音服务器。
9.4.8. 关闭屏幕保护
关闭屏幕保护,使用下面的命令。
表 9.15. 关闭屏幕保护命令列表
环境 | 命令 |
---|---|
Linux 控制台 | setterm -powersave off |
X 窗口(关闭屏幕保护) | xset s off |
X 窗口(关闭 dpms) | xset -dpms |
X 窗口(屏幕保护 GUI 配置) | xscreensaver-command -prefs |
9.4.9. 关闭蜂鸣声
可以把电脑的扬声器拔掉来关闭蜂鸣声。把 pcspkr
内核模块删除,也可以做到这点。
bash(1) 用到的 readline(3) 程序,当遇到告警字符(ASCII=7)时,将会发生。下面的操作将阻止发生。
$ echo "set bell-style none">> ~/.inputrc
9.4.10. 内存使用
对你来说,这里有两种可用的方法来得到内存的使用情况。
“
/var/log/dmesg
” 中的内核启动信息包含了可用内存的精确总大小。free(1) 和 top(1) 显示正在运行的系统中内存资源的相关信息。
下面是一个例子。
# grep '\] Memory' /var/log/dmesg
[ 0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init)
$ free -k
total used free shared buffers cached
Mem: 997184 976928 20256 0 129592 171932
-/+ buffers/cache: 675404 321780
Swap: 4545576 4 4545572
你可能会觉得奇怪:“dmesg 告诉你 free 为 990 MB,而 free -k 告诉你 free 为 320 MB。这丢失了超过 600 MB ……”。
别担心 “Mem:
” 这行中 “used
” 较大的值以及 “free
” 较小的值,放轻松,你需要查看的是下面的那个(在上面的例子中它们是 675404 和 321780)。
对于我的 MacBook,有 1GB=1048576k 内存(显卡系统用掉一些),我看到的如下。
表 9.16. 报告的内存大小
报告 | 大小 |
---|---|
dmesg 中 total 的大小 | 1016784k = 1GB - 31792k |
dmesg 中的 free | 990528k |
shell 下的 total | 997184k |
shell 下的 free | 20256k(但有效的为 321780k) |
9.4.11. 系统安全性和完整性检查
糟糕的系统维护可能会暴露你的系统,导致它被外部非法使用。
对于系统安全性和完整性的检查,你需要从下面这些方面开始。
debsums
软件包,参见 debsums(1) 和 第 2.5.2 节 “顶层“Release”文件及真实性”。chkrootkit
软件包,参见 chkrootkit(1)。clamav
软件包家族,参见 clamscan(1) 和 freshclam(1)。
表 9.17. 用于系统安全性和完整性检查的工具
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
logcheck | V:8, I:10 | 102 | 后台守护进程(daemon),将系统日志文件中的异常通过邮件发送给管理员 |
debsums | V:5, I:42 | 107 | 实用程序,使用 MD5 校验码对已安装软件包的文件进行校验 |
chkrootkit | V:5, I:24 | 970 | rootkit 检测软件 |
clamav | V:13, I:58 | 774 | Unix 的反病毒实用程序 —— 命令行界面 |
tiger | V:2, I:3 | 7822 | 报告系统安全漏洞 |
tripwire | V:2, I:3 | 11521 | 文件和目录完整性检测软件 |
john | V:2, I:12 | 452 | 先进的密码破解工具 |
aide | V:1, I:2 | 2063 | 高级入侵环境检测 —— 静态二进制 |
integrit | V:0, I:0 | 329 | 文件完整性验证程序 |
crack | V:0, I:1 | 149 | 密码猜测程序 |
下面是一个简单的脚本,用来检测典型的所有人可写的错误文件权限。
# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
小心 | |
---|---|
由于 |
9.5. 数据存储技巧
使用 live CD 或 debian-installer CD 以救援模式启动你的系统,可以让你简单地重新配置你的启动设备的数据存储。
9.5.1. 硬盘空间使用情况
硬盘空间的使用情况可以通过 mount
、coreutils
和 xdu
软件包提供的程序来评估:
mount(8) 显示所有挂载的文件系统(= 磁盘).
df(1) 报告文件系统使用的硬盘空间。
du(1) 报告目录树使用的硬盘空间。
提示 | |
---|---|
你可以将 du(8) 的输出传输给 xdu(1x),来使用它的图形交互式演示,例如 “ |
9.5.2. 硬盘分区配置
对于硬盘分区配置,尽管 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) 替代了它。
表 9.18. 硬盘分区管理软件包
软件包 | 流行度 | 大小 | GPT | 说明 |
---|---|---|---|---|
util-linux | V:891, I:999 | 4598 | 不支持 | 多种系统工具,包含 fdisk(8) 和 cfdisk(8) |
parted | V:363, I:561 | 304 | 支持 | GNU Parted,硬盘分区调整程序 |
gparted | V:19, I:132 | 2046 | 支持 | 基于 libparted 的 GNOME 分区编辑程序 |
gdisk | V:278, I:513 | 852 | 支持 | 用于 GPT 硬盘的分区编辑程序 |
kpartx | V:16, I:29 | 87 | 支持 | 为分区建立设备映射的程序 |
小心 | |
---|---|
尽管 parted(8) 声称也能用来创建和调整文件系统,但使用维护最好的专门工具来做这些事会更为安全,例如 mkfs(8)(mkfs.msdos(8)、mkfs.ext2(8)、mkfs.ext3(8)、mkfs.ext4(8)……)和 resize2fs(8)。 |
注意 | |
---|---|
为了在 GPT 和 MBR 之间切换,你需要直接删除开头的几个块中的内容(参见 第 9.7.6 节 “清空文件内容”)并使用 “ |
9.5.3. 使用 UUID 访问分区
尽管重新配置你的分区或可移动存储介质的激活顺序可能会给分区产生不同的名字,但你可以使用同一个 UUID 来访问它们。如果你有多个硬盘并且你的 BIOS 没有给它们一致的设备名的话,使用 UUID 是不错的选择。
mount(8) 命令带有 “
-U
” 选项可以使用UUID 来挂载一个块设备,而不必使用他的文件名称,例如 “/dev/sda3
”。“
/etc/fstab
”(参见 fstab(5))可以使用 UUID。引载加载程序(第 3.1.2 节 “第二阶段:引载加载程序”)也可以使用 UUID。
提示 | |
---|---|
你可以使用 blkid(8) 来查看一个特定块设备的 UUID。 |
提示 | |
---|---|
如果需要的话,设备(例如可移动存储介质)的设备节点可以通过 udev 规则 使其变为静态。参见 第 3.3 节 “udev 系统”。 |
9.5.4. LVM2
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):报告物理卷的相关信息
9.5.5. 文件系统配置
对于 ext4 文件系统, e2fsprogs
包提供下面的工具。
mkfs.ext4(8) 创建新的 ext4 文件系统
fsck.ext4(8) 检查和修复现有 ext4 文件系统
tune2fs(8) 配置 ext4 文件系统的超级块
debugfs(8) 交互式的调试 ext4 文件系统. (它有
undel
命令来恢复已经删除的文件.)
mkfs(8) 和 fsck(8) 命令是由 e2fsprogs
包提供的,是各种文件系统相关程序的前端。(mkfs.fstype
和 fsck.fstype
). 对于 ext4 文件系统,它们是 mkfs.ext4(8) 和 fsck.ext4(8) (它们被符号链接到 mke2fs(8) 和 e2fsck(8)).
Linux 支持的每一个文件系统,有相似的命令。
表 9.19. 文件系统管理包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
e2fsprogs | V:576, I:999 | 1449 | ext2/ext3/ext4 文件系统工具 |
reiserfsprogs | V:11, I:29 | 1132 | Reiserfs 文件系统工具 |
dosfstools | V:128, I:524 | 235 | FAT 文件系统工具. (Microsoft: MS-DOS, Windows) |
xfsprogs | V:21, I:98 | 3191 | XFS 文件系统工具. (SGI: IRIX) |
ntfs-3g | V:186, I:512 | 1479 | NTFS 文件系统工具. (Microsoft: Windows NT, …) |
jfsutils | V:1, I:12 | 1577 | JFS 文件系统工具. (IBM: AIX, OS/2) |
reiser4progs | V:0, I:4 | 1373 | Reiser4 文件系统工具 |
hfsprogs | V:0, I:8 | 356 | HFS 和 HFS Plus 文件系统工具. (Apple: Mac OS) |
btrfs-progs | V:38, I:64 | 4027 | Btrfs 文件系统工具 |
zerofree | V:3, I:94 | 25 | 把 ext2/3/4 文件系统上空闲块设置为零的程序 |
提示 | |
---|---|
Ext4 文件系统是 Linux 系统上默认的文件系统,强烈推荐使用这个文件系统,除非你有特殊的理由不使用。 |
提示 | |
---|---|
Btrfs 文件系统在 Linux 内核 3.2(Debian |
警告 | |
---|---|
在得到当前内核空间的 fsck(8) 特征和引导管理器支持前,你的关键数据不应当使用 Btrfs 文件系统。 |
提示 | |
---|---|
一些工具可以在没有 Linux 内核支持的情况下访问文件系统(参见 第 9.7.2 节 “不挂载磁盘操作文件”). |
9.5.6. 文件系统创建和完整性检查
mkfs(8) 在 Linux 系统上创建文件系统。fsck(8) 命令在 Linux系统上提供文件系统完整性检查和修复功能。
在文件系统创建后,Debian 现在默认不周期性的运行 fsck
。
小心 | |
---|---|
在已经挂载的文件系统上运行 |
提示 | |
---|---|
在 “ |
提示 | |
---|---|
从启动脚本里面运行的 fsck(8) 命令结果,可以在 “ |
9.5.7. 通过挂载选项优化文件系统
“/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 访问分区”)可以替代一般的块设备名称(例如 “ |
一个文件系统的性能和特性可以通过所用的挂载选项来进行优化(参见 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 节 “第二阶段:引载加载程序”),比如说 “ |
9.5.8. 通过超级块(superblock)优化文件系统
一个文件系统的特性可以使用 tune2fs(8) 命令通过超级块来优化。
执行 “
sudo tune2fs -l /dev/hda1
” 可以显示 “/dev/hda1
” 上的文件系统超级块内容。执行”
sudo tune2fs -c 50 /dev/hda1
“ 改变 “/dev/hda1
“ 文件系统的检查(在启动时执行fsck
)频率为每 50 次启动.执行 “
sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1 && fsck -pf /dev/hda1
” 在 “/dev/hda1
” 上将它从 ext3 转换为 ext4。(对未挂载的系统这么做。)
提示 | |
---|---|
尽管 tune2fs(8) 的名字是这样的,但它不仅能用于 ext2 文件系统,也能用于 ext3 和 ext4 文件系统。 |
9.5.9. 硬盘优化
警告 | |
---|---|
在你折腾硬盘配置之前,请检查你的硬件并阅读 hdparam(8) 的 man 手册页,因为这可能会对数据完整性造成相当大的危害。 |
你可以通过 “hdparm -tT /dev/hda
” 来测试 “/dev/hda
” 硬盘的访问速度。对于一些使用 (E)IDE 连接的硬盘,你可以使用 “hdparm -q -c3 -d1 -u1 -m16 /dev/hda
” 来启用 “(E)IDE 32 位支持”、启用 “using_dma flag”、设置 “interrupt-unmask flag” 并设置 “multiple 16 sector I/O”(危险!),从而加速硬盘访问速度。
你可以通过 “hdparm -W /dev/sda
” 来测试 “/dev/sda
” 硬盘的写入缓存功能。你可以使用 “hdparm -W 0 /dev/sda
” 关闭写入缓存功能。
现代高速 CD-ROM 光驱,你可以使用 “setcd -x 2
“ 降低速度,来读取不当压缩的 CDROM 光盘。
9.5.10. 固态硬盘优化
固态硬盘(solid state drive,SSD)的性能和硬盘磨损可以通过下列方式优化。
使用最新的 Linux 内核。(>= 3.2)
减少读取硬盘访问的硬盘写入。
- 在
/etc/fstab
中设置 “noatime
” 或 “relatime
” 挂载选项。
- 在
启用 TRIM 命令。
启用 SSD 硬盘空间分配优化方案。
- 在
/etc/fstab
中为 Brtfs 设置 “ssd
” 挂载选项。
- 在
对于笔记本电脑,使系统每 10 分钟刷新数据到硬盘。
在
/etc/fstab
中设置 “commit=600
” 挂载选项。参见 fstab(5)。设置 pm-utils 使用笔记本模式,即使在 AC 电源供电下。参见 Debian BTS #659260.
警告 | |
---|---|
将刷新间隔从一般的 5 秒改为 10 分钟会导致遇到电源故障时数据容易丢失。 |
9.5.11. 使用 SMART 预测硬盘故障
你可以使用兼容 SMART 的 smartd(8) 后台守护进程(daemon)来监控和记录你的硬盘。
安装
smartmontools
软件包。通过 df(1) 列出硬盘驱动并识别它们。
- 让我们假设要监控的硬盘为 “
/dev/hda
”。
- 让我们假设要监控的硬盘为 “
检查 “
smartctl -a /dev/hda
” 的输出,看 SMART 功能是否已启用。- 如果没有,通过 “
smartctl -s on -a /dev/hda
” 启用它。
- 如果没有,通过 “
通过下列方式运行 smartd(8) 后台守护进程(daemon)。
消除
/etc/default/smartmontools
” 文件中 “start_smartd=yes
” 的注释。通过 “
sudo /etc/init.d/smartmontools restart
” 重新启动 smartd(8) 后台守护进程(daemon)。
提示 | |
---|---|
smartd(8) 后台守护进程(daemon)可以使用 |
9.5.12. 通过 $TMPDIR 指定临时存储目录
应用程序一般在临时存储目录 “/tmp
” 下建立临时文件。如果 “/tmp
” 没有足够的空间,你可以通过 $TMPDIR
变量来为程序指定临时存储目录。
9.5.13. 通过 LVM 扩展可用存储空间
在安装时创建在 Logical Volume Manager 逻辑卷管理(LVM)) (Linux 特性) 上的分区,它们可以容易的通过合并扩展或删除扩展的方式改变大小,而不需要在多个存储设备上进行大量的重新配置。
9.5.14. 通过挂载另一个分区来扩展可用存储空间
如果你有一个空的分区(例如 “/dev/sdx
”),你可以使用 mkfs.ext4(1) 将它格式化,并使用 mount(8) 将它挂载到你需要更多空间的目录。(你需要复制原始数据内容。)
$ sudo mv work-dir old-dir
$ sudo mkfs.ext4 /dev/sdx
$ sudo mount -t ext4 /dev/sdx work-dir
$ sudo cp -a old-dir/* work-dir
$ sudo rm -rf old-dir
提示 | |
---|---|
你也可以选择挂载一个空硬盘映像文件(参见 第 9.6.5 节 “制作空的磁盘映像文件”)作为一个循环设备(参见 第 9.6.3 节 “挂载磁盘映像文件”)。实际的硬盘使用量会随着实际存储数据的增加而增加。 |
9.5.15. 通过 “mount —bind” 挂载另一个目录来扩展可用存储空间
如果你在另一个分区里有一个带有可用空间的空目录(例如 “/path/to/emp-dir
”),你可以通过带有 “--bind
” 选项的 mount(8),将它挂载到一个你需要更多空间的目录(例如 “work-dir
”)。
$ sudo mount --bind /path/to/emp-dir work-dir
9.5.16. 通过 overlay 挂载(overlay-mounting)另一个目录来扩展可用存储空间
如果你在另一个分区表中有可用的空间(例如,“/path/to/empty
” 和 “/path/to/work
”),你可以在其中建立一个目录并堆栈到你需要空间的那个旧的目录(例如,“/path/to/old
”),要这样做,你需要用于 Linux 3.18 版内核或更新版本(对应 Debian Stetch 9.0 或更新版本)的 OverlayFS。
$ sudo mount -t overlay overlay \
-olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work
“/path/to/empty
” 和 “/path/to/work
” 应该位于可读写的分区,从而能够写入 “/path/to/old
”。
9.5.17. 使用符号链接扩展可用存储空间
小心 | |
---|---|
这是一个已弃用的做法。某些软件在遇到“软链接目录”时可能不会正常工作。请优先使用上文所述的“挂载”的途径。 |
如果你在另一个分区里有一个带有可用空间的空目录(例如 “/path/to/emp-dir
”),你可以使用 ln(8) 建立目录的一个符号链接。
$ sudo mv work-dir old-dir
$ sudo mkdir -p /path/to/emp-dir
$ sudo ln -sf /path/to/emp-dir work-dir
$ sudo cp -a old-dir/* work-dir
$ sudo rm -rf old-dir
警告 | |
---|---|
别对由系统管理的目录(例如 “ |
9.6. 磁盘映像
我们在这里讨论磁盘影响的操作。
9.6.1. 制作磁盘映像文件
一个未挂载设备(例如,第二个 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
”。
9.6.2. 直接写入硬盘
磁盘映像文件 “disk.img
” 可以通过下列方式写入到一个匹配大小的未挂载设备(例如,第二个 SCSI 设备 “/dev/sdb
”。
# dd if=disk.img of=/dev/sdb
相似地,硬盘分区映像文件 “partition.img
” 可以通过下列方式写入到匹配大小的未挂载分区(例如,第二个 SCSI 设备的第一个分区 “/dev/sdb1
”)。
# dd if=partition.img of=/dev/sdb1
9.6.3. 挂载磁盘映像文件
可以使用循环设备通过下列方式挂载和卸载包含单个分区映像的磁盘映像 “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
注意 | |
---|---|
9.6.4. 清理磁盘映像文件
使用下面的方式,一个磁盘映像文件 “disk.img
“ 能够清理掉所有已经删除的文件,成为一个干净的稀疏映像 “new.img
“。
# mkdir old; mkdir new
# mount -t auto -o loop disk.img old
# dd bs=1 count=0 if=/dev/zero of=new.img seek=5G
# mount -t auto -o loop new.img new
# cd old
# cp -a --sparse=always ./ ../new/
# cd ..
# umount new.img
# umount disk.img
如果 “disk.img
” 位于 ext2、ext3 或 ext4,你也可以像下面那样使用 zerofree
软件包中的 zerofree(8)。
# losetup -f -v disk.img
Loop device is /dev/loop3
# zerofree /dev/loop3
# cp --sparse=always disk.img new.img
9.6.5. 制作空的磁盘映像文件
按下面的方式使用 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)在上面创建文件系统等.
9.6.6. 制作 ISO9660 镜像文件
“源目录
“下的目录树可以通过如下所示的 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。 |
9.6.7. 直接写入文件到 CD/DVD-R/RW
提示 | |
---|---|
对于由 cdrkit 提供的 wodim(1) 来讲,DVD 仅仅是一个大的 CD。 |
你能够通过如下所示的命令找到可用的设备。
# wodim --devices
然后将空的 CD-R 插入 CD 驱动器并且把 ISO9660 镜像文件,”cd.iso
“ 写入到设备中,例如用如下所示的 wodim(1) 将数据写入到 “/dev/hda
“ 设备。
# wodim -v -eject dev=/dev/hda cd.iso
如果用 CD-RW 代替 CD-R,用如下所示的命令来替代。
# wodim -v -eject blank=fast dev=/dev/hda cd.iso
提示 | |
---|---|
如果你的桌面系统自动挂载 CDs,在使用 wodim(1) 之前在终端里面用 “ |
9.6.8. 挂载 ISO9660 镜像文件
如果 “cd.iso
“ 包含一个 ISO9660 镜像, 下面的命令手工挂载这个文件到 “/cdrom
“.
# mount -t iso9660 -o ro,loop cd.iso /cdrom
提示 | |
---|---|
现代桌面系统能够自动挂载可移动介质,如按 ISO9660 格式化的 CD(参见 第 10.1.7 节 “可移动存储设备”). |
9.7. 二进制数据
这里,我们讨论直接操作存储介质上的二进制数据。
9.7.1. 查看和编辑二进制数据
最基础的查看二进制数据的方法是使用 “od -t x1
“ 命令。
表 9.20. 查看和修改二进制数据的软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
coreutils | V:891, I:999 | 17478 | 基础软件包,有 od(1) 来导出文件(HEX, ASCII, OCTAL, …) |
bsdmainutils | V:60, I:996 | 26 | 工具软件包,有 hd(1) 来导出文件(HEX, ASCII, OCTAL, …) |
hexedit | V:1, I:12 | 72 | 二进制浏览和编辑器(HEX, ASCII) |
bless | V:0, I:4 | 1028 | 全功能的十六进制编辑器(GNOME) |
okteta | V:1, I:15 | 1508 | 全功能的十六进制编辑器(KDE4) |
ncurses-hexedit | V:0, I:2 | 132 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC) |
beav | V:0, I:0 | 133 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC, OCTAL, …) |
提示 | |
---|---|
HEX 是十六进制英文hexadecimal首字母缩略词,基数 radix 是 16。OCTAL 是八进制英文octal 首字母缩略词,基数 radix是 8。ASCII是美国信息交换标准代码 American Standard Code for Information Interchange 的英文缩写,即正常的英语文本代码。EBCDIC是扩展二进制编码十进制交换码 Extended Binary Coded Decimal Interchange Code 的英文缩写,在 IBM 大型机 操作系统上使用。 |
9.7.2. 不挂载磁盘操作文件
有工具可以在没有挂载磁盘的情况下读写文件。
表 9.21. 不挂载磁盘操作文件的软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
mtools | V:10, I:83 | 389 | 不挂载磁盘的 MSDOS 文件工具 |
hfsutils | V:0, I:7 | 1884 | 不挂载磁盘的 HFS 和 HFS+ 文件工具 |
9.7.3. 数据冗余
Linux 内核所提供的RAID软件系统提供内核文件系统级别的数据冗余来实现高水平的存储可靠性。
有在应用程序级别增加数据冗余来实现高水平存储可靠性的工具。
表 9.22. 向文件添加数据冗余的工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
par2 | V:4, I:15 | 271 | 奇偶校验档案卷设置,用于检查和修复文件 |
dvdisaster | V:0, I:2 | 1741 | CD/DVD 媒体数据损失/划伤/老化的保护 |
dvbackup | V:0, I:0 | 413 | 使用 MiniDV 便携式摄像机的备份工具(提供 rsbep(1)) |
vdmfec | V:0, I:0 | 97 | 使用前向纠错恢复丢失的块 |
9.7.4. 数据文件恢复和诊断分析
有用于数据文件恢复和诊断分析的工具。
表 9.23. 数据文件恢复和诊断分析软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
testdisk | V:3, I:38 | 1426 | 分区扫描和磁盘恢复的实用程序 |
magicrescue | V:0, I:3 | 259 | 通过查找幻数 magic 字节来恢复文件的工具(译注:请 man file 来了解幻数) |
scalpel | V:0, I:4 | 87 | 简洁、高性能的文件提取 |
myrescue | V:0, I:3 | 83 | 恢复损坏硬盘中的数据 |
extundelete | V:1, I:11 | 148 | 恢复删除 ext3/4 文件系统上的文件的实用程序 |
ext4magic | V:0, I:4 | 233 | 恢复删除 ext3/4 文件系统上的文件的实用程序 |
ext3grep | V:0, I:3 | 281 | 帮助恢复 ext3 文件系统上删除的文件的工具 |
scrounge-ntfs | V:0, I:3 | 50 | NTFS 文件系统的数据恢复程序 |
gzrt | V:0, I:0 | 33 | gzip 恢复工具包 |
sleuthkit | V:2, I:24 | 1511 | 诊断分析工具(Sleuthkit) |
autopsy | V:0, I:2 | 1027 | SleuthKit 的图形化界面 |
foremost | V:0, I:7 | 104 | 恢复数据的诊断程序 |
guymager | V:0, I:1 | 1030 | 基于 Qt 的诊断图像工具 |
dcfldd | V:0, I:5 | 106 | 增强版的 dd ,用于诊断和安全 |
提示 | |
---|---|
在 |
9.7.5. 把大文件分成多个小文件
当一个文件太大而不能备份的时候,你应该在备份之前先把它分割为多个小于 2000MiB 的小文件,稍后再把这些小文件合并为初始的文件。
$ split -b 2000m large_file
$ cat x* >large_file
小心 | |
---|---|
为了防止文件名冲突,请确保没有任何以 “ |
9.7.6. 清空文件内容
为了清除诸如日志文件之类的文件的内容,不要用 rm(1) 命令去删除文件然后创建新的空文件,因为这个文件可能在命令执行的期间还在被使用。以下是清除文件内容的正确方法。
$ :>file_to_be_cleared
9.7.7. 样子文件
下面的命令创建样子文件或空文件。
$ dd if=/dev/zero of=5kb.file bs=1k count=5
$ dd if=/dev/urandom of=7mb.file bs=1M count=7
$ touch zero.file
$ : > alwayszero.file
你将发现下列文件。
“
5kb.file
“ 是 5KB 的全零数据。“
7mb.file
“ 是 7MB 随机数据。“
zero.file
“ 也许是一个 0 字节的文件。如果这个文件之前就存在,则它的mtime
会被更新,而它的内容和长度保持不变。“
alwayszero.file
“ 一定是一个 0 字节文件。如果这个文件之前存在,则它的mtime
会被更新,而它的内容会被清零。
9.7.8. 擦除整块硬盘
有几种方法来完全擦除设备上整个硬盘上数据,比如说,在 “/dev/sda
“ 上的 USB 内存盘。
小心 | |
---|---|
在执行这里的命令之前,你应该用 mount(8) 命令来查看 USB 记忆棒的挂载位置。” |
如下所示是通过数据归 0 的方式来擦除硬盘上所有数据的。
# dd if=/dev/zero of=/dev/sda
如下是用随机数据重写的方式来擦除所有数据的。
# dd if=/dev/urandom of=/dev/sda
如下是用随机数据重写的方式来高效擦除所有数据。
# shred -v -n 1 /dev/sda
因为 dd(1) 命令在许多可引导的 Linux CDs (例如 Debian 安装光盘) 上的 shell 环境下都是可用的,你能够在装有系统的硬盘上,例如 “/dev/hda
“, “/dev/sda
“ 等等设备上运行擦除命令来完全清除已经安装的系统。
9.7.9. 擦除硬盘上的未使用的区域
硬盘(或 USB 记忆棒)上未使用的区域,例如“/dev/sdb1
”可能仍然包含可被擦除的数据,因为他们本身只是解除了从文件系统的链接,这些可以通过重写来清除。
# mount -t auto /dev/sdb1 /mnt/foo
# cd /mnt/foo
# dd if=/dev/zero of=junk
dd: writing to `junk': No space left on device
...
# sync
# umount /dev/sdb1
警告 | |
---|---|
这对您的USB 记忆棒来说通常已经足够好了,但这还不完美。大部分已擦除的文件名和它们的属性可能隐藏并留在文件系统中。 |
9.7.10. 恢复已经删除但仍然被打开的文件
即使你不小心删除了某个文件,只要这个文件仍然被一些应用程序所使用(读或者写),恢复此文件是可能的。
尝试下列例子
$ echo foo > bar
$ less bar
$ ps aux | grep 'less[ ]'
bozo 4775 0.0 0.0 92200 884 pts/8 S+ 00:18 0:00 less bar
$ rm bar
$ ls -l /proc/4775/fd | grep bar
lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> 2 /home/bozo/bar (deleted)
$ cat /proc/4775/fd/4 > 3bar
$ ls -l
-rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar
$ cat bar
foo
当你安装了 lsof
软件包的时候,在另外一个终端执行如下命令。
$ ls -li bar
2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar
$ lsof |grep bar|grep less
less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar
$ rm bar
$ lsof |grep bar|grep less
less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted)
$ cat /proc/4775/fd/4 > bar
$ ls -li bar
2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar
$ cat bar
foo
9.7.11. 查找所有硬链接
有硬链接的文件,能够使用 “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
9.7.12. 不可见磁盘空间消耗
所有打开的文件被删除后,仍然消耗磁盘空间,尽管他们不能够被普通的 du(1) 所看见。这些被删除的文件和他们的大小,可以通过下面的方式列出。
# lsof -s -X / |grep deleted
9.8. 数据加密提示
在可以物理访问您的 PC的情况下,任何人都可以轻易获得 root 权限,访问您的 PC 上的所有文件 (见 第 4.7.4 节 “root 密码安全”)。 这意味着登录密码系统在您的PC被偷盗时并不能保证您私人和敏感数据的安全。您必须部署数据加密技术来实现。尽管 GNU 隐私守护 (见 第 10.3 节 “数据安全基础”) 可以对文件进行加密,但它需要一些用户端的工作。
dm-crypt 和 eCryptfs通过 Linux 内核模块与很少的用户操作实现本地自动数据加密。
表 9.24. 数据加密工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
cryptsetup | V:29, I:78 | 402 | 可用于加密的块设备 的实用程序(dm-crypt / 3LUKS) |
cryptmount | V:4, I:5 | 228 | 可用于加密的块设备着重于正常用户挂载/卸载的实用程序( dm-crypt / LUKS) |
ecryptfs-utils | V:3, I:5 | 460 | 可用于堆叠加密文件系统的实用程序( eCryptfs) |
Dm-crypt 是一个使用 device-mapper 加密的文件系统. Device-mapper 映射一个块设备到另外一个。
eCryptfs 是另外一个加密文件系统,使用了堆叠文件系统。堆叠文件系统把它自己堆叠在已挂载文件系统的一个已有目录之上。
小心 | |
---|---|
数据加密会消耗 CPU 时间等资源,请权衡其利弊。 |
注意 | |
---|---|
通过 debian-installer (lenny 或更新版),整个 Debian 系统能够被安装到一个加密的磁盘上,使用 dm-crypt/LUKS 和 initramfs. |
提示 | |
---|---|
请参阅 第 10.3 节 “数据安全基础” 用户空间加密实用程序: GNU Privacy Guard。 |
9.8.1. 使用 dm-crypt/LUKS 加密移动磁盘
您可以用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。
注意 | |
---|---|
如果您对数据的安全性要求很高,您可能需要重写多次(在上述示例中的” |
9.8.2. 用dm-crypt加密的交换分区
让我们假设你原先的”/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
9.8.3. 使用dm-crypt/LUKS挂载加密的磁盘
用dm-crypt/LUKS在”/dev/sdc5
“ 上创建的加密磁盘可以用如下步骤挂载到”/mnt
“:
$ sudo cryptsetup open /dev/sdc5 ninja --type luks
Enter passphrase for /dev/sdc5: ****
$ sudo lvm
lvm> lvscan
inactive '/dev/ninja-vg/root' [13.52 GiB] inherit
inactive '/dev/ninja-vg/swap_1' [640.00 MiB] inherit
ACTIVE '/dev/goofy/root' [180.00 GiB] inherit
ACTIVE '/dev/goofy/swap' [9.70 GiB] inherit
lvm> lvchange -a y /dev/ninja-vg/root
lvm> exit
Exiting.
$ sudo mount /dev/ninja-vg/root /mnt
9.8.4. 用eCryptfs自动加密文件
您可以用eCryptfs和ecryptfs-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 或 “ |
9.8.5. 自动挂载 eCryptfs
如果您使用您的登录密码为环绕加密密钥,您可以通过 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
这相当方便。
警告 | |
---|---|
小心 | |
---|---|
如果你使用你自己的登录密码作为环绕加密密钥,加密的数据和用户登录密码的安全性一样 (参见第 4.3 节 “好密码”)。除非你已认真设置了一个强密码,否则你的数据仍然处在危险中,当别人偷了笔记本以后,然后运行密码破解 软件 (参见第 4.7.4 节 “root 密码安全”)。 |
9.9. 内核
对于支持的架构,Debian 使用软件包来分发模块化的 Linux内核.
9.9.1. Linux 内核 2.6/3.x
相对于 2.4 版来说,Linux 内核的 2.6/3.x 版有一些值得注意的特征。
设备由 udev 系统创建(参见 第 3.3 节 “udev 系统”).
读写访问 IDE CD/DVD 设备,不再使用
ide-scsi
模块.网络包过滤功能使用
iptables
内核模块.
Linux 版本从 2.6.39 跳到 3.0,不仅仅是一个主要的技术改变,也是第 20 个周年纪念日。
9.9.2. 内核参数
许多 Linux 特性可以按下面的方式,通过内核参数来配置。
内核参数通过 bootloader 初始化(参见 第 3.1.2 节 “第二阶段:引载加载程序”)
对通过 sysfs 访问的内核参数,在运行时通过 sysctl(8) 修改(参见 第 1.2.12 节 “procfs 和 sysfs”)
当一个模块被激活时,通过 modprobe(8) 参数来设置模块参数。(参见 第 9.6.3 节 “挂载磁盘映像文件”)
参见 “kernel-parameters.txt(.gz)
“ 和 linux-doc-3.*
软件包提供的其它相关文档 (“/usr/share/doc/linux-doc-3.*/Documentation/filesystems/*
“)。
9.9.3. 内核头文件
大部分普通程序编译时不需要内核头文件,如果你直接使用它们来编译,甚至会导致编译中断。在 Debian 系统上,普通程序编译依赖 libc6-dev
软件包 (由 glibc
源代码包创建)提供的,在”/usr/include/linux
“ 和 “/usr/include/asm
“ 里的头文件。
注意 | |
---|---|
对于编译一些内核相关的程序,比如说从外部源代码编译的内核模块和 automounter 后台守护(daemon)程序( |
9.9.4. 编译内核和相关模块
Debian 有它自己的方式来编译内核和相关模块。
表 9.25. Debian 系统内核编译需要安装的主要软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
build-essential | I:499 | 20 | 创建 Debian 软件包所必须的软件包: make , gcc , … |
bzip2 | V:157, I:970 | 122 | bz2 文件压缩和解压缩工具 |
libncurses5-dev | I:116 | 6 | ncurses 开发者库和文档 |
git | V:305, I:478 | 35040 | git:Linux 内核使用的分布式版本控制系统 |
fakeroot | V:35, I:521 | 228 | 为非 root 用户创建软件包提供一个伪造的 root 环境 |
initramfs-tools | V:371, I:989 | 112 | 创建 initramfs 的工具(Debian 规范) |
dkms | V:70, I:219 | 294 | 动态内核模块支持 dynamic kernel module support (DKMS) (通用) |
devscripts | V:9, I:57 | 2623 | Debian Package maintainer Debian 包维护者的帮助脚本(Debian 规范) |
如果你在 第 3.1.2 节 “第二阶段:引载加载程序” 使用 initrd
, 请一定阅读 initramfs-tools(8), update-initramfs(8), mkinitramfs(8) 和initramfs.conf(5) 里的相关信息。
警告 | |
---|---|
在编译 Linux 内核源代码时,请不要放置从” |
注意 | |
---|---|
当在 Debian |
注意 | |
---|---|
dynamic kernel module support (DKMS)动态内核模块支持 是一个新的分布式独立框架,被设计用来允许单个的内核模块在不改变整个内核的情况下升级。这可以用于维护内核代码树外部的模块。这也使你升级内核时,重新编译模块变得非常简单。 |
9.9.5. 编译内核源代码:Debian 内核团队推荐
从上游内核源代码编译个性化的内核二进制包,你应当使用由它提供的 “deb-pkg
“ 对象。
$ sudo apt-get build-dep linux
$ cd /usr/src
$ wget http://www.kernel.org/pub/linux/kernel/v3.11/linux-<version>.tar.bz2
$ tar -xjvf linux-<version>.tar.bz2
$ cd linux-<version>
$ cp /boot/config-<version> .config
$ make menuconfig
...
$ make deb-pkg
提示 | |
---|---|
linux-source-<version> 软件包使用 “ |
从 Debian 内核源代码软件包编译特定的二进制包,你应当使用 “debian/rules.gen
“ 里的 “binary-arch_<architecture>_<featureset>_<flavour>
“ 对象。
$ sudo apt-get build-dep linux
$ apt-get source linux
$ cd linux-3.*
$ fakeroot make -f debian/rules.gen binary-arch_i386_none_686
进阶信息参见:
Debian Wiki: KernelFAQ
Debian Wiki: DebianKernel
Debian Linux 内核手册:https://kernel-handbook.debian.net
9.9.6. 硬件驱动和固件
硬件驱动是运行在目标系统上的代码。大部分硬件驱动现在是自由软件,已经包含在普通的 Debian 内核软件包里,放在 main
区域。
GPU 驱动
Intel GPU 驱动 (
main
)AMD/ATI GPU 驱动 (
main
)和/NVIDIA GPU 驱动 (nouveau) 驱动放在
main
, 由厂家支持的二进制驱动,放在non-free
.)
Softmodem 驱动
- martian-modem 和 sl-modem-dkms 软件包 (
non-free
)
- martian-modem 和 sl-modem-dkms 软件包 (
固件是加载在设备上的代码(比如说,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-free
和 contrib
的软件包不是 Debian 系统的一部分。启用和禁用 non-free
和 contrib
区域的配置,在 第 2.1.4 节 “Debian 档案库基础” 里描述。你应当注意到 第 2.1.5 节 “Debian 是100% 的自由软件” 里的描述,使用 non-free
和 contrib
软件包会有负面影响。
9.10. 虚拟化系统
通过使用虚拟系统,我们能在单个机器上同时运行多个系统。
提示 | |
---|---|
9.10.1. 虚拟化工具
除了简单的 chroot 工具外,Debian上还有一些有关系统虚拟化及仿真的软件包。这些软件包能够帮你创建虚拟系统。
表 9.26. 虚拟化工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
schroot | V:7, I:10 | 2708 | 在 chroot 下执行 Debian 二进制包的特异工具 |
sbuild | V:1, I:4 | 286 | 从 Debian 源码构建 Debian 二进制包的工具 |
pbuilder | V:2, I:16 | 966 | Debian 软件包的打包软件 |
debootstrap | V:6, I:63 | 298 | 搭建一个基本的 Debian 系统 (用 sh 写的) |
cdebootstrap | V:0, I:3 | 116 | 搭建一个 Debian 系统 (用 C 写的) |
virt-manager | V:10, I:42 | 2298 | 虚拟机管理器: 用于管理虚拟机的桌面应用 |
libvirt-clients | V:43, I:62 | 1167 | libvirt 的库程序 |
bochs | V:0, I:1 | 7194 | Bochs: IA-32 PC 仿真器 |
qemu | I:34 | 94 | QEMU: 快速的通用处理器仿真器 |
qemu-system | I:21 | 95 | QEMU: 全功能系统的模拟二进制 |
qemu-user | V:0, I:13 | 89671 | QEMU: 用户模式的模拟二进制 |
qemu-utils | V:11, I:107 | 6083 | QEMU: 工具集 |
qemu-kvm | V:10, I:61 | 107 | KVM: x86 硬件上有 硬件辅助虚拟化的全虚拟化 |
virtualbox | V:12, I:16 | 106495 | VirtualBox:i386 和 amd64 上 x86 的虚拟化解决方案 |
xen-tools | V:0, I:4 | 727 | 用于管理 debian XEN 虚拟服务器的工具 |
wine | V:19, I:82 | 192 | Wine: Windows 应用程序编程接口实现(标准套件) |
dosbox | V:2, I:18 | 2742 | DOSBox:有 Tandy/Herc/CGA/EGA/VGA/SVGA 显卡,声音和 DOS 的 x86 模拟器 |
dosemu | V:0, I:2 | 4891 | DOSEMU: Linux DOS 模拟器 |
vzctl | V:0, I:1 | 1112 | OpenVZ 服务器虚拟化解决方案 - 控制工具 |
vzquota | V:0, I:1 | 236 | OpenVZ 服务器虚拟化解决方案 - 份额工具 |
lxc | V:10, I:15 | 18761 | Linux 容器 用户层工具 |
参见维基百科 Comparison of platform virtual machines 来获得不同平台的虚拟化解决方案的详细比较信息。
9.10.2. 虚拟化工作流
注意 | |
---|---|
这里所描述的功能只在 |
注意 | |
---|---|
自从 |
典型的虚拟化工作流涉及以下几个步骤。
创建空文件系统 (目录树或磁盘映像)。
目录树可以通过 “
mkdir -p /path/to/chroot
“ 创建。原始的磁盘映像文件能够使用 dd(1) 创建 (参见 第 9.6.1 节 “制作磁盘映像文件” 和 第 9.6.5 节 “制作空的磁盘映像文件”).
qemu-img(1) 能够创建和转化 QEMU 支持的磁盘映像文件.
原始的格式和 VMDK 文件格式,能够作为虚拟化工具的通用格式.
使用 mount(8) 挂载磁盘映像到文件系统 (可选).
对于原始磁盘映像文件,把它作为回环设备 或 设备映射 设备挂载. (参见 第 9.6.3 节 “挂载磁盘映像文件”).
对于 QEMU 支持的磁盘映像,把它们作为 network block device 网络块设备挂载 (参见 第 9.10.3 节 “挂载虚拟磁盘映像文件”).
在目标文件系统上部署需要的系统数据。
使用
debootstrap
和cdebootstrap
之类的程序来协助处理这个过程(参见 第 9.10.4 节 “Chroot 系统”).在全功能系统模拟器下使用操作系统安装器。
在虚拟化环境下运行一个程序。
chroot 提供基本的虚拟化环境,足够能在里面编译程序,运行控制台应用,运行后台守护程序 daemon.
QEMU 提供跨平台的 CPU 模拟器.
QEMU 和 KVM 通过 hardware-assisted virtualization硬件辅助虚拟化来提供全功能系统的模拟.
VirtualBox 可以在 i386 和 amd64 上,使用或者不使用 hardware-assisted virtualization硬件辅助虚拟化来提供全功能系统模拟.
9.10.3. 挂载虚拟磁盘映像文件
对于原始磁盘映像文件,参见 第 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) 使用 “ |
9.10.4. Chroot 系统
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 是如何按下面的方式创建的。
拷贝本地配置 (
"/etc/hosts
“,"/etc/hostname
“,"/etc/resolv.conf
“)挂载 “
/proc
“ 文件系统挂载 “
/dev/pts
“ 文件系统创建 “
/usr/sbin/policy-rc.d
“ 的过程,总是 101 退出运行 “
chroot /sid-root bin/bash -c 'exec -a -bash bin/bash'
“
注意 | |
---|---|
一些在 chroot 下的程序,需要访问比根源系统上的 |
注意 | |
---|---|
“ |
提示 | |
---|---|
专用的 chroot 软件包 |
提示 | |
---|---|
类似的 |
9.10.5. 多桌面系统
我建议在 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) 中查看。
提示 | |
---|---|
在虚拟化下运行 Ubuntu 和 Fedora 之类的其它 GNU/Linux 发行版,是一个不错的学习其配置技巧的方法。其它专有操作系统也可以在这个 GNU/Linux 虚拟化下很好的运行。 |