目录
这里,描述配置和管理系统的基本技巧,大部分在控制台操作。
对通过不可靠或断断续续的连接访问远程主机的人们而言,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
窗口和所有在活动运行的程序.
提示 | |
---|---|
对于拨号或者按包计费的网络连接,你可以通过 |
在 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).
许多程序在"/var/log/
" 目录下记录它们的活动.
内核日志后台守护进程(daemon): klogd(8)
系统日志后台守护进程(daemon): rsyslogd(8)
这里是主要的日志分析软件 ("~Gsecurity::log-analyzer
" 在
aptitude(8)
中).
表 9.3. 系统日志分析软件列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
logwatch
|
V:19, I:21 | 2189 | 用 Perl 写的日志分析软件,有好的输出 |
fail2ban
|
V:92, I:103 | 1253 | 禁用造成多个认证错误的 IP |
analog
|
V:5, I:129 | 3529 | web 服务器日志分析 |
awstats
|
V:12, I:20 | 6588 | 强大和特性全面的 web 服务器日志分析 |
sarg
|
V:6, I:6 | 432 | 生成 squid 分析报告 |
pflogsumm
|
V:1, I:4 | 110 | Postfix 日志条目概要 |
syslog-summary
|
V:1, I:5 | 30 | 总结 syslog 日志文件内容 |
fwlogwatch
|
V:0, I:0 | 474 | 防火墙日志分析软件 |
squidview
|
V:0, I:2 | 188 | 监控和分析 squid access.log 文件 |
swatch
|
V:0, I:1 | 112 | 有正则表达式、高亮和曲线的日志文件查看器 |
crm114
|
V:0, I:1 | 1099 | Controllable Regex Mutilator 和垃圾邮件过滤 (CRM114) |
icmpinfo
|
V:0, I:1 | 39 | 解释 ICMP 信息 |
注意 | |
---|---|
CRM114 提供语言架构来写模糊 过滤器,使用了 TRE 正则表达式库 。它主要在垃圾邮件过滤器中使用,但也能够用于日志分析。 |
简单地使用 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)
和 " |
尽管例如 more(1) 和 less(1) 这样的分页程序(参见 第 1.4.5 节 “分页程序”)和用于高亮和格式的自定义工具(参见 第 11.1.8 节 “高亮并格式化纯文本数据”)可以漂亮地显示文本数据,但通用的编辑器 (参见 第 1.4.6 节 “文本编辑器”)是用途最广的,且可定制性最高。
提示 | |
---|---|
对于
vim(1)
和它的分页模式别名
view(1),“ |
“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 格式。 |
大部分现代终端的 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}"
在交互式的环境下,命令的输出带颜色,能够给检查命令的输出带来便利。
我在我的"~/.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
" 代替.
提示 | |
---|---|
在交互式的环境中,通过" |
你能够记录编辑器复杂的重复操作动作。
对于 Vim,请按下面操作。
"qa
": 开始记录输入字符到有名字的寄存器 "a
".
… 编辑器操作
"q
": 结束记录输入的字符。
"@a
":执行寄存器 "a
的内容".
对于 Emacs, 请按下面操作。
"C-x (
": 开始定义一个键盘宏.
… 编辑器操作
"C-x )
":结束定义一个键盘宏.
"C-x e
": 执行一个键盘宏.
有少量方法可以记录 X 应用程序的图像,包括xterm
显示。
表 9.5. 图形图像处理工具列表
软件包 | 流行度 | 大小 | 命令 |
---|---|---|---|
xbase-clients
|
I:76 | 46 | xwd(1) |
gimp
|
V:97, I:509 | 16255 | GUI 菜单 |
imagemagick
|
V:154, I:544 | 191 | import(1) |
scrot
|
V:7, I:84 | 50 | scrot(1) |
有特定的工具可以通过 DVCS 系统的帮助来记录配置文件的变更。
表 9.6. 在 VCS 中记录配置历史的软件包
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
etckeeper
|
V:22, I:26 | 151 | 使用 Git(默认)、Mercurial 或 Bazaar(新)来保存配置文件和它们的元数据 |
changetrack
|
V:0, I:0 | 62 | 使用 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.7. 监控和控制程序活动工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
coreutils
|
V:876, I:999 | 14642 | nice(1): 用指定的调度优先权运行一个程序 |
bsdutils
|
V:846, I:999 | 238 | renice(1): 调整一个目前在运行的进程的调度优先权值 |
procps
|
V:800, I:999 | 690 |
"/proc " 文件系统工具:
ps(1),
top(1),
kill(1),
watch(1),
…
|
psmisc
|
V:590, I:974 | 588 |
"/proc " 文件系统工具:
killall(1),
fuser(1),
peekfd(1),
pstree(1)
|
time
|
V:43, I:842 | 81 | time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用 |
sysstat
|
V:95, I:113 | 1332 | sar(1), iostat(1), mpstat(1), …: linux 系统性能工具 |
isag
|
V:0, I:4 | 106 | sysstat 的交互式的系统活动图 |
lsof
|
V:361, I:944 | 440 | lsof(8):
使用 "-p " 选项列出被一个系统进程打开的文件
|
strace
|
V:23, I:165 | 1223 | strace(1):跟踪系统调用和信号 |
ltrace
|
V:1, I:23 | 323 | ltrace(1): 跟踪库调用 |
xtrace
|
V:0, I:1 | 336 | xtrace(1):跟踪 X11 客户端和服务器端之间的通信 |
powertop
|
V:6, I:229 | 563 | powertop(1):系统能耗使用信息 |
cron
|
V:874, I:997 | 194 | 根据 cron(8) 后台守护进程(daemon)的调度运行一个进程 |
anacron
|
V:452, I:539 | 62 | 用于非整天 24 小时运行系统的命令计划,类 cron |
at
|
V:500, I:850 | 145 | at(1) 或 batch(1): 在一个特定的时间运行任务或在某一系统负载下运行 |
提示 | |
---|---|
|
显示 命令调用进程的时间消耗。
# time some_command >/dev/null real 0m0.035s # 执行时间 (占用的真实时间) user 0m0.000s # 用户模式时间 sys 0m0.020s # 内核模式时间
进程的调度优先级是被一个进程优先级值控制。
# nice -19 top # 非常优先 # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # 非常快
在某些情况下,极端的进程优先级值会对系统造成伤害。小心使用这个命令。
在 Debian 系统上的 ps(1) 命令同时支持 BSD 和 SystemV 特征,有助于识别静态的进程活动。
对于僵尸(死了的)子进程,你能够通过 "PPID
" 字段的父进程 ID 来杀死它们。
pstree(1) 命令显示进程树。
Debian 系统上的 top(1) 拥有丰富的特征,有助于识别进程有趣的动态行为。
它是一个交互式的全屏程序。你可以通过按"h"键来得到它的使用帮助,按"q"键来终止该程序。
你能够通过一个进程 ID(PID)来列出该进程所有打开的文件,例如,PID 为 1 的进程,使用下面的方式。
$ sudo lsof -p 1
PID=1 通常用于 init
程序.
你能够跟踪程序活动,使用strace(1), ltrace(1), xtrace(1) 来跟踪系统调用和信号、库调用、X11 客户端和服务器端之间的通信。
跟踪 ls
命令的系统调用。
$ sudo strace ls
你可以通过
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
通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式"*.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 节 “查找文件的语法”.
对于 命令行界面(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 菜单项,需要在 |
提示 | |
---|---|
相似地,如果在这些基准目录下的 |
提示 | |
---|---|
相似地,如果在 |
一些程序会被另一个程序自动启动。下面是自定义该过程的方法。
应用程序配置菜单:
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(8)
系统(参见 第 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
使用 kill(1) 通过进程 ID 来杀死(发送一个信号)一个进程。
使用 killall(1) 或 pkill(1) 通过进程命令的名字或其它属性来做同样的事情。
使用 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 账户定时运行,把这类脚本放入 " |
内核编译选项 "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 终端等,你能够通过向 " |
你可以通过下面的方法检查谁登录在系统里。
who(1) 显示谁登录在系统里面。
w(1) 显示谁登录在系统里面,他们在做什么。
last(1) 显示用户最后登录的列表。
lastb(1) 显示用户最后错误登录的列表。
提示 | |
---|---|
" |
对于 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:170, I:992 | 1220 | Linux PCI 工具: lspci(8) |
usbutils
|
V:107, I:864 | 707 | Linux USB 工具: lsusb(8) |
pcmciautils
|
V:24, I:59 | 121 | Linux PCMCIA 工具: pccardctl(8) |
scsitools
|
V:0, I:4 | 351 | SCSI 硬件管理工具集: lsscsi(8) |
procinfo
|
V:1, I:17 | 183 |
从 "/proc ":
lsdev(8)
获得系统信息
|
lshw
|
V:10, I:84 | 671 | 硬件配置信息: lshw(1) |
discover
|
V:43, I:921 | 122 | 硬件识别系统: discover(8) |
像 GNOME 和 KDE 这类现代图形桌面系统,虽然大部分硬件的配置都能够通过相应的图形配置工具来管理,但知道一些配置它们的基础方式,也是一个好的主意。
表 9.13. 硬件配置工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
console-setup
|
V:456, I:926 | 437 | Linux 控制台字体和键盘表工具 |
x11-xserver-utils
|
V:372, I:591 | 479 | X 服务端工具: xset(1), xmodmap(1) |
acpid
|
V:527, I:914 | 137 | 管理高级可配置和电源接口(ACPI)事件分发的后台守护进程(daemon) |
acpi
|
V:42, I:880 | 71 | 显示 ACPI 设备信息的工具 |
apmd
|
V:0, I:11 | 94 | 管理高级电源管理(APM)事件分发的后台守护进程(daemon) |
sleepd
|
V:0, I:0 | 77 | 在笔记本空闲时,使其进入休眠状态的后台守护进程(daemon) |
hdparm
|
V:239, I:398 | 236 | 硬盘访问优化 (参见 第 9.5.9 节 “硬盘优化”) |
smartmontools
|
V:107, I:195 | 1716 | 使用 S.M.A.R.T. 控制和监控存储系统 |
setserial
|
V:5, I:12 | 109 | 串口管理工具集 |
memtest86+
|
V:1, I:40 | 2391 | 内存硬件管理工具集 |
scsitools
|
V:0, I:4 | 351 | SCSI 硬件管理工具集 |
setcd
|
V:0, I:1 | 28 | 光驱访问优化 |
big-cursor
|
I:0 | 27 | X 系统的大鼠标光标 |
提示 | |
---|---|
现代系统的 CPU 频率调整功能,是由内核模块 |
下面设置系统的硬件时间为: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
包
提示 | |
---|---|
在 |
有几个组件可以用来配置字符控制台和 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
” 中最通用的。
用于现在的 Linux 的声卡设备驱动程序由 高级 Linux 声音体系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了兼容之前的 开放声音系统(Open Sound System,OSS)的模拟模式。
提示 | |
---|---|
使用 “ |
提示 | |
---|---|
如果你无法听到声音,那你的扬声器可能连接到了一个静音输出。现代的声音系统有许多输出。 |
应用软件可被配置为不仅直接访问声音设备,也可以通过一些标准化声音服务器系统来访问它们。
表 9.14. 声音软件包
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
alsa-base
|
I:491 | 83 | ALSA 驱动程序配置文件 |
alsa-utils
|
V:383, I:536 | 2115 | 配置和使用 ALSA 的工具 |
oss-compat
|
V:5, I:49 | 7 |
在 ALSA 下兼容 OSS,预防 “/dev/dsp not found ” 错误
|
jackd
|
V:3, I:27 | 32 | JACK Audio Connection Kit. (JACK) 服务器(低延迟) |
libjack0
|
V:1, I:21 | 135 | JACK Audio Connection Kit. (JACK) 库(低延迟) |
nas
|
V:0, I:0 | 235 | 网络音频系统(Network Audio System,NAS)服务器 |
libaudio2
|
V:61, I:566 | 161 | 网络音频系统(Network Audio System,NAS)库 |
pulseaudio
|
V:353, I:495 | 5526 | PulseAudio 服务器,替代 ESD |
libpulse0
|
V:253, I:655 | 937 | PulseAudio 客户端库,替代 ESD |
libgstreamer1.0-0
|
V:222, I:468 | 4741 | GStreamer:GNOME 声音引擎 |
libphonon4
|
I:228 | 588 | Phonon:KDE 声音引擎 |
每个流行的桌面环境通常都有一个通用的声音引擎。每个被应用程序使用的声音引擎都可以选择连接到不同的声音服务器。
关闭屏幕保护,使用下面的命令。
表 9.15. 关闭屏幕保护命令列表
环境 | 命令 |
---|---|
Linux 控制台 |
setterm -powersave off
|
X 窗口(关闭屏幕保护) |
xset s off
|
X 窗口(关闭 dpms) |
xset -dpms
|
X 窗口(屏幕保护 GUI 配置) |
xscreensaver-command -prefs
|
可以把电脑的扬声器拔掉来关闭蜂鸣声。把 pcspkr
内核模块删除,也可以做到这点。
bash(1) 用到的 readline(3) 程序,当遇到告警字符(ASCII=7)时,将会发生。下面的操作将阻止发生。
$ echo "set bell-style none">> ~/.inputrc
对你来说,这里有两种可用的方法来得到内存的使用情况。
“/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) |
糟糕的系统维护可能会暴露你的系统,导致它被外部非法使用。
对于系统安全性和完整性的检查,你需要从下面这些方面开始。
debsums
软件包,参见
debsums(1)
和 第 2.5.2 节 “顶层 "Release" 文件及真实性”。
chkrootkit
软件包,参见
chkrootkit(1)。
clamav
软件包家族,参见
clamscan(1)
和
freshclam(1)。
表 9.17. 用于系统安全性和完整性检查的工具
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
logcheck
|
V:12, I:15 | 216 | 后台守护进程(daemon),将系统日志文件中的异常通过邮件发送给管理员 |
debsums
|
V:6, I:37 | 118 | 实用程序,使用 MD5 校验码对已安装软件包的文件进行校验 |
chkrootkit
|
V:8, I:29 | 948 | rootkit 检测软件 |
clamav
|
V:18, I:71 | 873 | Unix 的反病毒实用程序 —— 命令行界面 |
tiger
|
V:3, I:4 | 2581 | 报告系统安全漏洞 |
tripwire
|
V:3, I:4 | 11471 | 文件和目录完整性检测软件 |
john
|
V:3, I:14 | 448 | 先进的密码破解工具 |
aide
|
V:1, I:2 | 1981 | 高级入侵环境检测 —— 静态二进制 |
integrit
|
V:0, I:0 | 440 | 文件完整性验证程序 |
crack
|
V:0, I:0 | 128 | 密码猜测程序 |
下面是一个简单的脚本,用来检测典型的所有人可写的错误文件权限。
# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
小心 | |
---|---|
由于 |
使用 live CD 或 debian-installer CD 以救援模式启动你的系统,可以让你简单地重新配置你的启动设备的数据存储。
硬盘空间的使用情况可以通过 mount
、coreutils
和
xdu
软件包提供的程序来评估:
mount(8) 显示所有挂载的文件系统(= 磁盘).
df(1) 报告文件系统使用的硬盘空间。
du(1) 报告目录树使用的硬盘空间。
提示 | |
---|---|
你可以将
du(8)
的输出传输给
xdu(1x),来使用它的图形交互式演示,例如
“ |
对于硬盘分区配置,尽管 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:876, I:999 | 3552 | 不支持 | 多种系统工具,包含 fdisk(8) 和 cfdisk(8) |
parted
|
V:327, I:529 | 279 | 支持 | GNU Parted,硬盘分区调整程序 |
gparted
|
V:26, I:147 | 6519 | 支持 |
基于 libparted 的 GNOME 分区编辑程序
|
gdisk
|
V:17, I:453 | 746 | 支持 | 用于 GPT 硬盘的分区编辑程序 |
kpartx
|
V:13, I:28 | 76 | 支持 | 为分区建立设备映射的程序 |
小心 | |
---|---|
尽管 parted(8) 声称也能用来创建和调整文件系统,但使用维护最好的专门工具来做这些事会更为安全,例如 mkfs(8)(mkfs.msdos(8)、mkfs.ext2(8)、mkfs.ext3(8)、mkfs.ext4(8)……)和 resize2fs(8)。 |
注意 | |
---|---|
为了在 GPT 和 MBR
之间切换,你需要直接删除开头的几个块中的内容(参见 第 9.7.6 节 “清空文件内容”)并使用
“ |
尽管重新配置你的分区或可移动存储介质的激活顺序可能会给分区产生不同的名字,但你可以使用同一个 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 系统”。 |
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(8)
和
fsck(8)
命令是由 e2fsprogs
包提供的,是各种文件系统相关程序的前端。(mkfs.fstype
和
fsck.fstype
). 对于 ext4
文件系统,它们是
mkfs.ext4(8)
和
fsck.ext4(8)
(它们被符号链接到
mke2fs(8)
和
e2fsck(8)).
Linux 支持的每一个文件系统,有相似的命令。
表 9.19. 文件系统管理包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
e2fsprogs
|
V:428, I:999 | 3851 | ext2/ext3/ext4 文件系统工具 |
reiserfsprogs
|
V:5, I:22 | 882 | Reiserfs 文件系统工具 |
dosfstools
|
V:80, I:574 | 236 | FAT 文件系统工具. (Microsoft: MS-DOS, Windows) |
xfsprogs
|
V:19, I:78 | 3748 | XFS 文件系统工具. (SGI: IRIX) |
ntfs-3g
|
V:185, I:569 | 1335 | NTFS 文件系统工具. (Microsoft: Windows NT, …) |
jfsutils
|
V:1, I:13 | 1533 | JFS 文件系统工具. (IBM: AIX, OS/2) |
reiser4progs
|
V:0, I:5 | 1657 | Reiser4 文件系统工具 |
hfsprogs
|
V:0, I:9 | 295 | HFS 和 HFS Plus 文件系统工具. (Apple: Mac OS) |
btrfs-tools
|
V:12, I:40 | 24 | Btrfs 文件系统工具 |
zerofree
|
V:2, I:47 | 25 | 把 ext2/3/4 文件系统上空闲块设置为零的程序 |
提示 | |
---|---|
Ext4 文件系统是 Linux 系统上默认的文件系统,强烈推荐使用这个文件系统,除非你有特殊的理由不使用。 |
提示 | |
---|---|
Btrfs 文件系统在 Linux 内核 3.2(Debian
|
警告 | |
---|---|
在得到当前内核空间的 fsck(8) 特征和引导管理器支持前,你的关键数据不应当使用 Btrfs 文件系统。 |
提示 | |
---|---|
一些工具可以在没有 Linux 内核支持的情况下访问文件系统(参见 第 9.7.2 节 “不挂载磁盘操作文件”). |
mkfs(8) 在 Linux 系统上创建文件系统。fsck(8) 命令在 Linux系统上提供文件系统完整性检查和修复功能。
在文件系统创建后,Debian 现在默认不周期性的运行 fsck
。
小心 | |
---|---|
在已经挂载的文件系统上运行 |
提示 | |
---|---|
在 " |
提示 | |
---|---|
从启动脚本里面运行的
fsck(8)
命令结果,可以在 " |
“/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 节 “第二阶段:引载加载程序”),比如说
" |
一个文件系统的特性可以使用 tune2fs(8) 命令通过超级块来优化。
执行 “sudo tune2fs -l /dev/hda1
” 可以显示
“/dev/hda1
” 上的文件系统超级块内容。
执行"sudo tune2fs -c 50 /dev/hda1
" 改变
"/dev/hda1
" 文件系统的检查(在启动时执行 fsck
)频率为每
50 次启动.
执行 “sudo tune2fs -j /dev/hda1
” 会给文件系统添加日志功能,即
“/dev/hda1
” 的文件系统从 ext2 转换为
ext3。(对未挂载的文件系统这么做。)
执行 “sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1
&& fsck -pf /dev/hda1
” 在 “/dev/hda1
”
上将它从 ext3 转换为 ext4。(对未挂载的系统这么做。)
警告 | |
---|---|
在你折腾硬盘配置之前,请检查你的硬件并阅读 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 光盘。
固态硬盘(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 分钟会导致遇到电源故障时数据容易丢失。 |
你可以使用兼容 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)可以使用 |
应用程序一般在临时存储目录 “/tmp
” 下建立临时文件。如果 “/tmp
”
没有足够的空间,你可以通过 $TMPDIR
变量来为程序指定临时存储目录。
在安装时创建在 Logical Volume Manager 逻辑卷管理(LVM) (Linux 特性) 上的分区,它们可以容易的通过合并扩展或删除扩展的方式改变大小,而不需要在多个存储设备上进行大量的重新配置。
如果你有一个空的分区(例如 “/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 节 “挂载磁盘映像文件”)。实际的硬盘使用量会随着实际存储数据的增加而增加。 |
如果你在另一个分区里有一个带有可用空间的空目录(例如 “/path/to/emp-dir
”),你可以通过带有
“--bind
” 选项的 mount(8),将它挂载到一个你需要更多空间的目录(例如
“work-dir
”)。
$ sudo mount --bind /path/to/emp-dir work-dir
提示 | |
---|---|
这是一个已启用的方法。如果可能的话,使用第 9.5.15 节 “通过 “mount --bind” 挂载另一个目录来扩展可用存储空间” 替代它。 |
如果你在另一个分区里有一个带有可用空间的空目录(例如 “/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
警告 | |
---|---|
别对由系统管理的目录(例如 “ |
小心 | |
---|---|
一些软件可能会由于“链接到目录”而无法正常运行。 |
如果你在另一个分区表中有可用的空间(例如,“/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
”。
我们在这里讨论磁盘影响的操作。
一个未挂载设备(例如,第二个 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
”。
磁盘映像文件 “disk.img
” 可以通过下列方式写入到一个匹配大小的未挂载设备(例如,第二个 SCSI 设备
“/dev/sdb
”。
# dd if=disk.img of=/dev/sdb
相似地,硬盘分区映像文件 “partition.img
” 可以通过下列方式写入到匹配大小的未挂载分区(例如,第二个
SCSI 设备的第一个分区 “/dev/sdb1
”)。
# dd if=partition.img of=/dev/sdb1
可以使用循环设备通过下列方式挂载和卸载包含单个分区映像的磁盘映像
“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
使用下面的方式,一个磁盘映像文件 "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
按下面的方式使用 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。 |
提示 | |
---|---|
对于由 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)
之前在终端里面用 " |
如果 "cd.iso
" 包含一个 ISO9660 镜像, 下面的命令手工挂载这个文件到
"/cdrom
".
# mount -t iso9660 -o ro,loop cd.iso /cdrom
提示 | |
---|---|
现代桌面系统能够自动挂载可移动介质,如按 ISO9660 格式化的 CD(参见 第 10.1.7 节 “可移动存储设备”). |
这里,我们讨论直接操作存储介质上的二进制数据。
最基础的查看二进制数据的方法是使用 "od -t x1
" 命令。
表 9.20. 查看和修改二进制数据的软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
coreutils
|
V:876, I:999 | 14642 | basic package which has od(1) to dump files (HEX, ASCII, OCTAL, …) |
bsdmainutils
|
V:860, I:998 | 557 | utility package which has hd(1) to dump files (HEX, ASCII, OCTAL, …) |
hexedit
|
V:1, I:11 | 61 | 二进制浏览和编辑器(HEX, ASCII) |
bless
|
V:0, I:5 | 973 | 全功能的十六进制编辑器(GNOME) |
okteta
|
V:2, I:23 | 382 | 全功能的十六进制编辑器(KDE4) |
ncurses-hexedit
|
V:0, I:2 | 126 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC) |
beav
|
V:0, I:1 | 121 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC, OCTAL, ...) |
提示 | |
---|---|
HEX is used as an acronym for hexadecimal format with radix 16. OCTAL is for octal format with radix 8. ASCII is for American Standard Code for Information Interchange, i.e., normal English text code. EBCDIC is for Extended Binary Coded Decimal Interchange Code used on IBM mainframe operating systems. |
Software RAID systems offered by the Linux kernel provide data redundancy in the kernel filesystem level to achieve high levels of storage reliability.
There are tools to add data redundancy to files in application program level to achieve high levels of storage reliability, too.
表 9.22. List of tools to add data redundancy to files
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
par2
|
V:2, I:12 | 231 | Parity Archive Volume Set, for checking and repair of files |
dvdisaster
|
V:0, I:2 | 1481 | data loss/scratch/aging protection for CD/DVD media |
dvbackup
|
V:0, I:0 | 412 | backup tool using MiniDV camcorders (providing rsbep(1)) |
vdmfec
|
V:0, I:0 | 88 | recover lost blocks using Forward Error Correction |
There are tools for data file recovery and forensic analysis.
表 9.23. List of packages for data file recovery and forensic analysis
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
testdisk
|
V:4, I:38 | 1344 | utilities for partition scan and disk recovery |
magicrescue
|
V:0, I:3 | 220 | utility to recover files by looking for magic bytes |
scalpel
|
V:0, I:4 | 82 | frugal, high performance file carver |
myrescue
|
V:0, I:2 | 38 | rescue data from damaged harddisks |
extundelete
|
V:1, I:10 | 140 | utility to undelete files on the ext3/4 filesystem |
ext4magic
|
V:0, I:2 | 232 | utility to undelete files on the ext3/4 filesystem |
ext3grep
|
V:0, I:3 | 278 | tool to help recover deleted files on the ext3 filesystem |
scrounge-ntfs
|
V:0, I:2 | 45 | data recovery program for NTFS filesystems |
gzrt
|
V:0, I:0 | 57 | gzip recovery toolkit |
sleuthkit
|
V:0, I:5 | 1114 | tools for forensics analysis. (Sleuthkit) |
autopsy
|
V:0, I:2 | 1021 | graphical interface to SleuthKit |
foremost
|
V:0, I:6 | 123 | forensics application to recover data |
guymager
|
V:0, I:0 | 1104 | forensic imaging tool based on Qt |
dcfldd
|
V:0, I:5 | 90 |
enhanced version of dd for forensics and security
|
提示 | |
---|---|
You can undelete files on the ext2 filesystem using
|
当一个文件太大而不能备份的时候,你应该在备份之前先把它分割为多个小于 2000MiB 的小文件,稍后再把这些小文件合并为初始的文件。
$ split -b 2000m large_file $ cat x* >large_file
小心 | |
---|---|
为了防止文件名冲突,请确保没有任何以 " |
为了清除诸如日志文件之类的文件的内容,不要用 rm(1) 命令去删除文件然后创建新的空文件,因为这个文件可能在命令执行的期间还在被使用。以下是清除文件内容的正确方法。
$ :>file_to_be_cleared
下面的命令创建样子文件或空文件。
$ 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
会被更新,而它的内容会被清零。
There are several ways to completely erase data from an entire hard disk
like device, e.g., USB memory stick at "/dev/sda
".
小心 | |
---|---|
在执行这里的命令之前,你应该用
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
"
等等设备上运行擦除命令来完全清除已经安装的系统。
Unused area on an hard disk (or USB memory stick),
e.g. "/dev/sdb1
" may still contain erased data themselves
since they are only unlinked from the filesystem. These can be cleaned by
overwriting them.
# 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
警告 | |
---|---|
This is usually good enough for your USB memory stick. But this is not perfect. Most parts of erased filenames and their attributes may be hidden and remain in the filesystem. |
即使你不小心删除了某个文件,只要这个文件仍然被一些应用程序所使用(读或者写),恢复此文件是可能的。
尝试下列例子
$ 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
有硬链接的文件,能够使用 "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
With physical access to your PC, anyone can easily gain root privilege and access all the files on your PC (see 第 4.7.4 节 “root 密码安全”). This means that login password system can not secure your private and sensitive data against possible theft of your PC. You must deploy data encryption technology to do it. Although GNU privacy guard (see 第 10.3 节 “数据安全基础”) can encrypt files, it takes some user efforts.
dm-crypt and eCryptfs facilitates automatic data encryption natively via Linux kernel modules with minimal user efforts.
表 9.24. 数据加密工具列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
cryptsetup
|
V:20, I:71 | 343 | utilities for encrypted block device (dm-crypt / LUKS) |
cryptmount
|
V:1, I:3 | 219 | utilities for encrypted block device (dm-crypt / LUKS) with focus on mount/unmount by normal users |
ecryptfs-utils
|
V:5, I:9 | 393 | utilities for encrypted stacked filesystem (eCryptfs) |
Dm-crypt is a cryptographic filesystem using device-mapper. Device-mapper maps one block device to another.
eCryptfs is another cryptographic filesystem using stacked filesystem. Stacked filesystem stacks itself on top of an existing directory of a mounted filesystem.
小心 | |
---|---|
Data encryption costs CPU time etc. Please weigh its benefits and costs. |
注意 | |
---|---|
Entire Debian system can be installed on a encrypted disk by the debian-installer (lenny or newer) using dm-crypt/LUKS and initramfs. |
提示 | |
---|---|
See 第 10.3 节 “数据安全基础” for user space encryption utility: GNU Privacy Guard. |
You can encrypt contents of removable mass devices, e.g. USB memory stick on
"/dev/sdx
", using dm-crypt/LUKS. You
simply format it as the following.
# 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
Then, it can be mounted just like normal one on to
"/media/<disk_label>
", except for asking password
(see 第 10.1.7 节 “可移动存储设备”) under modern desktop
environment, such as GNOME using
gnome-mount(1).
The difference is that every data written to it is encrypted. You may
alternatively format media in different filesystem, e.g., ext4 with
"mkfs.ext4 /dev/mapper/sdx1
".
注意 | |
---|---|
If you are really paranoid for the security of data, you may need to
overwrite multiple times (the " |
Let's assume that your original "/etc/fstab
" contains the
following.
/dev/sda7 swap sw 0 0
You can enable encrypted swap partition using dm-crypt by as the following.
# 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
An encrypted disk partition created with dm-crypt/LUKS on
"/dev/sdc5
" can be mounted onto "/mnt
"
as follows:
$ 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
You can encrypt files written under "~/Private/
"
automatically using eCryptfs and the
ecryptfs-utils
package.
Run
ecryptfs-setup-private(1)
and set up "~/Private/
" by following prompts.
Activate "~/Private/
" by running
ecryptfs-mount-private(1).
Move sensitive data files to "~/Private/
" and make
symlinks as needed.
Candidates: "~/.fetchmailrc
",
"~/.ssh/identity
", "~/.ssh/id_rsa
",
"~/.ssh/id_dsa
" and other files with
"go-rwx
"
Move sensitive data directories to a subdirectory in
"~/Private/
" and make symlinks as needed.
Candidates: "~/.gnupg
" and other directories with
"go-rwx
"
Create symlink from "~/Desktop/Private/
" to
"~/Private/
" for easier desktop operations.
Deactivate "~/Private/
" by running
ecryptfs-umount-private(1).
Activate "~/Private/
" by issuing
"ecryptfs-mount-private
" as you need encrypted data.
If you use your login password for wrapping encryption keys, you can automate mounting eCryptfs via PAM (Pluggable Authentication Modules).
Insert the following line just before "pam_permit.so
" in
"/etc/pam.d/common-auth
".
auth required pam_ecryptfs.so unwrap
Insert the following line just at the last line in
"/etc/pam.d/common-session
".
session optional pam_ecryptfs.so unwrap
Insert the following line at first active line in
"/etc/pam.d/common-password
".
password required pam_ecryptfs.so
这相当方便。
小心 | |
---|---|
If you use your login password for wrapping encryption keys, your encrypted data are as secure as your user login password (see 第 4.3 节 “好密码”). Unless you are careful to set up a strong password, your data is at risk when someone runs password cracking software after stealing your laptop (see 第 4.7.4 节 “root 密码安全”). |
对于支持的架构,Debian 使用软件包来分发模块化的 Linux内核.
Linux 内核 2.6/3.x 相对于 2.4,有少量值得注意的特征。
设备由 udev 系统创建(参见 第 3.3 节 “udev 系统”).
读写访问 IDE CD/DVD 设备,不再使用 ide-scsi
模块.
网络包过滤功能使用 iptables
内核模块.
Linux 版本从 2.6.39 跳到 3.0,不仅仅是一个主要的技术改变,也是第 20 个周年纪念日。
许多 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/*
")。
大部分普通程序编译时不需要内核头文件,如果你直接使用它们来编译,甚至会导致编译中断。在 Debian
系统上,普通程序编译依赖 libc6-dev
软件包 (由 glibc
源代码包创建)提供的,在"/usr/include/linux
" 和
"/usr/include/asm
" 里的头文件。
注意 | |
---|---|
对于编译一些内核相关的程序,比如说从外部源代码编译的内核模块和 automounter
后台守护(daemon)程序( |
Debian 有它自己的方式来编译内核和相关模块。
表 9.25. Debian 系统内核编译需要安装的主要软件包列表
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
build-essential
|
I:450 | 20 |
创建 Debian 软件包所必须的软件包: make , gcc , …
|
bzip2
|
V:251, I:931 | 84 | bz2 文件压缩和解压缩工具 |
libncurses5-dev
|
V:14, I:151 | 1027 | ncurses 开发者库和文档 |
git
|
V:246, I:413 | 27879 | git:Linux 内核使用的分布式版本控制系统 |
fakeroot
|
V:36, I:498 | 216 | 为非 root 用户创建软件包提供一个伪造的 root 环境 |
initramfs-tools
|
V:189, I:990 | 102 | 创建 initramfs 的工具(Debian 规范) |
dkms
|
V:70, I:214 | 282 | 动态内核模块支持 dynamic kernel module support (DKMS) (通用) |
devscripts
|
V:10, I:66 | 2055 | 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)动态内核模块支持 是一个新的分布式独立框架,被设计用来允许单个的内核模块在不改变整个内核的情况下升级。这可以用于维护内核代码树外部的模块。这也使你升级内核时,重新编译模块变得非常简单。 |
从上游内核源代码编译个性化的内核二进制包,你应当使用由它提供的 "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 Kernel Handbook: http://kernel-handbook.alioth.debian.org
硬件驱动是运行在目标系统上的代码。大部分硬件驱动现在是自由软件,已经包含在普通的 Debian 内核软件包里,放在
main
区域。
固件是加载在设备上的代码(比如说,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
软件包会有负面影响。
通过使用虚拟系统,我们能在单个机器上同时运行多个系统。
除了简单的 chroot 工具外,Debian上还有一些有关系统虚拟化及仿真的软件包。这些软件包能够帮你创建虚拟系统。
表 9.26. 虚拟化工具列表
参见维基百科 Comparison of platform virtual machines 来获得不同平台的虚拟化解决方案的详细比较信息。
注意 | |
---|---|
这里所描述的功能只在 |
注意 | |
---|---|
自从 |
典型的虚拟化工作流涉及以下几个步骤。
创建空文件系统 (目录树或磁盘映像)。
目录树可以通过 "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.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)
使用 " |
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 软件包 |
提示 | |
---|---|
类似的 |
我建议在 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) 中查看。