<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux&#124;系统管理&#124;WEB开发 &#187; lah</title>
	<atom:link href="http://blog.wgzhao.com/tag/lah/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.wgzhao.com</link>
	<description>关注Linux，系统管理，WEB开发以及开源世界</description>
	<lastBuildDate>Wed, 14 Jul 2010 08:00:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linux系统管理技术手册第十六章习题实践</title>
		<link>http://blog.wgzhao.com/2010/03/02/lah-chapter16-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2010/03/02/lah-chapter16-questions-key.html#comments</comments>
		<pubDate>Tue, 02 Mar 2010 08:18:15 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[nfs]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=2041</guid>
		<description><![CDATA[★ E16.1 研究您本地的NFS设置。使用了NFS吗？还是有别的不同解决方法？采取了自动安装方式吗？有什么样的权衡考虑？
A：以前在网站备份的时候使用过NFS，但是后来放弃了，主要是因为NFS在大I/O的情况下，容易出现崩溃的情况。当然因为挂载点少，所以自动安装方式就没有必要了，越简单，越安全。现在采取了rsync的方式，通过SSH隧道传输数据，相比NFS要稳定和安全。
★★ E16.2 mountd,nfsd和portmap之间有什么关系？NFS对portmap的依赖在安全上意味着什么？
A：nfsd是NFS的运行守护进程。mountd的合法请求最终会交给nfsd来处理。而portmap负责分配客户端/服务器的通讯端口。portmap意味着SunRPC，而RPC这个东西似乎属于臭名昭著的东西，安全性太差，容易遭受攻击。

★★ E16.4 您的上司要您把/usr和/usr/local 通过NFS导出。已知信息和要求如下：

也因为办公室的行政因素，您只想让您的部门(192.168.123.0/24)能够使用这些被导出的文件系统。为了实现这些配置，必须要向什么文件加入什么样的配置行？
列出让mountd和nfsd认出这些新被共享的文件系统所需要的步骤。在不安装的情况下，您会怎样核实那些目录已经共享出去了？
概述让您的本地子网使用/mnt/usr和/mnt/usr/local自动安装被导出的文件系统应该采取的策略。

A：要共享上述目录，需要在/etc/exports文件里，加入类似下面两行

/usr    192.168.123.0/24&#40;ro,rsync,root_squash&#41;
/usr/local 192.168.123.0/24&#40;ro,rsync,root_squash&#41;

加入后，执行exportfs -a让改动起作用。在服务器端执行nfsstat -s /nfsstat-c/nfsstat -m 可以分别现实服务端，客户端，挂载情况的显示。
策略和如何使用这些导出目录已经网络传输情况都有关系。不过就我遇到的情况以及自身的经历，对于NFS的可靠性，我表示怀疑。特别是在大I/0或者深层目录复制的情况下，NFS表现的非常脆弱。
所以，对于flickr,facebook这样的大型网站，采取NFS的方式架构，我真的很想知道他们是更新了NFS的特性，还是精确采用了哪些参数，而从使得NFS很健壮的运行。
]]></description>
			<content:encoded><![CDATA[<p>★ E16.1 研究您本地的NFS设置。使用了NFS吗？还是有别的不同解决方法？采取了自动安装方式吗？有什么样的权衡考虑？<br />
A：以前在网站备份的时候使用过NFS，但是后来放弃了，主要是因为NFS在大I/O的情况下，容易出现崩溃的情况。当然因为挂载点少，所以自动安装方式就没有必要了，越简单，越安全。现在采取了rsync的方式，通过SSH隧道传输数据，相比NFS要稳定和安全。</p>
<p>★★ E16.2 mountd,nfsd和portmap之间有什么关系？NFS对portmap的依赖在安全上意味着什么？<br />
A：nfsd是NFS的运行守护进程。mountd的合法请求最终会交给nfsd来处理。而portmap负责分配客户端/服务器的通讯端口。portmap意味着SunRPC，而RPC这个东西似乎属于臭名昭著的东西，安全性太差，容易遭受攻击。</p>
<p><span id="more-2041"></span></p>
<p>★★ E16.4 您的上司要您把/usr和/usr/local 通过NFS导出。已知信息和要求如下：</p>
<ul>
<li>也因为办公室的行政因素，您只想让您的部门(192.168.123.0/24)能够使用这些被导出的文件系统。为了实现这些配置，必须要向什么文件加入什么样的配置行？</li>
<li>列出让mountd和nfsd认出这些新被共享的文件系统所需要的步骤。在不安装的情况下，您会怎样核实那些目录已经共享出去了？</li>
<li>概述让您的本地子网使用/mnt/usr和/mnt/usr/local自动安装被导出的文件系统应该采取的策略。</li>
</ul>
<p>A：要共享上述目录，需要在/etc/exports文件里，加入类似下面两行</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr    192.168.123.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>ro,rsync,root_squash<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> 192.168.123.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>ro,rsync,root_squash<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>加入后，执行exportfs -a让改动起作用。在服务器端执行nfsstat -s /nfsstat-c/nfsstat -m 可以分别现实服务端，客户端，挂载情况的显示。<br />
策略和如何使用这些导出目录已经网络传输情况都有关系。不过就我遇到的情况以及自身的经历，对于NFS的可靠性，我表示怀疑。特别是在大I/0或者深层目录复制的情况下，NFS表现的非常脆弱。</p>
<p>所以，对于flickr,facebook这样的大型网站，采取NFS的方式架构，我真的很想知道他们是更新了NFS的特性，还是精确采用了哪些参数，而从使得NFS很健壮的运行。</p>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2010/03/02/lah-chapter16-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2010/03/02/lah-chapter16-questions-key.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第十三章系统实践</title>
		<link>http://blog.wgzhao.com/2010/02/25/lah-chapter13-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2010/02/25/lah-chapter13-questions-key.html#comments</comments>
		<pubDate>Thu, 25 Feb 2010 07:51:12 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[route]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=2038</guid>
		<description><![CDATA[E13.1 研究Linux的route命令，简要介绍它的功能。使用route命令，怎样做到：

加一条通过接口 eth1 到 128.138.129.1 的默认路由；
删除到 128.138.129.1 的默认路由；
判断一个程序 (routed)或者一个ICMP重定向是否加入了一条路由（注意，这个方法也能用netstat -rn 命令的输出做到）。

A：route的主要目的是现实和修改内核IP路由表信息。参数比较多。

route add default gw 128.138.129.1 eth1
route default default gw 128.138.129.1
我的网络环境没有ICMP重定向，所以也看不到是否增加了路由信息。

E13.2 比较静态路由和动态路由，举出彼此的优缺点。分别介绍两者使用的几种场合，说明原因。
A：静态路由简单，客户端配置方便，路由快。动态路由，对客户端透明，网络拓扑修改后，客户端无须改动。对于小型网络，只有一条通往网络之外的路径，那么静态路由很适合。如果网络过于复杂，则应该考虑静态路由。
其实，这些都是废话，用动态还是静态，关键还是看投入的成本是否能够产出预期的收益，那种能满足你的收益，哪种就适合你。
E13.3 考虑下面的netstat -rn 输出。介绍各条路由，推断网络的设置。10.0.0.0 还是 10.1.1.0 更靠近 Internet？每条路由是由哪个进程加的？

Destination     Gateway         Genmask         Flags   MSS Window [...]]]></description>
			<content:encoded><![CDATA[<p>E13.1 研究Linux的route命令，简要介绍它的功能。使用route命令，怎样做到：</p>
<ol>
<li>加一条通过接口 eth1 到 128.138.129.1 的默认路由；</li>
<li>删除到 128.138.129.1 的默认路由；</li>
<li>判断一个程序 (routed)或者一个ICMP重定向是否加入了一条路由（注意，这个方法也能用netstat -rn 命令的输出做到）。</li>
</ol>
<p>A：route的主要目的是现实和修改内核IP路由表信息。参数比较多。</p>
<ol>
<li>route add default gw 128.138.129.1 eth1</li>
<li>route default default gw 128.138.129.1</li>
<li>我的网络环境没有ICMP重定向，所以也看不到是否增加了路由信息。</li>
</ol>
<p>E13.2 比较静态路由和动态路由，举出彼此的优缺点。分别介绍两者使用的几种场合，说明原因。</p>
<p>A：静态路由简单，客户端配置方便，路由快。动态路由，对客户端透明，网络拓扑修改后，客户端无须改动。对于小型网络，只有一条通往网络之外的路径，那么静态路由很适合。如果网络过于复杂，则应该考虑静态路由。</p>
<p>其实，这些都是废话，用动态还是静态，关键还是看投入的成本是否能够产出预期的收益，那种能满足你的收益，哪种就适合你。</p>
<p>E13.3 考虑下面的netstat -rn 输出。介绍各条路由，推断网络的设置。10.0.0.0 还是 10.1.1.0 更靠近 Internet？每条路由是由哪个进程加的？</p>
<pre>
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0           0.0.0.0         255.255.255.0   U            40          0       eth1
10.1.1.0           0.0.0.0         255.255.0.0       U            40          0       eth0
0.0.0.0            10.0.0.1         0.0.0.0              UG          40          0       eth1
</pre>
<p>A：这台机器的两个网卡分别接入到了两个网络。其中eth1更靠近Internet的出口。如果Linux配置恰当的话，这些路由信息在网络启动的时候，会自动加入到内核里，只需要分别配置/etc/sysconfig/network-scripts/{ifcfg-eth0,ifcfg-eth1}和/etc/sysconfig/network配置文件（针对R系统）。</p>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2010/02/25/lah-chapter13-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2010/02/25/lah-chapter13-questions-key.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>linux系统管理技术手册第十二章系统实践</title>
		<link>http://blog.wgzhao.com/2010/02/24/lah-chapter12-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2010/02/24/lah-chapter12-questions-key.html#comments</comments>
		<pubDate>Wed, 24 Feb 2010 13:52:31 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=2034</guid>
		<description><![CDATA[E12.1 听从（也就是服从）ICMP重定向包的指挥，如何会让一个未经授权的用户威胁网络的安全？
A：主要是会获得一个窃听网络数据的可能，更详细的内容，可以参考这篇文档，说的比较详细。
E12.2 网络链路的MTU是什么？如果给定的MTU设得太高，会发生什么问题？太低呢？
A：MTU（Maximum Transfer Unit)，最大传输单元，用来定义网络上传输包的最大值。以太网一般是1500bytes。太高会导致丢包，太低则导致分片，都会产生网络传输问题。

★ E12.3 说明划分子网的概念，解释它有用的原因。什么是网络掩码？网络掩码和IP地址的网络部分和主机部分的划分有什么关系？
A：这些都是属于计算机网络的基本概念，我这里都不抄书了，看看维基百科的解释吧。
★ E12.4 网络134.122.0.0/16已经细分成了几个/19网络。

有多少个/19的网络？列出他们。他们的网络掩码是多少？
每一个子网上有多少台主机？
IP地址134.122.67.124属于哪个子网？
每个网络的广播地址是什么？

A：网络数=2^(19-16)=8个。分别是
134.122.0.0/19
134.122.32.0/19
134.122.64.0/19
134.122.96.0/19
134.122.128.0/19
134.122.160.0/19
134.122.192.0/19
134.122.224.0/19
网络掩码就是把/19转成是十进制点分表示，也就是255.255.224.0。
主机比特位=32-19=13位。那么每一个子网的主机台数=2^13 - 2 = 8190台。
134.122.67.124属于 134.122.64.0/19子网。
每个网络的广播地址分别是
134.122.31.255，134.122.63.255，134.122.95.255，134.122.127.255，134.122.159.255，134.122.191.255，134.122.223.255，134.122.255.255。实际上就是每一个子网的广播地址是该子网最大主机地址+1.
★ E12.5 网络 128.138.2.0/24 上的主机 128.138.2.4 向网络 128.138.129.0/24 上的主机 128.138.129.12 发送一个包。假定：

主机 128.138.2.4 有一条通过 128.138.2.1 的默认路由;
主机 128.138.2.4 刚启动，还没有发送或者接受任何包;
网络上其他所有机器已经运行很长一段时间了;
路由器 128.138.2.1 直接有一条到 128.138.129.1 的路由，后者是 128.138.129.0/24的网关。


列出发出这个包所需要的所有步骤。给出所有传输包的源目的以太网和IP地址。
如果网络是 128.138.0.0/16，您的答案会变吗？怎么变？
如果网络 128.138.2.0 是一个/26网络，而不是/24网络，您的答案会变吗？怎么变？

A：网络知识贫瘠，这个问题我只是知道一个大概，但是却描述不出来。
★★ E12.6 在安装了一个新的Linux系统后，您会如何解决本章里提到的若干安全问题？查查看，在您实验室的Linux系统上是否有什么要解决的安全问题？
A：在12.11节里，提到了IP转发，ICMP重定向，源路由，广播ping，IP欺骗等安全问题。以我家里的网络环境来一一检查这些问题。
首先介绍我家里的网络环境，可能和一般的家里通过一个ADSL MODEM +ROUTE的方式有点不同，因为房间距离的问题，我采取了两极路由的方式。带路由功能的ADSL MODEM 连接一个HUB，HUB上连接了几根网线给台式机。ADSL MODEM上启用了DHCP，网络是192.168.1.0/24，网关是192.168.1.1。然后从HUB上连接一个网线到另外一个无线路由上WLAN口，然后再从无线路由LAN口接出几根网线给PC和台式机。无线AP给手机和无线设备。其中无线路由启用DHCP服务，网络是192.168.0.1/24，网关是192.168.0.1。WLAN口从ADSL MODEM处获得一个固定的192.168.1.200的IP地址。所以我家里的PC，有些属于192.168.1.0/24网络，有的属于192.168.0.0/24网络。手机等具有wifi连接功能的设备获得是192.168.0.0/24的IP地址。一起大约有3台PC，2台notebook，几个手机wifi。
对于IP转发，因为不涉及到路由的功能，所以默认电脑上都关闭了此功能，因为没有IP转发的风险。echo 0 &#62;/proc/sys/net/ipv4/ip_forward
忽略ICMP重定向功能 echo 0 &#62;﻿﻿/proc/sys/net/ipv4/conf/all/accept_redirects
既不接受源路由包，也不接受发送源路由包 echo 0 &#62;/proc/sys/net/ipv4/conf/all/accept_source_route
在路由器上关闭ping广播，我已经在ADSL MODEM 和 [...]]]></description>
			<content:encoded><![CDATA[<p>E12.1 听从（也就是服从）ICMP重定向包的指挥，如何会让一个未经授权的用户威胁网络的安全？<br />
A：主要是会获得一个窃听网络数据的可能，更详细的内容，可以参考<a href="http://82880.blog.51cto.com/72880/68795">这篇文档</a>，说的比较详细。</p>
<p>E12.2 网络链路的MTU是什么？如果给定的MTU设得太高，会发生什么问题？太低呢？<br />
A：MTU（Maximum Transfer Unit)，最大传输单元，用来定义网络上传输包的最大值。以太网一般是1500bytes。太高会导致丢包，太低则导致分片，都会产生网络传输问题。<br />
<span id="more-2034"></span><br />
★ E12.3 说明划分子网的概念，解释它有用的原因。什么是网络掩码？网络掩码和IP地址的网络部分和主机部分的划分有什么关系？<br />
A：这些都是属于计算机网络的基本概念，我这里都不抄书了，看看<a href="http://zh.wikipedia.org/zh-cn/IPv4">维基百科的解释</a>吧。</p>
<p>★ E12.4 网络134.122.0.0/16已经细分成了几个/19网络。</p>
<ol>
<li>有多少个/19的网络？列出他们。他们的网络掩码是多少？</li>
<li>每一个子网上有多少台主机？</li>
<li>IP地址134.122.67.124属于哪个子网？</li>
<li>每个网络的广播地址是什么？</li>
</ol>
<p>A：网络数=2^(19-16)=8个。分别是</p>
<p>134.122.0.0/19</p>
<p>134.122.32.0/19</p>
<p>134.122.64.0/19</p>
<p>134.122.96.0/19</p>
<p>134.122.128.0/19</p>
<p>134.122.160.0/19</p>
<p>134.122.192.0/19</p>
<p>134.122.224.0/19</p>
<p>网络掩码就是把/19转成是十进制点分表示，也就是255.255.224.0。</p>
<p>主机比特位=32-19=13位。那么每一个子网的主机台数=2^13 <span style="font-size: x-small;">- 2 = 8190台。</span></p>
<p><span style="font-size: x-small;">134.122.67.124属于 134.122.64.0/19子网。</span></p>
<p><span style="font-size: xx-small;">每个网络的广播地址分别是</span></p>
<p><span style="font-size: xx-small;">134.122.31.255，134.122.63.255，134.122.95.255，134.122.127.255，134.122.159.255，134.122.191.255，134.122.223.255，134.122.255.255。实际上就是每一个子网的广播地址是该子网最大主机地址+1.</span></p>
<p>★ E12.5 网络 128.138.2.0/24 上的主机 128.138.2.4 向网络 128.138.129.0/24 上的主机 128.138.129.12 发送一个包。假定：</p>
<ul>
<li>主机 128.138.2.4 有一条通过 128.138.2.1 的默认路由;</li>
<li>主机 128.138.2.4 刚启动，还没有发送或者接受任何包;</li>
<li>网络上其他所有机器已经运行很长一段时间了;</li>
<li>路由器 128.138.2.1 直接有一条到 128.138.129.1 的路由，后者是 128.138.129.0/24的网关。</li>
</ul>
<ol>
<li>列出发出这个包所需要的所有步骤。给出所有传输包的源目的以太网和IP地址。</li>
<li>如果网络是 128.138.0.0/16，您的答案会变吗？怎么变？</li>
<li>如果网络 128.138.2.0 是一个/26网络，而不是/24网络，您的答案会变吗？怎么变？</li>
</ol>
<p>A：网络知识贫瘠，这个问题我只是知道一个大概，但是却描述不出来。</p>
<p>★★ E12.6 在安装了一个新的Linux系统后，您会如何解决本章里提到的若干安全问题？查查看，在您实验室的Linux系统上是否有什么要解决的安全问题？</p>
<p>A：在12.11节里，提到了IP转发，ICMP重定向，源路由，广播ping，IP欺骗等安全问题。以我家里的网络环境来一一检查这些问题。</p>
<p>首先介绍我家里的网络环境，可能和一般的家里通过一个ADSL MODEM +ROUTE的方式有点不同，因为房间距离的问题，我采取了两极路由的方式。带路由功能的ADSL MODEM 连接一个HUB，HUB上连接了几根网线给台式机。ADSL MODEM上启用了DHCP，网络是192.168.1.0/24，网关是192.168.1.1。然后从HUB上连接一个网线到另外一个无线路由上WLAN口，然后再从无线路由LAN口接出几根网线给PC和台式机。无线AP给手机和无线设备。其中无线路由启用DHCP服务，网络是192.168.0.1/24，网关是192.168.0.1。WLAN口从ADSL MODEM处获得一个固定的192.168.1.200的IP地址。所以我家里的PC，有些属于192.168.1.0/24网络，有的属于192.168.0.0/24网络。手机等具有wifi连接功能的设备获得是192.168.0.0/24的IP地址。一起大约有3台PC，2台notebook，几个手机wifi。</p>
<p>对于IP转发，因为不涉及到路由的功能，所以默认电脑上都关闭了此功能，因为没有IP转发的风险。echo 0 &gt;/proc/sys/net/ipv4/ip_forward</p>
<p>忽略ICMP重定向功能 echo 0 &gt;﻿﻿/proc/sys/net/ipv4/conf/all/accept_redirects</p>
<p>既不接受源路由包，也不接受发送源路由包 echo 0 &gt;/proc/sys/net/ipv4/conf/all/accept_source_route</p>
<p>在路由器上关闭ping广播，我已经在ADSL MODEM 和 无线路由上均关闭了此项。</p>
<p>因为我每一个特定的机器，一般情况下，只有一条到internet的连接，因此我把/proc/sys/net/ipv4/conf/all/rp_filter 设置为1.</p>
<p>★★ E12.7 在您实验室环境里，加入一台新机器需要什么步骤？回答的时候，要用适合您的网络和本地情况的参数。假定新机器已经在运行Linux了。</p>
<p>A：因为启用了DHCP服务，因此加入新机器，我只要设定好了主机名，基本上接入网线即可。DNS也会自动设置好。如果是无线接入，则需要设定SSID和对应的密码。</p>
<p>★★ E12.8 给出设置一台可以分配 128.138.192.[1-55]范围内IP地址的DHCP服务器所需要的配置文件。用到的租期为2个小时，要确保以太网地址为 00:10:5A:C7:4B:89 的主机始终会分配到 128.138.192.55.</p>
<p>A：示例配置文件如下：</p>

<div class="wp_syntax"><div class="code"><pre class="conf" style="font-family:monospace;">subnet 128.138.192.0 netmask 255.255.255.0 {
&nbsp;
# --- default gateway
	option routers			128.138.192.254;
	option subnet-mask		255.255.255.0;
&nbsp;
	option domain-name-servers	67.208.220.220;
&nbsp;
	range  128.138.192.1 128.138.192.55;
	default-lease-time7200;
	max-lease-time 43200;
&nbsp;
	#  fixed address
	host ns {
		hardware ethernet 00:10:5A:C7:4B:89;
		fixed-address 128.138.192.55;
	}
}</pre></div></div>

<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2010/02/24/lah-chapter12-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2010/02/24/lah-chapter12-questions-key.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第10章系统实践</title>
		<link>http://blog.wgzhao.com/2010/01/15/lah-chapter10-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2010/01/15/lah-chapter10-questions-key.html#comments</comments>
		<pubDate>Fri, 15 Jan 2010 02:41:39 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[syslog]]></category>
		<category><![CDATA[系统管理技术手册]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=2009</guid>
		<description><![CDATA[E10.1 保留老日志文件的主要理由是什么？
A：除非你每天查看系统日志并记录有故障的消息，否则你就要保留老的日志文件，否则BOSS问起你来，你来什么来对付呢？
E10.2  lastlog和wtmp之间的区别是什么？每种日志合理的轮换策略是什么？
A：lastlog记录的是当前所有系统帐号的登录情况，记录每一个帐号最近的登录日期，登录端口/终端。如果没有登录过，则显示为从未登录。

而wtmp则是记录所有登录帐号的信息，包括该帐号登录的时间，登录终端，退出时间等。
E10.3 剖析和理解下面的syslog.conf文件：
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
它看上去合理吗？
A：*.notice已经包括了mail.crit,news.err日志信息了。另外*.notice这个内容也太多了，其次，kern.debug消息会太多，如果是生产系统，不应该把日志定义在debug状态，否则过多的信息否将真正有用的信息掩盖掉。
E10.4 看一遍您的日志文件，注意named的日志记录项。有什么机器试图动态更新您的名字域吗？他们取得成功了吗？
A： 俺暂时还找不到这样的日志数据来分析。
★ E10.5 你可以从哪些地方找到您机器上的引导日志？影响系统引导时日志记录机制的因素有哪些？klogd是如何解决这些问题的？
A：/var/log/dmesg日志文件记录了最新的系统引导日志。
★ E10.6 研究您的站点所采取的日志策略，包括日志文件轮换策略。为日志记录投入了多少磁盘空间？日志文件要保留多久？你可以预见站点策略显出不足的情形吗？您建议的解决方案是什么？
A：目前还没有管理过大型站点机群，平常也就是自己的电脑，加上几台托管的服务器，而日志这块，采用默认的策略，基本上就已经很好了。按照托管的机器服务器日志来看，一年增加的磁盘空间也不会超过5G。加上平常登录进去，也删除一些老的日志文件，所以基本上，日志这块没有着重考虑太多。
★ E10.7 有些日志消息极为重要，系统管理员应该立刻查看他们。您会安装什么系统来尽可能快的做到这点？
A：这个题目没有理解什么意思，不同的系统对于系统管理员看到日志的快慢有关系吗？一般来说，对于这类日志很重要的系统，乎采取日志过滤到特定的服务器上，然后采取“推(push)“的方式通知管理员，或者采取消息通知的方式告知管理员，不过这需要额外设备的支持，不如SMS通知方式。
★ E10.8 编写一个C程序或者Perl脚本，用“user“设备把消息提交给syslog。
A：书上提供了Perl脚本：

use Sys::Syslog;
openlog&#40;&#34;adminscript&#34;,&#34;cons,pid&#34;,&#34;user&#34;&#41;;
syslog&#40;&#34;warning&#34;,&#34;This is just FAKE warning message,don't worry&#34;&#41;;
closelog&#40;&#41;;

]]></description>
			<content:encoded><![CDATA[<p>E10.1 保留老日志文件的主要理由是什么？</p>
<p>A：除非你每天查看系统日志并记录有故障的消息，否则你就要保留老的日志文件，否则BOSS问起你来，你来什么来对付呢？</p>
<p>E10.2  lastlog和wtmp之间的区别是什么？每种日志合理的轮换策略是什么？</p>
<p>A：lastlog记录的是当前所有系统帐号的登录情况，记录每一个帐号最近的登录日期，登录端口/终端。如果没有登录过，则显示为从未登录。<br />
<span id="more-2009"></span><br />
而wtmp则是记录所有登录帐号的信息，包括该帐号登录的时间，登录终端，退出时间等。</p>
<p>E10.3 剖析和理解下面的syslog.conf文件：</p>
<p>*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages</p>
<p>它看上去合理吗？</p>
<p>A：*.notice已经包括了mail.crit,news.err日志信息了。另外*.notice这个内容也太多了，其次，kern.debug消息会太多，如果是生产系统，不应该把日志定义在debug状态，否则过多的信息否将真正有用的信息掩盖掉。</p>
<p>E10.4 看一遍您的日志文件，注意named的日志记录项。有什么机器试图动态更新您的名字域吗？他们取得成功了吗？</p>
<p>A： 俺暂时还找不到这样的日志数据来分析。</p>
<p>★ E10.5 你可以从哪些地方找到您机器上的引导日志？影响系统引导时日志记录机制的因素有哪些？klogd是如何解决这些问题的？</p>
<p>A：/var/log/dmesg日志文件记录了最新的系统引导日志。</p>
<p>★ E10.6 研究您的站点所采取的日志策略，包括日志文件轮换策略。为日志记录投入了多少磁盘空间？日志文件要保留多久？你可以预见站点策略显出不足的情形吗？您建议的解决方案是什么？</p>
<p>A：目前还没有管理过大型站点机群，平常也就是自己的电脑，加上几台托管的服务器，而日志这块，采用默认的策略，基本上就已经很好了。按照托管的机器服务器日志来看，一年增加的磁盘空间也不会超过5G。加上平常登录进去，也删除一些老的日志文件，所以基本上，日志这块没有着重考虑太多。</p>
<p>★ E10.7 有些日志消息极为重要，系统管理员应该立刻查看他们。您会安装什么系统来尽可能快的做到这点？</p>
<p>A：这个题目没有理解什么意思，不同的系统对于系统管理员看到日志的快慢有关系吗？一般来说，对于这类日志很重要的系统，乎采取日志过滤到特定的服务器上，然后采取“推(push)“的方式通知管理员，或者采取消息通知的方式告知管理员，不过这需要额外设备的支持，不如SMS通知方式。</p>
<p>★ E10.8 编写一个C程序或者Perl脚本，用“user“设备把消息提交给syslog。</p>
<p>A：书上提供了Perl脚本：</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Sys<span style="color: #339933;">::</span><span style="color: #006600;">Syslog</span><span style="color: #339933;">;</span>
openlog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;adminscript&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;cons,pid&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;user&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
syslog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;warning&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;This is just FAKE warning message,don't worry&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
closelog<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2010/01/15/lah-chapter10-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2010/01/15/lah-chapter10-questions-key.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第8章习题实践</title>
		<link>http://blog.wgzhao.com/2009/12/30/lah-chapter8-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/12/30/lah-chapter8-questions-key.html#comments</comments>
		<pubDate>Wed, 30 Dec 2009 14:46:14 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[lah]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=1987</guid>
		<description><![CDATA[E8.1 在您的系统上,一个本地用户以有规律的时间间隔运行开销很大的任务，滥用他的crontab特权。在几次要求他停止后，您被迫收回他的特权。列出删除他的当前crontab文件，并确保他不能增加新的crontab文件所需的步骤。
A：假定用户test就是我们需要惩罚的用户，目前你的帐号是root。列出帐号test的crontab文件指令是：
root@wgzhao-nb:~# crontab -u test -l
# m h  dom mon dow   command
20 3 * * * /usr/bin/hugecmd

删除的指令是：
root@wgzhao-nb:~# crontab  -u test -r
要禁止该用户添加新的crontab文件，需要编辑（创建）/etc/cron.deny文件，将对应的帐号加入其中
echo &#8220;test&#8221; &#62;&#62;/etc/cron.deny
其结果如下演示：
root@wgzhao-nb:~# crontab  -u test -e
You (test) are not allowed to use this program (crontab)
See crontab(1) for more information

E8.2 想出3项需要定期运行的任务，写出每项任务的crontab配置项，指出配置文件应该送入那个crontab文件。
A：实际上，系统默认的情况下，已经有大量的定时任务了，以我的ubuntu 9.10 桌面系统来看，默认的定时任务多达36项。从系统管理角度到应用程序角度，不一而足。可以仔细分析/etc/cron.*/*下的配置项来获得对crontab的进一步认识。
E8.3 找到您运行的Linux系统上的crontab文件，选出3个。解读每一个文件，并说明他何时运行，做什么。以及您认为为什么需要这个配置项。
A：我们就分别从/etc/cron.{daily,weekly,d}里找一个出来分析把。
先分析/etc/cron.daily/sysstat,内容如下:
#!/bin/sh
# Generate a daily summary of process [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">E8.1 在您的系统上,一个本地用户以有规律的时间间隔运行开销很大的任务，滥用他的crontab特权。在几次要求他停止后，您被迫收回他的特权。列出删除他的当前crontab文件，并确保他不能增加新的crontab文件所需的步骤。</span><br />
A：假定用户test就是我们需要惩罚的用户，目前你的帐号是root。列出帐号test的crontab文件指令是：</p>
<pre class="bash">root@wgzhao-nb:~# crontab -u test -l
# m h  dom mon dow   command
20 3 * * * /usr/bin/hugecmd
</pre>
<p>删除的指令是：</p>
<pre class="bash">root@wgzhao-nb:~# crontab  -u test -r</pre>
<p>要禁止该用户添加新的crontab文件，需要编辑（创建）/etc/cron.deny文件，将对应的帐号加入其中</p>
<p><span id="more-1987"></span>echo &#8220;test&#8221; &gt;&gt;/etc/cron.deny</p>
<p>其结果如下演示：</p>
<pre class="bash">root@wgzhao-nb:~# crontab  -u test -e
You (test) are not allowed to use this program (crontab)
See crontab(1) for more information
</pre>
<p><span style="color: #ff0000;">E8.2 想出3项需要定期运行的任务，写出每项任务的crontab配置项，指出配置文件应该送入那个crontab文件。</span><br />
A：实际上，系统默认的情况下，已经有大量的定时任务了，以我的ubuntu 9.10 桌面系统来看，默认的定时任务多达36项。从系统管理角度到应用程序角度，不一而足。可以仔细分析/etc/cron.*/*下的配置项来获得对crontab的进一步认识。</p>
<p><span style="color: #ff0000;">E8.3 找到您运行的Linux系统上的crontab文件，选出3个。解读每一个文件，并说明他何时运行，做什么。以及您认为为什么需要这个配置项。</span></p>
<p>A：我们就分别从/etc/cron.{daily,weekly,d}里找一个出来分析把。<br />
先分析/etc/cron.daily/sysstat,内容如下:</p>
<pre class="bash">#!/bin/sh
# Generate a daily summary of process accounting.  Since this will probably
# get kicked off in the morning, it is run against the previous day data.

#  our configuration file
DEFAULT=/etc/default/sysstat
#  default settings, overriden in the above file
ENABLED=false
SA2_OPTIONS=""

[ ! -x /usr/lib/sysstat/sa2 ] &amp;&amp; exit 0

# read our config
[ -r "$DEFAULT" ] &amp;&amp; . "$DEFAULT" 

[ "$ENABLED" = "true" ]  || exit 0

exec /usr/lib/sysstat/sa2 -A $SA2_OPTIONS
</pre>
<p>这段脚本的目的是生成SAR文件，方便以后分析当前的状态，包括系统日志，性能等。对于服务器而言，这个服务是比要的，而且应该每天执行。这样万一某天服务器出现故障，至少从这些SAR文件可以获得一些信息，看看是什么问题导致系统出现了故障，看是软件故障，还是性能的问题。<br />
我们再看/etc/cron.weekly/clean-log<br />
脚本内容如下：</p>
<pre class="bash">#!/bin/bash
#delete all archived log file (which has .gz suffix)
cd /var/log
find . -name \*.gz -exec rm -f '{}' \;
find . -name \*.old -exec rm -f '{}' \;
exit 0
</pre>
<p>这段脚本每周的周一回执行一次，目的是删除/var/log下的所有归档日志。其目的当然是节省磁盘空间。当然，如果你觉得你的硬盘足够大，那么这段定时任务就并不是非要不可的了。<br />
/etc/cron.d/php5配置项，内如如下：</p>
<pre class="bash"># /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] &amp;&amp; [ -d /var/lib/php5 ] &amp;&amp; find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
</pre>
<p>代码前面的注释说的非常明白了。这段代码每30分钟执行一次，主要是删除过期的会话文件。如果是一个高负载的web站点，使用了大量的会话，这个定时任务很有必要。</p>
<p><span style="color: #ff0000;">♥</span><span style="color: #ff0000;">E8.4 编写一个脚本，保持您有帐号的所有机器上的启动文件(~/.[a-z]*}同步。从cron定期运行这个脚本。</span></p>
<p>A： 如果文件拷贝走scp方式，而且需要采取密码认证方法，恐怕这个脚本就不会那么容易写了，因为scp不接受从配置文件获取密码，必须是从标准输入接受（至少我目前是这样理解的），因此同步的前提，是首先确保这些有帐号的机器做了公钥认证模式。剩下的就是同步启动文件了，不过在同步之前，考虑到一些特别情况，最好是先备份机器上的配置文件。示例脚本如下：</p>
<pre class="bash">#!/bin/bash
file="machines.txt" # all machines list include account  ,each line format account@hostname
#first backup current startup scripts
for i in `cat $file`
do
ssh $i tar -czf ~/script-backup-`date +%s`.tar.gz ~/.[a-z]*
scp ~/.[a-z]* $i:~/
done
</pre>
<p>然后把这个脚本丢到/etc/cron.{hourly,daily,weekly,monthly,d}的任何一个目录都可以。</p>
<p><span style="color: #ff0000;">♥</span><span style="color: #ff0000;">E8.5 以du ,sort和head命令的手册页作为参考，编写一个脚本，确定系统上最大的10个主(home)目录。在每周一的夜里12：00执行这个脚本，并且让它把输出结果发给您。</span></p>
<p>A：暂时找不到拥有大量帐号的机器，我就用/usr/share作为目标替代吧。<br />
首先测试脚本，一般来说，这种要求，应该当行脚本可以搞定：<br />
du  -s * |sort -rn |head -n 10<br />
接下就是把这个结果发送出去，那么采取mail指令好了，先把上述结果保存到一个临时文件，然后把这个临时文件的内容当作邮件正文发出去。采用管道方式，连临时文件都省略了。<br />
du -s * |sort -rn |head -n 10  |mail -s &#8220;statistic report&#8221;  root@localhost.localdomain</p>
<p>收信如下：</p>
<pre>[root@localhost locale]# mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
&gt;N  1 root@localhost.localdomain   Thu Dec 31 00:33  25/679   "statistic report"
&amp; 1
Message 1:
From root@localhost.localdomain  Thu Dec 31 00:33:02 2009
Date: Thu, 31 Dec 2009 00:33:02 +0800
From: root
To: root@localhost.localdomain
Subject: statistic report

8836	fr
8728	es
8412	de
7604	sv
7432	ru
6700	ja
6432	it
6120	pl
6032	gu
5956	tr
</pre>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/12/30/lah-chapter8-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/12/30/lah-chapter8-questions-key.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第七章习题实践</title>
		<link>http://blog.wgzhao.com/2009/12/22/lah-chapter7-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/12/22/lah-chapter7-questions-key.html#comments</comments>
		<pubDate>Tue, 22 Dec 2009 14:57:06 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/2009/12/22/lah-chapter7-questions-key.html</guid>
		<description><![CDATA[很抱歉，前段时间一直出差，书太重，不可能带着跑，所以习题实践中断了一段时间，不过我不会放弃这个计划的。好了，废话少说。第七章习题较多，最后一个题目难度很大，按照书的前言描述，这应该可以当作一个学期的课程设计，所以暂时不实现（其实是我不善于编程，所以完成需要一个程序需要很长的时间）

E7.1 列出SCSI的所有种类。每种SCSI该用什么样的连接器？不考虑连接器的差异，不同SCSI版本之间有哪些兼容性问题？
A：如果这个题目回退到10年前，也许他的确需要引起重视，我记得01年我刚接触到一台带有SCSI磁盘的低端存储用来做实验时，就需要自己设置ID号，自己跳线，自己连接终结端子。而现在，这一切都对我们透明了，我们只需要简单的把SCSI/SATA/SAS硬盘插入到对应的插槽就好了，不用考虑不同SCSI版本的兼容性，不用考虑SCSI种类的兼容性。一切看上去都是那么完美。最开始的时候，窄的SCSI线(8位）和宽SCSI（16位）有混用的情况，SCSI-1和ultra-SCSI也有混用的情况，这些当时都需要考虑兼容性问题。现在恐怕没有谁这么去用了吧？比如，我们还能找到8位的SCSI线吗？So，这个问题现在不重要了。
E7.2 硬盘格式化和硬盘分区之间有什么区别？分区和创建文件系统之间有什么区别？
A：如果这样定义也许会比较好点：硬盘格式化就是硬盘初始化，比如设定磁盘的磁盘标签格式（GPT，MSDOS，Sundisk，etc）。分区说的是将硬盘分成特定大小的逻辑空间，而创建文件系统就是在逻辑空间里写满特定文件系统的元数据信息。
E7.3 列出以下环境下，在一个硬盘上创建一个文件系统所要用到的命令和参数

硬盘用户保存home目录；
硬盘用于交换区；
硬盘用在一个很大的垃圾邮件站点存储邮件队列；
硬盘装有一个MySQL InnoDB数据库。

A：假定这个分区是/dev/sda3home目录保存的是用户的数据，文件大小也不会趋向某一个区段，那就采取最基本的创建文件系统方式好了，不过这里可以把默认的5%保留空间拿走，以腾出更多的空间来保存数据。那么命令就是mkfs.ext3 -m 0 /dev/sda3交换分区，采取创建交换分区的特有指令，首先把分区的ID设置为82，然后执行mkswap /dev/sda3，最后激活它.swapon&#160; /dev/sda3邮件队列的特点是，文件多，文件体积小，因此我们尽可能的增加inode数量，减小block size的大小。推荐指令如下：mkfs.ext3 -b 1024 -m 0 /dev/sda3MySQL InnoDB 已经支持裸设备，当然直接使用裸设备效率会更高。具体可以移步到官方说明。
E7.4 LVM工具软件功能强大，但是如果没有搞得清楚就可能发生混淆。联系实际，说明如何成功地从一个卷组删除一个设备，并加入到另外一个卷组。
A：说说话，实际工作中，LVM的活干得很多，设置包括了LVM的紧急救援，恢复工作。但是对于迁移，还真没有实实在在的在生产环境中做过。所以，这里只能是理论上了。首先得要查看当前要删除的设备（当然是一个PV了）是否已经在使用了，这个可以通过pvscan和pvdisplay指令可以获得。如果没有在使用，那就比较容易了，直接用vgreduce vgname pvname(path)的方式先从该卷组中，删除掉。然后通过vgextend vgname pvname（path）的方式加入就可以了。如果在使用，则需要通过查看LV的信息，看看是哪几个LV在使用，则需要迁移数据。删除对应的LV，接下来的指令同上。
♥ E7.5 使用书面印刷的或者Internet上的资源。确定性能最好的SCSI硬盘和IDE硬盘，评测这些硬盘所采取的评测指标能反映出一台繁忙的Linux服务器把它用作引导盘的情况吗？您会为SCSI花多少钱？您从多花的钱上得到了多高的性能提升（如果有的话）？
A：呃，这个题目，我似乎只能自行飘过。也许CIO们会感兴趣吧。
♥ E7.6 在给您的系统增加一块硬盘。让新硬盘的一个分区备份根分区，安装一个内核，并从该分区引导。记录下完成此项任务所有的步骤。
A：

对硬盘进行分区，创建文件系统，然后挂载，比如挂载在/newroot目录下。
把当前系统的根分区拷贝过来，拷贝需要技巧，仅仅只要拷贝根分区下的目录，对于独立出来的分区，比如/usr,/var等就不要拷贝了。
修改/newroot/etc/fstab把根分区的挂载设定为当前新硬盘的分区。
拷贝需要安装的内核包到/newroot目录。
chroot /newroot
安装内核
修改/boot/grub/menu.lst文件，增加当前新系统的引导入口。
调试。

♥ E7.7 什么是超级块？它有什么用？在内核的头文件中查出ext2fs超级块的结构定义，并讨论结构中每一个域所代表的含义。
A：超级块结构表示一个文件系统。它包含管理文件系统所需的信息，包括文件系统名称（比如 ext2）、文件系统的大小和状态、块设备的引用和元数据信息（比如空闲列表等等）。在/usr/include/linux/ext2_fs.h里有super_block的定义，如下：

struct ext2_super_block {
	__le32	s_inodes_count;		/* Inodes count */
	__le32	s_blocks_count;		/* Blocks count */
	__le32	s_r_blocks_count;	/* Reserved blocks count */
	__le32	s_free_blocks_count;	/* Free blocks count */
	__le32	s_free_inodes_count;	/* Free inodes count */
	__le32	s_first_data_block;	/* First Data Block */
	__le32	s_log_block_size;	/* [...]]]></description>
			<content:encoded><![CDATA[<p>很抱歉，前段时间一直出差，书太重，不可能带着跑，所以习题实践中断了一段时间，不过我不会放弃这个计划的。<br />好了，废话少说。第七章习题较多，最后一个题目难度很大，按照书的前言描述，这应该可以当作一个学期的课程设计，所以暂时不实现（其实是我不善于编程，所以完成需要一个程序需要很长的时间）</p>
<p><span id="more-1973"></span></p>
<p><font color="#ff0000">E7.1 列出SCSI的所有种类。每种SCSI该用什么样的连接器？不考虑连接器的差异，不同SCSI版本之间有哪些兼容性问题？</font></p>
<p>A：如果这个题目回退到10年前，也许他的确需要引起重视，我记得01年我刚接触到一台带有SCSI磁盘的低端存储用来做实验时，就需要自己设置ID号，自己跳线，自己连接终结端子。而现在，这一切都对我们透明了，我们只需要简单的把SCSI/SATA/SAS硬盘插入到对应的插槽就好了，不用考虑不同SCSI版本的兼容性，不用考虑SCSI种类的兼容性。一切看上去都是那么完美。<br />最开始的时候，窄的SCSI线(8位）和宽SCSI（16位）有混用的情况，SCSI-1和ultra-SCSI也有混用的情况，这些当时都需要考虑兼容性问题。现在恐怕没有谁这么去用了吧？比如，我们还能找到8位的SCSI线吗？<br />So，这个问题现在不重要了。</p>
<p><font color="#ff0000">E7.2 硬盘格式化和硬盘分区之间有什么区别？分区和创建文件系统之间有什么区别？</font></p>
<p>A：如果这样定义也许会比较好点：硬盘格式化就是硬盘初始化，比如设定磁盘的磁盘标签格式（GPT，MSDOS，Sundisk，etc）。分区说的是将硬盘分成特定大小的逻辑空间，而创建文件系统就是在逻辑空间里写满特定文件系统的元数据信息。</p>
<p><font color="#ff0000">E7.3 列出以下环境下，在一个硬盘上创建一个文件系统所要用到的命令和参数</font>
<ol>
<li>硬盘用户保存home目录；</li>
<li>硬盘用于交换区；</li>
<li>硬盘用在一个很大的垃圾邮件站点存储邮件队列；</li>
<li>硬盘装有一个MySQL InnoDB数据库。</li>
</ol>
<p>A：假定这个分区是/dev/sda3<br />home目录保存的是用户的数据，文件大小也不会趋向某一个区段，那就采取最基本的创建文件系统方式好了，不过这里可以把默认的5%保留空间拿走，以腾出更多的空间来保存数据。那么命令就是mkfs.ext3 -m 0 /dev/sda3<br />交换分区，采取创建交换分区的特有指令，首先把分区的ID设置为82，然后执行mkswap /dev/sda3，最后激活它.swapon&nbsp; /dev/sda3<br />邮件队列的特点是，文件多，文件体积小，因此我们尽可能的增加inode数量，减小block size的大小。推荐指令如下：<br />mkfs.ext3 -b 1024 -m 0 /dev/sda3<br />MySQL InnoDB 已经支持裸设备，当然直接使用裸设备效率会更高。具体可以<a target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/innodb-raw-devices.html">移步到官方说明</a>。</p>
<p><font color="#ff0000">E7.4 LVM工具软件功能强大，但是如果没有搞得清楚就可能发生混淆。联系实际，说明如何成功地从一个卷组删除一个设备，并加入到另外一个卷组。</font></p>
<p>A：说说话，实际工作中，LVM的活干得很多，设置包括了LVM的紧急救援，恢复工作。但是对于迁移，还真没有实实在在的在生产环境中做过。所以，这里只能是理论上了。<br />首先得要查看当前要删除的设备（当然是一个PV了）是否已经在使用了，这个可以通过pvscan和pvdisplay指令可以获得。如果没有在使用，那就比较容易了，直接用vgreduce vgname pvname(path)的方式先从该卷组中，删除掉。<br />然后通过vgextend vgname pvname（path）的方式加入就可以了。<br />如果在使用，则需要通过查看LV的信息，看看是哪几个LV在使用，则需要迁移数据。删除对应的LV，接下来的指令同上。</p>
<p><span style="color: rgb(255, 0, 0);">♥ </span><font color="#ff0000">E7.5 使用书面印刷的或者Internet上的资源。确定性能最好的SCSI硬盘和IDE硬盘，评测这些硬盘所采取的评测指标能反映出一台繁忙的Linux服务器把它用作引导盘的情况吗？您会为SCSI花多少钱？您从多花的钱上得到了多高的性能提升（如果有的话）？</font></p>
<p>A：呃，这个题目，我似乎只能自行飘过。也许CIO们会感兴趣吧。</p>
<p><span style="color: rgb(255, 0, 0);">♥ </span><font color="#ff0000">E7.6 在给您的系统增加一块硬盘。让新硬盘的一个分区备份根分区，安装一个内核，并从该分区引导。记录下完成此项任务所有的步骤。</font></p>
<p>A：
<ol>
<li>对硬盘进行分区，创建文件系统，然后挂载，比如挂载在/newroot目录下。</li>
<li>把当前系统的根分区拷贝过来，拷贝需要技巧，仅仅只要拷贝根分区下的目录，对于独立出来的分区，比如/usr,/var等就不要拷贝了。</li>
<li>修改/newroot/etc/fstab把根分区的挂载设定为当前新硬盘的分区。</li>
<li>拷贝需要安装的内核包到/newroot目录。</li>
<li>chroot /newroot</li>
<li>安装内核</li>
<li>修改/boot/grub/menu.lst文件，增加当前新系统的引导入口。</li>
<li>调试。</li>
</ol>
<p><span style="color: rgb(255, 0, 0);">♥ </span><font color="#ff0000">E7.7 什么是超级块？它有什么用？在内核的头文件中查出ext2fs超级块的结构定义，并讨论结构中每一个域所代表的含义。</font></p>
<p>A：超级块结构表示一个文件系统。它包含管理文件系统所需的信息，包括文件系统名称（比如 ext2）、文件系统的大小和状态、块设备的引用和元数据信息（比如空闲列表等等）。<br />在/usr/include/linux/ext2_fs.h里有super_block的定义，如下：
<pre line="399" lang="“c&quot;">
struct ext2_super_block {
	__le32	s_inodes_count;		/* Inodes count */
	__le32	s_blocks_count;		/* Blocks count */
	__le32	s_r_blocks_count;	/* Reserved blocks count */
	__le32	s_free_blocks_count;	/* Free blocks count */
	__le32	s_free_inodes_count;	/* Free inodes count */
	__le32	s_first_data_block;	/* First Data Block */
	__le32	s_log_block_size;	/* Block size */
	__le32	s_log_frag_size;	/* Fragment size */
	__le32	s_blocks_per_group;	/* # Blocks per group */
	__le32	s_frags_per_group;	/* # Fragments per group */
	__le32	s_inodes_per_group;	/* # Inodes per group */
	__le32	s_mtime;		/* Mount time */
	__le32	s_wtime;		/* Write time */
	__le16	s_mnt_count;		/* Mount count */
	__le16	s_max_mnt_count;	/* Maximal mount count */
	__le16	s_magic;		/* Magic signature */
	__le16	s_state;		/* File system state */
	__le16	s_errors;		/* Behaviour when detecting errors */
	__le16	s_minor_rev_level; 	/* minor revision level */
	__le32	s_lastcheck;		/* time of last check */
	__le32	s_checkinterval;	/* max. time between checks */
	__le32	s_creator_os;		/* OS */
	__le32	s_rev_level;		/* Revision level */
	__le16	s_def_resuid;		/* Default uid for reserved blocks */
	__le16	s_def_resgid;		/* Default gid for reserved blocks */
	/*
	 * These fields are for EXT2_DYNAMIC_REV superblocks only.
	 *
	 * Note: the difference between the compatible feature set and
	 * the incompatible feature set is that if there is a bit set
	 * in the incompatible feature set that the kernel doesn't
	 * know about, it should refuse to mount the filesystem.
	 *
	 * e2fsck's requirements are more strict; if it doesn't know
	 * about a feature in either the compatible or incompatible
	 * feature set, it must abort and not try to meddle with
	 * things it doesn't understand...
	 */
	__le32	s_first_ino; 		/* First non-reserved inode */
	__le16   s_inode_size; 		/* size of inode structure */
	__le16	s_block_group_nr; 	/* block group # of this superblock */
	__le32	s_feature_compat; 	/* compatible feature set */
	__le32	s_feature_incompat; 	/* incompatible feature set */
	__le32	s_feature_ro_compat; 	/* readonly-compatible feature set */
	__u8	s_uuid[16];		/* 128-bit uuid for volume */
	char	s_volume_name[16]; 	/* volume name */
	char	s_last_mounted[64]; 	/* directory where last mounted */
	__le32	s_algorithm_usage_bitmap; /* For compression */
	/*
	 * Performance hints.  Directory preallocation should only
	 * happen if the EXT2_COMPAT_PREALLOC flag is on.
	 */
	__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
	__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
	__u16	s_padding1;
	/*
	 * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
	 */
	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
	__u32	s_journal_inum;		/* inode number of journal file */
	__u32	s_journal_inum;		/* inode number of journal file */
	__u32	s_journal_dev;		/* device number of journal file */
	__u32	s_journal_dev;		/* device number of journal file */
	__u32	s_last_orphan;		/* start of list of inodes to delete */
	__u32	s_last_orphan;		/* start of list of inodes to delete */
	__u32	s_hash_seed[4];		/* HTREE hash seed */
	__u32	s_hash_seed[4];		/* HTREE hash seed */
	__u8	s_def_hash_version;	/* Default hash version to use */
	__u8	s_def_hash_version;	/* Default hash version to use */
	__u8	s_reserved_char_pad;
	__u8	s_reserved_char_pad;
	__u16	s_reserved_word_pad;
	__u16	s_reserved_word_pad;
	__le32	s_default_mount_opts;
	__le32	s_default_mount_opts;
 	__le32	s_first_meta_bg; 	/* First metablock block group */
 	__le32	s_first_meta_bg; 	/* First metablock block group */
	__u32	s_reserved[190];	/* Padding to the end of the block */
	__u32	s_reserved[190];	/* Padding to the end of the block */
};
</pre>
<p>后面的注释已经写得比较清楚了，就不用再解释了。<br />网络上详细剖析ext2文件系统的文档也不少。</p>
<p><span style="color: rgb(255, 0, 0);">♥ </span><font color="#ff0000">E7.8 使用mdadm及其-f选项模拟RAID盘阵中一块硬盘发生故障。从这个盘阵删除该硬盘，然后添加回去。每一步/proc/mdstat显示怎么样的信息？</font></p>
<p>A：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># mdadm  --detail /dev/md0</span>
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0:
        Version : <span style="color: #000000;">00.90</span>
  Creation Time : Thu Dec <span style="color: #000000;">24</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">11</span>:<span style="color: #000000;">11</span> <span style="color: #000000;">2009</span>
     Raid Level : raid1
     Array Size : <span style="color: #000000;">2097088</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2048.28</span> MiB <span style="color: #000000;">2147.42</span> MB<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Used Dev Size : <span style="color: #000000;">2097088</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2048.28</span> MiB <span style="color: #000000;">2147.42</span> MB<span style="color: #7a0874; font-weight: bold;">&#41;</span>
   Raid Devices : <span style="color: #000000;">2</span>
  Total Devices : <span style="color: #000000;">2</span>
Preferred Minor : <span style="color: #000000;">0</span>
    Persistence : Superblock is persistent
&nbsp;
    Update Time : Thu Dec <span style="color: #000000;">24</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">11</span>:<span style="color: #000000;">55</span> <span style="color: #000000;">2009</span>
          State : clean
 Active Devices : <span style="color: #000000;">2</span>
Working Devices : <span style="color: #000000;">2</span>
 Failed Devices : <span style="color: #000000;">0</span>
  Spare Devices : <span style="color: #000000;">0</span>
&nbsp;
           UUID : 32c53f31:ddeb40ff:06694991:8b2cae0c <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">local</span> to host wgzhao-nb<span style="color: #7a0874; font-weight: bold;">&#41;</span>
         Events : <span style="color: #000000;">0.18</span>
&nbsp;
    Number   Major   Minor   RaidDevice State
       <span style="color: #000000;">0</span>       <span style="color: #000000;">8</span>       <span style="color: #000000;">32</span>        <span style="color: #000000;">0</span>      active <span style="color: #c20cb9; font-weight: bold;">sync</span>   <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdc
       <span style="color: #000000;">1</span>       <span style="color: #000000;">8</span>       <span style="color: #000000;">16</span>        <span style="color: #000000;">1</span>      active <span style="color: #c20cb9; font-weight: bold;">sync</span>   <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb
&nbsp;
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># mdadm  -f /dev/md0 /dev/sdb</span>
mdadm: <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb faulty <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># cat /proc/mdstat </span>
Personalities : <span style="color: #7a0874; font-weight: bold;">&#91;</span>linear<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>multipath<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid0<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid1<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid6<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid5<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid4<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid10<span style="color: #7a0874; font-weight: bold;">&#93;</span> 
md0 : active raid1 sdb<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>F<span style="color: #7a0874; font-weight: bold;">&#41;</span> sdc<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
      <span style="color: #000000;">2097088</span> blocks <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>U_<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
unused devices: <span style="color: #000000; font-weight: bold;">&lt;</span>none<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># mdadm --remove /dev/md0 /dev/sdb</span>
mdadm: hot removed <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># cat /proc/mdstat </span>
Personalities : <span style="color: #7a0874; font-weight: bold;">&#91;</span>linear<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>multipath<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid0<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid1<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid6<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid5<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid4<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid10<span style="color: #7a0874; font-weight: bold;">&#93;</span> 
md0 : active raid1 sdc<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
      <span style="color: #000000;">2097088</span> blocks <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>U_<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
unused devices: <span style="color: #000000; font-weight: bold;">&lt;/</span>none<span style="color: #000000; font-weight: bold;">&gt;&lt;</span>none<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># mdadm  -a /dev/md0 /dev/sdb</span>
mdadm: added <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb
&nbsp;
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># cat /proc/mdstat </span>
Personalities : <span style="color: #7a0874; font-weight: bold;">&#91;</span>linear<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>multipath<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid0<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid1<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid6<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid5<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid4<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid10<span style="color: #7a0874; font-weight: bold;">&#93;</span> 
md0 : active raid1 sdb<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> sdc<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
      <span style="color: #000000;">2097088</span> blocks <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>U_<span style="color: #7a0874; font-weight: bold;">&#93;</span>
      <span style="color: #7a0874; font-weight: bold;">&#91;</span>====<span style="color: #000000; font-weight: bold;">&gt;</span>................<span style="color: #7a0874; font-weight: bold;">&#93;</span>  recovery = <span style="color: #000000;">21.4</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">451008</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2097088</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #007800;">finish</span>=0.2min <span style="color: #007800;">speed</span>=112752K<span style="color: #000000; font-weight: bold;">/</span>sec
&nbsp;
unused devices: <span style="color: #000000; font-weight: bold;">&lt;/</span>none<span style="color: #000000; font-weight: bold;">&gt;&lt;</span>none<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
root<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:~<span style="color: #666666; font-style: italic;"># cat /proc/mdstat </span>
Personalities : <span style="color: #7a0874; font-weight: bold;">&#91;</span>linear<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>multipath<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid0<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid1<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid6<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid5<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid4<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>raid10<span style="color: #7a0874; font-weight: bold;">&#93;</span> 
md0 : active raid1 sdb<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> sdc<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
      <span style="color: #000000;">2097088</span> blocks <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>UU<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
unused devices: <span style="color: #000000; font-weight: bold;">&lt;/</span>none<span style="color: #000000; font-weight: bold;">&gt;&lt;</span>none<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>none<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>E7.9 ext3fs文件系统上的inode保存哪些信息？列出代表文件/etc/motd的inode的内容。这个文件的文件名保存在什么地方（诸如hexdump和ls -i这样的名录可能会有帮助)<br />A：inode包含以下几个域：
<ul>
<li>文件属主。分成单个属主和组属主。 </li>
<li>文件类型：普通文件、目录、设备文件、FIFO等 </li>
<li>访问权限 </li>
<li>文件访问时间：上次的文件修改/访问/inode修改时间 </li>
<li>链接数：至少是1 </li>
<li>文件数据块的地址表 </li>
<li>文件大小</li>
</ul>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=fd9d7b79-b3de-8380-a17c-256d4f5c58d8" /></div>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/12/22/lah-chapter7-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/12/22/lah-chapter7-questions-key.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第六章习题实践</title>
		<link>http://blog.wgzhao.com/2009/12/03/lah-chapter6-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/12/03/lah-chapter6-questions-key.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 01:26:41 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[我读我书]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[sa]]></category>
		<category><![CDATA[umask]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=1960</guid>
		<description><![CDATA[E6.1 怎样决定用户的默认组？怎样改变它？
 A：感觉还是用户设置为默认的同名私有组作为默认组是比较恰当的。改变组的指令是chgrp。
 E6.2 说明下面这几个umask值的区别：077、027、022和755.为了让这些值的其中之一成为新用户的全局默认值，该怎么做？您可以给用户施加一个标准的umask吗？

A：077，表示创建的缺省文件许可是600，027则是640，022则是644，755则是022。想成为新用户的全局默认值，一个办法是修改系统缺省的umask值，Fedora/RedHat系统是/etc/bashrc文件。Debian/Ubuntu系统是/etc/profile。或者直接修改/etc/skel/.bash_profile文件，增加umask的设定。
 E6.3 隐蔽口令文件的目的是什么？
A：安全，安全，安全！
 ♥ E6.4 列出不用useradd程序，给系统增加一个用户所需要的步骤。对于您本地的环境来说，额外还需要什么步骤？
在/etc/passwd增加入口，给/etc/shadow增加入口，给/etc/group创建组（如果有必要）。创建用户主目录，拷贝模板文件。
我原来管理的机器，还需要增加邮件存储路径，邮件配额等。
♥ E6.5 确定您的站点上用于新用户的命名约定。采取什么规则？如何保持唯一性？您会想到什么缺点吗？如何删除用户？
A：这类开放式的问题还怎不知道如何回答。首先，我没有管理这么多机器。其次管理的机器帐号数量也很少。另外，我们一般有自己的一个网络名，很少重复。那么这个网络名绝大部分就成了新用户的登录名。不过一个不好就是无法一眼就能知道这个帐号对应的实际活生生的人是谁？
♥♥ E6.6 找到一份学生名单，用它作为脚本的输入，按照您站点上的命名约定构成登录名。在您遇到冲突之前可以受理多少用户？总共有多少个冲突？使用这些数据来评定您站点的命名约定，并给出改进建议。
A：这也是开放式的问题了。需要在自己的实际管理经验中总结，而且还必须是在管理众多用户的情况下才能理解到这个含义。
那就拿我们公司的邮件帐号命名来说，我们一般采取名字拼音首字母+姓全拼音的方式。比如我的邮件名字就是wgzhao。目前来看，重复的几率不大。这样命名似乎也是一个常用的方式。当然对于采取也写企业级邮件系统，比如Domino的，他们的命名采取类似LDAP数据库的分级方式。我了解到的是在大部分银行内部邮件是这样的，而且似乎采取Domino作为邮件服务器的都是这样，包括IBM本身。
♥♥ E6.7 编写一个脚本，帮助监视/etc/passwd文件是否正常（除非您开动脑筋，否则b和e需要超级用户权限）
a) 找出有UID 0的所有项
b) 找出没有口令的所有项（需要/etc/shadow文件)
c) 找出有重复UID的所有项
d) 找出有重复登录名的所有项
e) 找出没有作废日期的所有项(需要/etc/shadow文件)
A：每一个要求，基本上就是一条指令，我就分别写好了。
a)  awk -F: &#8216;{ if ($3 == 0) print $0}&#8217; /etc/passwd
b) 题目的意思似乎是不想用到超级用户权限，那么使用sudo算不算呢？好吧，加点难度，sudo也不用。判断用户是否没有口令，一般来说如果/etc/passwd秘密一项没有占位符，也就是为空。或者/etc/shadow里密码一项为空。这都表示帐号没有密码。为了统一起来，我们可以把标准帐号挨个尝试，如果不需要密码就能su过去，那就应该是没有密码，否则就是有密码。对于Fedora/RedHat而言，标准帐号从500开始。Debian/Ubuntu则从1000开始。

#!/bin/bash
for i in `awk -F: '{ if ($3 &#62; 499) print $1}'`
do
su - $i  &#60; &#60;EOF
&#160;
EOF
&#91; $? -eq 0 &#93; &#124;&#124; getent [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">E6.1 怎样决定用户的默认组？怎样改变它？</span></p>
<p><span style="color: #ff0000;"> </span>A：感觉还是用户设置为默认的同名私有组作为默认组是比较恰当的。改变组的指令是chgrp。<br />
<span style="color: #ff0000;"> E6.2 说明下面这几个umask值的区别：077、027、022和755.为了让这些值的其中之一成为新用户的全局默认值，该怎么做？您可以给用户施加一个标准的umask吗？</span><br />
<span id="more-1960"></span><br />
A：077，表示创建的缺省文件许可是600，027则是640，022则是644，755则是022。想成为新用户的全局默认值，一个办法是修改系统缺省的umask值，Fedora/RedHat系统是/etc/bashrc文件。Debian/Ubuntu系统是/etc/profile。或者直接修改/etc/skel/.bash_profile文件，增加umask的设定。<br />
<span style="color: #ff0000;"> E6.3 隐蔽口令文件的目的是什么？</span></p>
<p>A：安全，安全，安全！<br />
<span style="color: #ff0000;"> ♥ E6.4 列出不用useradd程序，给系统增加一个用户所需要的步骤。对于您本地的环境来说，额外还需要什么步骤？</span></p>
<p>在/etc/passwd增加入口，给/etc/shadow增加入口，给/etc/group创建组（如果有必要）。创建用户主目录，拷贝模板文件。</p>
<p>我原来管理的机器，还需要增加邮件存储路径，邮件配额等。</p>
<p><span style="color: #ff0000;">♥ E6.5 确定您的站点上用于新用户的命名约定。采取什么规则？如何保持唯一性？您会想到什么缺点吗？如何删除用户？</span></p>
<p>A：这类开放式的问题还怎不知道如何回答。首先，我没有管理这么多机器。其次管理的机器帐号数量也很少。另外，我们一般有自己的一个网络名，很少重复。那么这个网络名绝大部分就成了新用户的登录名。不过一个不好就是无法一眼就能知道这个帐号对应的实际活生生的人是谁？</p>
<p><span style="color: #ff0000;">♥♥ E6.6 找到一份学生名单，用它作为脚本的输入，按照您站点上的命名约定构成登录名。在您遇到冲突之前可以受理多少用户？总共有多少个冲突？使用这些数据来评定您站点的命名约定，并给出改进建议。</span></p>
<p>A：这也是开放式的问题了。需要在自己的实际管理经验中总结，而且还必须是在管理众多用户的情况下才能理解到这个含义。</p>
<p>那就拿我们公司的邮件帐号命名来说，我们一般采取名字拼音首字母+姓全拼音的方式。比如我的邮件名字就是wgzhao。目前来看，重复的几率不大。这样命名似乎也是一个常用的方式。当然对于采取也写企业级邮件系统，比如Domino的，他们的命名采取类似LDAP数据库的分级方式。我了解到的是在大部分银行内部邮件是这样的，而且似乎采取Domino作为邮件服务器的都是这样，包括IBM本身。</p>
<p><span style="color: #ff0000;">♥♥ E6.7 编写一个脚本，帮助监视/etc/passwd文件是否正常（除非您开动脑筋，否则b和e需要超级用户权限）<br />
a) 找出有UID 0的所有项<br />
b) 找出没有口令的所有项（需要/etc/shadow文件)<br />
c) 找出有重复UID的所有项<br />
d) 找出有重复登录名的所有项<br />
e) 找出没有作废日期的所有项(需要/etc/shadow文件)</span></p>
<p>A：每一个要求，基本上就是一条指令，我就分别写好了。</p>
<p>a)  awk -F: &#8216;{ if ($3 == 0) print $0}&#8217; /etc/passwd</p>
<p>b) 题目的意思似乎是不想用到超级用户权限，那么使用sudo算不算呢？好吧，加点难度，sudo也不用。判断用户是否没有口令，一般来说如果/etc/passwd秘密一项没有占位符，也就是为空。或者/etc/shadow里密码一项为空。这都表示帐号没有密码。为了统一起来，我们可以把标准帐号挨个尝试，如果不需要密码就能su过去，那就应该是没有密码，否则就是有密码。对于Fedora/RedHat而言，标准帐号从500开始。Debian/Ubuntu则从1000开始。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{ if ($3 &gt; 499) print $1}'</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
<span style="color: #c20cb9; font-weight: bold;">su</span> - <span style="color: #007800;">$i</span>  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>EOF
&nbsp;
EOF
<span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #c20cb9; font-weight: bold;">getent</span> <span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>c) </pre>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;the following uid(s) is/are duplicated&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print $3}'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-n</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #660033;">-d</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

<p>d)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;the following name(s) is/are duplicated&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print $1}'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span>  <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">sort</span>  <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #660033;">-d</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

<p>e) 这个暂时想不出不用root权限如何获得任意帐号的过期信息。大家有什么办法吗？如果root权限就办好多了，比如下面这样：<br />
awk -F: '{if ( $8 > 0) print $0 }' /etc/shadow</p>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/12/03/lah-chapter6-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/12/03/lah-chapter6-questions-key.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第五章习题实践</title>
		<link>http://blog.wgzhao.com/2009/11/27/lah-chapter5-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/11/27/lah-chapter5-questions-key.html#comments</comments>
		<pubDate>Fri, 27 Nov 2009 13:21:17 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[我读我书]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[sa]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/2009/11/27/lah-chapter5-questions-key.html</guid>
		<description><![CDATA[这一章的习题比较简单，虽然难点是ACL，但是似乎作者很讨厌ACL，因此习题里，一个有关ACL的问题都没有。

E5.1 什么是umask？创建一个umask，对于属组或者其他人什么权限也不给。
A：umask是一个三位八进制数字表示的变量，用来给shell设定新创建的文件的默认权限。
设置umask为0077即可，如下所示：


wgzhao@wgzhao-nb:/tmp$ umask 0077
wgzhao@wgzhao-nb:/tmp$ touch test
wgzhao@wgzhao-nb:/tmp$ ls -l test
-rw------- 1 wgzhao wgzhao 0 2009-11-27 20:11 test

E5.2 硬链接和符号（软）链接之间有什么不同？什么时候适合用哪一种链接？
A： 区别在于：硬链接是直接引用，而符号链接是通过名称来进行引用，符号链接跟他们指向的文件是不同的。
看你要做什么用，如果你仅仅只是为了达到一种“快捷访问”，或者创建多路劲访问文件的便利，那么使用符号链接无疑是最佳的。但是如果你想获得一个文件的完整拷贝，并能同步更新，而且还能在原始文件被删除后不影响链接文件，那么硬链接就是你需要的。
大部分情况下，你可以需要的仅仅是符号链接。
♥ E5.3 阅读/etc/fstab文件的手册页。编写一行配置，在启动时自动安装一个Windows NTFS分区 /dev/hda1.使用/mnt/win_c作为安装点。
A：编写/etc/fstab不是难题，关键是看你的Linux是如何实现对NTFS访问的，有的可能是ntfs-3g,有的可能是内核直接支持，在fstab文件上反映出来的区别在域文件系统类型这一项，大致如下：
/dev/hda1    /mnt/win_c   ntfs-3g defaults 0 0
♥ E5.4 在安装Linux系统的时候，“Foobar Linux”发行版使用下面的默认配置：

/       100MB
/var    50MB
/boot   10MB
&#60; swap &#62;  128MB
/usr    剩余空间
在一个繁忙的服务器上采取这样的安排会有什么样的潜在问题？
A： 看到这些数字，我以为我回到了硬盘只有2G的年代。但是不管在什么年代，分区对系统而言要考虑当前足够可用，以后发展还能适用的原则。
上面的分区，首先swap分区不太大。当然我估计这机器内存也就是64M的样子。/var分的过小。繁忙的服务器，得要看它是忙什么了，如果是mail之类的，那/var肯定立刻就被塞满了，因为默认情况下，邮件队列在/var/spool目录下。
♥ E5.5 为什么说有些分区（比如/var/,/home和交换分区）防盗一个和其他数据文件和应用程序不同的单独驱动器上是一个好主意？ [...]]]></description>
			<content:encoded><![CDATA[<p>这一章的习题比较简单，虽然难点是ACL，但是似乎作者很讨厌ACL，因此习题里，一个有关ACL的问题都没有。<br />
<span style="color: #cc0000;"><br />
E5.1 什么是umask？创建一个umask，对于属组或者其他人什么权限也不给。</span><br />
A：umask是一个三位八进制数字表示的变量，用来给shell设定新创建的文件的默认权限。<br />
设置umask为0077即可，如下所示：<br />
<span id="more-1954"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">wgzhao<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:<span style="color: #000000; font-weight: bold;">/</span>tmp$ <span style="color: #7a0874; font-weight: bold;">umask</span> 0077
wgzhao<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:<span style="color: #000000; font-weight: bold;">/</span>tmp$ <span style="color: #c20cb9; font-weight: bold;">touch</span> <span style="color: #7a0874; font-weight: bold;">test</span>
wgzhao<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:<span style="color: #000000; font-weight: bold;">/</span>tmp$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #7a0874; font-weight: bold;">test</span>
<span style="color: #660033;">-rw-------</span> <span style="color: #000000;">1</span> wgzhao wgzhao <span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">11</span> <span style="color: #7a0874; font-weight: bold;">test</span></pre></div></div>

<p><span style="color: #cc0000;">E5.2 硬链接和符号（软）链接之间有什么不同？什么时候适合用哪一种链接？</span><br />
A： 区别在于：硬链接是直接引用，而符号链接是通过名称来进行引用，符号链接跟他们指向的文件是不同的。<br />
看你要做什么用，如果你仅仅只是为了达到一种“快捷访问”，或者创建多路劲访问文件的便利，那么使用符号链接无疑是最佳的。但是如果你想获得一个文件的完整拷贝，并能同步更新，而且还能在原始文件被删除后不影响链接文件，那么硬链接就是你需要的。<br />
大部分情况下，你可以需要的仅仅是符号链接。</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E5.3 阅读/etc/fstab文件的手册页。编写一行配置，在启动时自动安装一个Windows NTFS分区 /dev/hda1.使用/mnt/win_c作为安装点。</span></p>
<p>A：编写/etc/fstab不是难题，关键是看你的Linux是如何实现对NTFS访问的，有的可能是ntfs-3g,有的可能是内核直接支持，在fstab文件上反映出来的区别在域文件系统类型这一项，大致如下：<br />
/dev/hda1    /mnt/win_c   ntfs-3g defaults 0 0</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E5.4 在安装Linux系统的时候，“Foobar Linux”发行版使用下面的默认配置：<br />
</span></p>
<blockquote><p><span style="color: #cc0000;">/       100MB<br />
/var    50MB<br />
/boot   10MB<br />
&lt; swap &gt;  128MB<br />
/usr    剩余空间</span></p></blockquote>
<p><span style="color: #cc0000;">在一个繁忙的服务器上采取这样的安排会有什么样的潜在问题？</span></p>
<p>A： 看到这些数字，我以为我回到了硬盘只有2G的年代。但是不管在什么年代，分区对系统而言要考虑当前足够可用，以后发展还能适用的原则。<br />
上面的分区，首先swap分区不太大。当然我估计这机器内存也就是64M的样子。/var分的过小。繁忙的服务器，得要看它是忙什么了，如果是mail之类的，那/var肯定立刻就被塞满了，因为默认情况下，邮件队列在/var/spool目录下。</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E5.5 为什么说有些分区（比如/var/,/home和交换分区）防盗一个和其他数据文件和应用程序不同的单独驱动器上是一个好主意？ /tmp呢？对于列出的每一种文件系统给出针对性的理由。</span></p>
<p>A：一直以来，分区我坚持三分开原则，也就是系统，应用，数据三者分开。这样不会任何以防的损坏导致另外一方出现灾难性故障。比如系统分区坏了，重建系统就好了，应用和数据不需要变动。同样的，应用坏了，重建应用，数据和系统不用变化。<br />
想想Windows下痛苦的注册表，你就会理解三者分开的好处了。</p>
<p>对于系统本身而言，处于其他方面的考虑，还可以细分，比如把/usr 单分，可以提高性能和安全级别，如何做到？首先单分后，挂载/usr分区，我们可以增加noatime的参数。因为/usr下是系统绝大部分库和程序，属于静态数据，atime属性对此没有意义。我们设置还可以把/usr作成别的文件系统，比如tmpfs来增加速度。另外，可以把/usr挂载为只读，以提高效率。<br />
/home单独分区的意义当然就很多了，安全，配额都是重要的因素。<br />
至于/tmp，在我个人的经验中，很少单独分区，除非用户有特别说明和要求。我看到的往往是单独分区后，因为过小，而导致/tmp空间不足的负面效果。所以/tmp是否单独分区，还真的需要和实际的应用结合起来考虑，不能单一从操作系统上考虑。</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E5.6 写一个脚本，找到一个文件系统上所有的硬链接。</span></p>
<p>A： 需要利用的一个技巧是ls -l命令能给出文件的链接数（就是第二列数值），如果大于1，则表示有硬链接文件。然后利用find查找出是这个inode的所有文件。因为硬链接文件的inode一致。<br />
所以脚本分两个两个部分，第一个部分是找出所有链接数大于2的inode，形成列表。<br />
第二步找出等于这些inode的文件。但是我们可以用一行脚本来完成这个操作，类似如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">wgzhao<span style="color: #000000; font-weight: bold;">@</span>wgzhao-nb:<span style="color: #000000; font-weight: bold;">/</span>bin$ <span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>bin <span style="color: #660033;">-type</span> f <span style="color: #660033;">-ls</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{if ($4 &gt;1) print $1,$11}'</span>
<span style="color: #000000;">1628730</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bzip2</span>
<span style="color: #000000;">1628730</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bunzip2</span>
<span style="color: #000000;">1628730</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bzcat</span>
<span style="color: #000000;">1622053</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>uncompress
<span style="color: #000000;">1622053</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">gunzip</span></pre></div></div>

<p>首先利用fin -type f 的参数，保证只寻找正规文件。然后利用find的-ls参数，等价于ls -ldis，这样就把inode和链接数打印出来了，接着将结果交给awk处理，awk判断第四列（链接数）是否大于1，如果大于，则把inode和文件名打印出来。当然可以打印更多的东西。你只需要把/bin目录换成你需要的目录就可以了。</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E5.7 给出完成下面任务的命令：</span></p>
<ol>
<li>把README的权限设置为对属主有读写权，而其他每个人有读权</li>
<li>在不需要改变（或者知道）目前权限的情况下，打开一个文件的setuid位；</li>
<li>里出当前目录的内容，按照修改时间排序，把最近修改的文件放在最后；</li>
<li>将一个叫做shared的文件的属组从“user”改成“friends”。</li>
</ol>
<p>A：因为简单，直接给出演示的答案了。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/*</span>第一问<span style="color: #000000; font-weight: bold;">*/</span>
<span style="color: #007800;">$touch</span> README
<span style="color: #007800;">$chmod</span> <span style="color: #000000;">644</span> README 
<span style="color: #007800;">$ls</span> <span style="color: #660033;">-l</span> README 
<span style="color: #660033;">-rw-r--r--</span> <span style="color: #000000;">1</span> wgzhao wgzhao <span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">12</span> README
<span style="color: #000000; font-weight: bold;">/*</span>第二问<span style="color: #000000; font-weight: bold;">*/</span>
<span style="color: #007800;">$chmod</span> u+xs README 
<span style="color: #007800;">$ls</span> <span style="color: #660033;">-l</span> README 
<span style="color: #660033;">-rwsr--r--</span> <span style="color: #000000;">1</span> wgzhao wgzhao <span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">12</span> README
<span style="color: #000000; font-weight: bold;">/*</span>第三问<span style="color: #000000; font-weight: bold;">*/</span>
<span style="color: #007800;">$ls</span> <span style="color: #660033;">-lt</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-n</span>
drwx------ <span style="color: #000000;">2</span> root   root   <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:<span style="color: #000000;">29</span> orbit-root
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:03 keyring-5juJ1c
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:03 pulse-wZb2dv9SzM6y
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:03 seahorse-xvIvYW
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:03 ssh-TjUZjM2036
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">11</span>:04 virtual-wgzhao.z5uZOh
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">19</span>:<span style="color: #000000;">26</span> plugtmp
drwx------ <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">19</span>:<span style="color: #000000;">35</span> orbit-wgzhao
drwxr-xr-x <span style="color: #000000;">2</span> wgzhao wgzhao <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">19</span>:<span style="color: #000000;">43</span> hsperfdata_wgzhao
<span style="color: #660033;">-rwsr--r--</span> <span style="color: #000000;">1</span> wgzhao wgzhao    <span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">12</span> README
<span style="color: #000000; font-weight: bold;">/*</span>第四问，因为系统上没有friends组，用www-data代替<span style="color: #000000; font-weight: bold;">*/</span>
<span style="color: #007800;">$sudo</span> <span style="color: #c20cb9; font-weight: bold;">chgrp</span> www-data  README
<span style="color: #007800;">$ls</span> <span style="color: #660033;">-l</span> README 
<span style="color: #660033;">-rwxr--r--</span> <span style="color: #000000;">1</span> wgzhao www-data <span style="color: #000000;">0</span> <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-<span style="color: #000000;">27</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">12</span> README</pre></div></div>

<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/11/27/lah-chapter5-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/11/27/lah-chapter5-questions-key.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第四章习题实践</title>
		<link>http://blog.wgzhao.com/2009/11/27/lah-chapter4-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/11/27/lah-chapter4-questions-key.html#comments</comments>
		<pubDate>Fri, 27 Nov 2009 05:47:33 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[我读我书]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[ps]]></category>
		<category><![CDATA[sa]]></category>
		<category><![CDATA[top]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/2009/11/27/lah-chapter4-questions-key.html</guid>
		<description><![CDATA[E4.1 解释一个文件的UID和一个正在运行的进程的真实UID以及有效UID之间的关系。除了文件的访问控制外，进程的有效UID有什么用途？
A： 大部分情况下，文件的UID和运行的真实UID以及有效UID是一致的。但是对于setuid程序而言。进程的真实UID和有效UID就有区别了。比如/usr/bin/passwd程序。它的属主是root（UID=0），如果一个用户（UID=1000)运行它，那么真实UID为1000，但是有效UID则为0。有效UID除了文件访问控制外，还能提升当前运行程序的“临时特权”。

E4.2 假定您所负责的站点中，有一个用户已经启动恶劣一个长期运行的进程，它消耗了机器的很大一部分资源。


您如何意识到某一个进程正在消耗资源？

假定异常的进程可能是合法的，不应该杀死它。给出您要把它“冻结”起来（在您调查期间，暂时停止它的运行）应该使用的命令？
随后，您发现这个进程属于 您的老板，必须继续运行下去。给出您要继续执行这个任务应该使用的命令。
另一种可能是假定需要杀死这个进程。您会发送什么信号？为什么？如果您要保证这个进程确实已经被杀死了，该怎么做？

A： 查看uptime，发现复杂高于平常，然后查看top结果，能找到异常的进程。
对于不能马上杀死的异常进程，我们可以采取暂定的方式来临时冻结进程，利用
kill -STOP pid
指令来冻结进程。
调查清楚后，如果想继续运行该进程，则使用
kill -CONT pid
来恢复运行。
如果想杀死，可以先尝试
kill -TERM pid
的方式来温柔的杀死，如果不凑效，则利用野蛮杀死法
kill -9 pid
然后通过ps指令查看该进程是否还在。如果不在，则表示已经杀死了。
E4.3 找出一个能导致内存泄漏的进程（如果手头没有，就自己写一个）。用ps或者top来监视程序程序运行时内存的使用情况。
A： 这一类的问题，在实际的工作中遇到过一些，绝大部分都是java程序，因为内存没有回收，导致内存的使用不断的增加，用完内存的一定比列后（由swappiness值决定），继续使用swap值，最后导致系统出现OOM（Out-Of-Memory)。
♥ E4.4 编写一个处理ps输出的Perl脚本，确定在系统上正在运行的进程总的VSZ和RSS值。这些数字和系统物理内存和交换空间的实际量有什么关系？
A：仅仅是获得VSZ和RSS值的总和，没有必要用到perl这种方式吧（其实是我对perl一窍不通），直接awk也能处理。下面是一行指令：
ps aux &#124;awk &#8216;BEGIN{vsz = 0;rss = 0;print &#8220;vsz \t rss&#8221;} {vsz+=$5;rss+=$6} END{print vsz,rss}&#8217;
下面是我机器上的输出结果：
$ ps aux &#124;awk &#8216;BEGIN{vsz = 0;rss = 0;print &#8220;vsz \t rss&#8221;}\
{vsz+=$5;rss+=$6} END{print vsz,rss}&#8217;
vsz      rss
3310800 830324
要注意一下单位。vsz是进程的虚拟大小，KiB单位。而rss则是驻留大小，KiB单位。因此，我们转换一下。
$ ps aux &#124;awk &#8216;BEGIN{vsz = 0;rss = 0;print [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #cc0000;">E4.1 解释一个文件的UID和一个正在运行的进程的真实UID以及有效UID之间的关系。除了文件的访问控制外，进程的有效UID有什么用途？</span></p>
<p>A： 大部分情况下，文件的UID和运行的真实UID以及有效UID是一致的。但是对于setuid程序而言。进程的真实UID和有效UID就有区别了。比如/usr/bin/passwd程序。它的属主是root（UID=0），如果一个用户（UID=1000)运行它，那么真实UID为1000，但是有效UID则为0。有效UID除了文件访问控制外，还能提升当前运行程序的“临时特权”。<br />
<span id="more-1950"></span></p>
<p><span style="color: #cc0000;">E4.2 假定您所负责的站点中，有一个用户已经启动恶劣一个长期运行的进程，它消耗了机器的很大一部分资源。<br />
</span></p>
<ol>
<li><span style="color: #cc0000;">您如何意识到某一个进程正在消耗资源？<br />
</span></li>
<li><span style="color: #cc0000;">假定异常的进程可能是合法的，不应该杀死它。给出您要把它“冻结”起来（在您调查期间，暂时停止它的运行）应该使用的命令？</span></li>
<li><span style="color: #cc0000;">随后，您发现这个进程属于 您的老板，必须继续运行下去。给出您要继续执行这个任务应该使用的命令。</span></li>
<li><span style="color: #cc0000;">另一种可能是假定需要杀死这个进程。您会发送什么信号？为什么？如果您要保证这个进程确实已经被杀死了，该怎么做？</span></li>
</ol>
<p>A： 查看uptime，发现复杂高于平常，然后查看top结果，能找到异常的进程。<br />
对于不能马上杀死的异常进程，我们可以采取暂定的方式来临时冻结进程，利用<br />
kill -STOP pid<br />
指令来冻结进程。<br />
调查清楚后，如果想继续运行该进程，则使用<br />
kill -CONT <em>pid</em><br />
来恢复运行。<br />
如果想杀死，可以先尝试<br />
kill -TERM <em>pid</em><br />
的方式来温柔的杀死，如果不凑效，则利用野蛮杀死法<br />
kill -9 <em>pid</em><br />
然后通过ps指令查看该进程是否还在。如果不在，则表示已经杀死了。</p>
<p><span style="color: #cc0000;">E4.3 找出一个能导致内存泄漏的进程（如果手头没有，就自己写一个）。用ps或者top来监视程序程序运行时内存的使用情况。</span></p>
<p>A： 这一类的问题，在实际的工作中遇到过一些，绝大部分都是java程序，因为内存没有回收，导致内存的使用不断的增加，用完内存的一定比列后（由swappiness值决定），继续使用swap值，最后导致系统出现OOM（Out-Of-Memory)。</p>
<p><span style="color: #ff0000;">♥ </span><span style="color: #cc0000;">E4.4 编写一个处理ps输出的Perl脚本，确定在系统上正在运行的进程总的VSZ和RSS值。这些数字和系统物理内存和交换空间的实际量有什么关系？</span></p>
<p>A：仅仅是获得VSZ和RSS值的总和，没有必要用到perl这种方式吧（其实是我对perl一窍不通），直接awk也能处理。下面是一行指令：<br />
ps aux |awk &#8216;BEGIN{vsz = 0;rss = 0;print &#8220;vsz \t rss&#8221;} {vsz+=$5;rss+=$6} END{print vsz,rss}&#8217;</p>
<p>下面是我机器上的输出结果：<br />
$ ps aux |awk &#8216;BEGIN{vsz = 0;rss = 0;print &#8220;vsz \t rss&#8221;}\<br />
{vsz+=$5;rss+=$6} END{print vsz,rss}&#8217;<br />
vsz      rss<br />
3310800 830324<br />
要注意一下单位。vsz是进程的虚拟大小，KiB单位。而rss则是驻留大小，KiB单位。因此，我们转换一下。<br />
$ ps aux |awk &#8216;BEGIN{vsz = 0;rss = 0;print &#8220;vsz(GiB) \t rss(MiB)&#8221;} \<br />
{vsz+=$5;rss+=$6} END{print vsz / 1024 / 1024 ,rss  / 1024 }&#8217;<br />
vsz(GiB)   rss(MiB)<br />
3.15749 811.973</p>
<p>我机器的内存是：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">free</span> <span style="color: #660033;">-m</span>
             total       used       <span style="color: #c20cb9; font-weight: bold;">free</span>     shared    buffers     cached
Mem:          <span style="color: #000000;">2768</span>       <span style="color: #000000;">1593</span>       <span style="color: #000000;">1175</span>          <span style="color: #000000;">0</span>        <span style="color: #000000;">168</span>        <span style="color: #000000;">662</span>
-<span style="color: #000000; font-weight: bold;">/</span>+ buffers<span style="color: #000000; font-weight: bold;">/</span>cache:        <span style="color: #000000;">763</span>       <span style="color: #000000;">2005</span>
Swap:         <span style="color: #000000;">3169</span>          <span style="color: #000000;">0</span>       <span style="color: #000000;">3169</span></pre></div></div>

<p>VSZ 是进程使用的虚拟内存大小. （包括内存和SWAP空间上）</p>
<p>RSS 指的是驻留在内存中的大小。<br />
大部分程序都使用共享库，注意VSZ和RSS会包含共享库的部分。如果多个进程都使用相同的共享库，共享部分的内存会分别计入不同的进程内存。所以所有进程RSS部分累加可能会超出物理内存总数。<br />
所以，我认为RSS和VSZ于物理内存以及交换空间没有什么关系，因为其中共享库的内存大小重复计算了。在一些资源紧张的机器上，这两个值可能都超过了内存的总和，比如：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$  <span style="color: #c20cb9; font-weight: bold;">ps</span> aux <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'BEGIN{vsz = 0;rss = 0;print &quot;vsz(GiB) \t rss(MiB)&quot;}  \
  {vsz+=$5;rss+=$6} END{print vsz / 1024 / 1024 ,rss  / 1024  }'</span>; <span style="color: #c20cb9; font-weight: bold;">free</span> <span style="color: #660033;">-m</span>
vsz<span style="color: #7a0874; font-weight: bold;">&#40;</span>GiB<span style="color: #7a0874; font-weight: bold;">&#41;</span> 	 rss<span style="color: #7a0874; font-weight: bold;">&#40;</span>MiB<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">62.7103</span> <span style="color: #000000;">18703.7</span>
             total       used       <span style="color: #c20cb9; font-weight: bold;">free</span>     shared    buffers     cached
Mem:          <span style="color: #000000;">2027</span>       <span style="color: #000000;">1967</span>         <span style="color: #000000;">59</span>          <span style="color: #000000;">0</span>         <span style="color: #000000;">20</span>       <span style="color: #000000;">1750</span>
-<span style="color: #000000; font-weight: bold;">/</span>+ buffers<span style="color: #000000; font-weight: bold;">/</span>cache:        <span style="color: #000000;">195</span>       <span style="color: #000000;">1831</span>
Swap:         <span style="color: #000000;">4094</span>        <span style="color: #000000;">121</span>       <span style="color: #000000;">3972</span></pre></div></div>

<p>这里，vsz的总和达到了62GiB，远超过6G的内存总和。而rss的总和也达到了1.8G。<br />
不过从我观察到的数据来说，大部分情况下，rss的总和等于buffers + cached值，但是否正确，还需要实际的数据和理论双层检验。</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=8af81ecb-e340-8880-b062-1a453a0b17ee" alt="" /></div>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/11/27/lah-chapter4-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/11/27/lah-chapter4-questions-key.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统管理技术手册第三章习题实践</title>
		<link>http://blog.wgzhao.com/2009/11/26/lah-chapter3-questions-key.html</link>
		<comments>http://blog.wgzhao.com/2009/11/26/lah-chapter3-questions-key.html#comments</comments>
		<pubDate>Thu, 26 Nov 2009 12:10:40 +0000</pubDate>
		<dc:creator>wgzhao</dc:creator>
				<category><![CDATA[Linux技术]]></category>
		<category><![CDATA[lah]]></category>
		<category><![CDATA[linux系统管理技术手册]]></category>
		<category><![CDATA[sa]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://mlsx.xplore.cn/?p=1945</guid>
		<description><![CDATA[E3.1  使用带有-perm选项的find命令在您的系统上找到5个setuid文件。对于每个文件，试述为什么对于让命令正确发挥其功能来说，setuid机制是必要的。
A：有关find的-perm选项的说明，可以看我之前的帖子，里面描述了如何正确设置perm参数来查找setuid/setgid文件。
$ find /usr/bin /bin -type f -perm +6000

/usr/bin/screen
/usr/bin/X
/usr/bin/passwd
/usr/bin/mail-lock
/usr/bin/newgrp
/usr/bin/kgrantpty
......
/usr/bin/pkexec
/usr/bin/xterm
/usr/bin/kpac_dhcp_helper
/usr/bin/ssh-agent
/usr/bin/crontab
/usr/bin/sudo
/usr/bin/chage
/usr/bin/mlocate
/usr/bin/fileshareset
/usr/bin/chfn
/usr/bin/bsd-write
/usr/bin/mtr
/usr/bin/traceroute6.iputils
/usr/bin/mail-touchlock
/usr/bin/arping
/usr/bin/expiry
/usr/bin/sudoedit
/bin/ping
/bin/ping6
/bin/umount
/bin/fusermount
/bin/mount
/bin/su

使用setuid/setgid位无非就是因为那些程序运行普通用户运行，但是又需要root权限来对系统文件做一定的更改。比如/usr/bin/passwd文件，它是用来修改用户的口令。而我们知道缺省情况下，口令密文保存在/etc/shadow文件里。而这个文件仅仅对root可读。所以为了使得普通用户修改口令时，能修改/etc/shadow文件，不得不让/usr/bin/passwd有setuid权限。
在比如/usr/bin/crontab文件。如果没有setgid位，执行行，会给出下面的错误：

$ crontab  -e
/var/spool/cron/crontabs/wgzhao: Permission denied
&#160;
# ls -ld /var/spool/cron/crontabs/
drwx-wx--T 2 root crontab 4096 2009-09-16 16:16 /var/spool/cron/crontabs/

这是因为crontab自定义配置文件保存在/var/spool/cron/crontabs目录下，以用户名为文件名。而crontabs目录的许可如上面ls的结果所示，对于非root用户和crontab组成员，是无法进入该目录的。因此我们至少需要crontab许可。
所以，/usr/bin/crontab文件的许可就是下面这个样子：

 ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab 31712 2009-09-15 21:12 /usr/bin/crontab

在组crontab许可位上设置了setgid位。保证运行crontab指令时，能获得crontab组身份，从而能保存文件到/var/spool/cron/crontabs/目录下。
其他的文件，理由类似，就不再一一描述。
E3.2 创建三个“出人意料的废话”式口令词，但是要保密。通过运行md5sum程序处理这三个口令词，报告结果。为什么公开MD5结果是安全的。
A：创建一个安全的密码不是一件容易的事情。太困难会记不住，一旦忘记，等于这个密码没有意义。太简单就容易猜解或者暴力破解。所以目前有一些工具专门用来生成一些固定长处的密码，比如pwgen,apg,gpw等工具都能做这些事情。该书提到了一个方法就是用一些平常不敢说的，或者没有任何意义的一句话的单词首字母拼接起来。
比如你很痛恨某一个人，但是当面又不敢说，这样你就可以把诅咒他/她的话变成密码短语。英语不是我们的母语。不过我们可以使用拼音字母组合，这实际上比单词拼接更难猜解。因为当前大部分密码字典都是基于英语单词的。比如我们可以创建这样的密码：
wjsbg-s-nwdmm
如果我不解释，恐怕要猜测上面的意思很难，其实去掉两个-符号，上面的字母是“我就是不告诉你我的密码”的拼音首字母拼接。
当然，还可以更复杂的，比如：
7y23hgl1tmm
这是“7月23号改了一台密码”的拼音首字母拼接。
上面两个密码的MD5结果如下：
wjsbg-s-nwdmm  08a71fd8b1e7dfeebb6c6990e2e9f1e0
7y23hgl1tmm      aadf738b3f80d5da52a71a4ef23969ba
实际上md5后的结果比密码明文更难猜解。而且md5属于哈希方式，不存在逆向破解。只能是由明文生成密文后去匹配。破解难度很大。
E3.3  列举一系列修改某个用户口令的命令，展示如何掩盖修改的痕迹。假定您只有sudo的权利（允许使用除shell或者su之外的所有命令）
A：修改密码无非就是修改/etc/shadow中的密文字符串，可以通过指令，也可以通过手工编辑。但是需要解决的一个问题是如何掩盖修改痕迹。
如果直接使用sudo /usr/bin/passwd foo 这样的方式来修改foo的密码，那么系统日志会有类似下面的记录：
Dec 7 10:10:24 work sudo : root: TTY=pts/3; PWD=/root; USER=root; COMMAND=/usr/bin/passwd foo
那这样的话，管理员就会知道你恶意修改了密码。
So，可以有两个办法，第一个是在执行修改密码之前，利用已有的许可，停止系统日志服务。
sudo /etc/init.d/syslogd [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">E3.1  使用带有-perm选项的find命令在您的系统上找到5个setuid文件。对于每个文件，试述为什么对于让命令正确发挥其功能来说，setuid机制是必要的。</span></p>
<p>A：有关find的-perm选项的说明，可以看我<a href="http://mlsx.xplore.cn/2008/05/06/find-perm-parameters-of-a-simple-way-to-remember.html">之前的帖子</a>，里面描述了如何正确设置perm参数来查找setuid/setgid文件。</p>
<p><span id="more-1945"></span>$ find /usr/bin /bin -type f -perm +6000</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">screen</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>X
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mail-lock
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>newgrp
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>kgrantpty
......
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>pkexec
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>xterm
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>kpac_dhcp_helper
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ssh-agent</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>crontab
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sudo</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>chage
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mlocate
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>fileshareset
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">chfn</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>bsd-write
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mtr
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>traceroute6.iputils
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mail-touchlock
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>arping
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>expiry
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>sudoedit
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ping</span>
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ping6
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">umount</span>
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>fusermount
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">mount</span>
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">su</span></pre></div></div>

<p>使用setuid/setgid位无非就是因为那些程序运行普通用户运行，但是又需要root权限来对系统文件做一定的更改。比如/usr/bin/passwd文件，它是用来修改用户的口令。而我们知道缺省情况下，口令密文保存在/etc/shadow文件里。而这个文件仅仅对root可读。所以为了使得普通用户修改口令时，能修改/etc/shadow文件，不得不让/usr/bin/passwd有setuid权限。<br />
在比如/usr/bin/crontab文件。如果没有setgid位，执行行，会给出下面的错误：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ crontab  <span style="color: #660033;">-e</span>
<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>spool<span style="color: #000000; font-weight: bold;">/</span>cron<span style="color: #000000; font-weight: bold;">/</span>crontabs<span style="color: #000000; font-weight: bold;">/</span>wgzhao: Permission denied
&nbsp;
<span style="color: #666666; font-style: italic;"># ls -ld /var/spool/cron/crontabs/</span>
drwx-wx--T <span style="color: #000000;">2</span> root crontab <span style="color: #000000;">4096</span> <span style="color: #000000;">2009</span>-09-<span style="color: #000000;">16</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">16</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>spool<span style="color: #000000; font-weight: bold;">/</span>cron<span style="color: #000000; font-weight: bold;">/</span>crontabs<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>这是因为crontab自定义配置文件保存在/var/spool/cron/crontabs目录下，以用户名为文件名。而crontabs目录的许可如上面ls的结果所示，对于非root用户和crontab组成员，是无法进入该目录的。因此我们至少需要crontab许可。<br />
所以，/usr/bin/crontab文件的许可就是下面这个样子：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>crontab
<span style="color: #660033;">-rwxr-sr-x</span> <span style="color: #000000;">1</span> root crontab <span style="color: #000000;">31712</span> <span style="color: #000000;">2009</span>-09-<span style="color: #000000;">15</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">12</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>crontab</pre></div></div>

<p>在组crontab许可位上设置了setgid位。保证运行crontab指令时，能获得crontab组身份，从而能保存文件到/var/spool/cron/crontabs/目录下。<br />
其他的文件，理由类似，就不再一一描述。</p>
<p><span style="color: #ff0000;">E3.2 创建三个“出人意料的废话”式口令词，但是要保密。通过运行md5sum程序处理这三个口令词，报告结果。为什么公开MD5结果是安全的。</span></p>
<p>A：创建一个安全的密码不是一件容易的事情。太困难会记不住，一旦忘记，等于这个密码没有意义。太简单就容易猜解或者暴力破解。所以目前有一些工具专门用来生成一些固定长处的密码，比如pwgen,apg,gpw等工具都能做这些事情。该书提到了一个方法就是用一些平常不敢说的，或者没有任何意义的一句话的单词首字母拼接起来。</p>
<p>比如你很痛恨某一个人，但是当面又不敢说，这样你就可以把诅咒他/她的话变成密码短语。英语不是我们的母语。不过我们可以使用拼音字母组合，这实际上比单词拼接更难猜解。因为当前大部分密码字典都是基于英语单词的。比如我们可以创建这样的密码：</p>
<p>wjsbg-s-nwdmm</p>
<p>如果我不解释，恐怕要猜测上面的意思很难，其实去掉两个-符号，上面的字母是“我就是不告诉你我的密码”的拼音首字母拼接。</p>
<p>当然，还可以更复杂的，比如：</p>
<p>7y23hgl1tmm</p>
<p>这是“7月23号改了一台密码”的拼音首字母拼接。</p>
<p>上面两个密码的MD5结果如下：</p>
<p>wjsbg-s-nwdmm  08a71fd8b1e7dfeebb6c6990e2e9f1e0</p>
<p>7y23hgl1tmm      aadf738b3f80d5da52a71a4ef23969ba</p>
<p>实际上md5后的结果比密码明文更难猜解。而且md5属于哈希方式，不存在逆向破解。只能是由明文生成密文后去匹配。破解难度很大。</p>
<p><span style="color: #ff0000;">E3.3  列举一系列修改某个用户口令的命令，展示如何掩盖修改的痕迹。假定您只有sudo的权利（允许使用除shell或者su之外的所有命令）</span></p>
<p>A：修改密码无非就是修改/etc/shadow中的密文字符串，可以通过指令，也可以通过手工编辑。但是需要解决的一个问题是如何掩盖修改痕迹。</p>
<p>如果直接使用sudo /usr/bin/passwd foo 这样的方式来修改foo的密码，那么系统日志会有类似下面的记录：</p>
<p>Dec 7 10:10:24 work sudo : root: TTY=pts/3; PWD=/root; USER=root; COMMAND=/usr/bin/passwd foo</p>
<p>那这样的话，管理员就会知道你恶意修改了密码。</p>
<p>So，可以有两个办法，第一个是在执行修改密码之前，利用已有的许可，停止系统日志服务。</p>
<p>sudo /etc/init.d/syslogd stop</p>
<p>然后使用sudo /usr/bin/passwd foo 修改密码。</p>
<p>最后恢复删除现有日志，然后恢复日志服务</p>
<p>sudo /etc/init.d/syslogd start</p>
<p>另外一个办法就是书上提到的。虽然限制了shell的使用，但是它是通过指定shell的位置来设定的。我们可以通过拷贝一个shell到某一个“奇怪”的目录，然后sudo到这个shell，变成root，然后在passwd foo来修改密码。而后清空root帐号的history信息。</p>
<p><span style="color: #ff0000;">E3.4 为sudoers配置文件创建两项：</span></p>
<ol>
<li><span style="color: #ff0000;">一项让用户matt,adam和drew负责在printserver这台机器上为打印机服务，消除夹纸，如何重新启动打印机的守护进程；</span></li>
<li><span style="color: #ff0000;">一项让drew、smithgr和jimlane终止学生机房的任务并重启机器。</span></li>
</ol>
<p>A：老实说，对于打印机的服务我不是太了解。因此我只能写出其sudoers的语法，但不能保证真的可以在实际环境中这么用：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Cmnd_Alias <span style="color: #007800;">PRINTING</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>lpc,<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>lprm,<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>cups restart
&nbsp;
Cmnd_Alias <span style="color: #007800;">STU</span>=<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>reboot,<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">kill</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Permissions</span>
&nbsp;
matt,adam,drew printserver = PRINTING
&nbsp;
drew,smithgr,jimlane  <span style="color: #007800;">ALL</span>=STU</pre></div></div>

<p><span style="color: #ff0000;">E3.5  安装sudo，配置成让它把有关误用的邮件发给您。以本地用户和机器名来测试上一个问题中的sudo配置项；验证sudo是否能正确地把日志写到syslog。检查测试在syslog中生成的日志项（需要root权限，很可能还要调整一下/etc/syslog.conf）</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">A：在sudo里，和mail相关的，主要是下面几个参数：</span></span></p>
<dl>
<dt><strong><a name="mail_always">mail_always</a></strong> </dt>
<dd>每次有sudo的使用，就发送邮件给指定用户，缺省是关闭的。</p>
</dd>
<dt><strong><a name="mail_badpass">mail_badpass</a></strong> </dt>
<dd>如果使用sudo的用户没有输入正确的密码，则发送邮件给指定用户，默认关闭。<strong> </strong></p>
</dd>
<dt><strong><a name="mail_no_host">mail_no_host</a></strong> </dt>
<dd>如果设置了的话，邮件发给指定用户，当sudo使用者使用了不允许的命名。缺省关闭。</p>
</dd>
<dt><strong><a name="mail_no_perms">mail_no_perms</a></strong> </dt>
<dd>如果设置了的话，当然sudo使用者使用了不在sudoer里列出或者显式被拒绝的命令时，发送邮件给指定用户。缺省关闭。</p>
</dd>
<dt><strong><a name="mail_no_user">mail_no_user</a></strong> </dt>
<dd>如果sudo使用者不在sudoer列表里，则发送邮件给指定用户。缺省设置了该参数。</p>
</dd>
</dl>
<p>我们可以通过设置mailto 参数来指定邮件接收者，默认是root。另外可以通过设置mailsub来设定邮件的主题。</p>
<div style="float:left;margin:0px 0px 0px 0px;"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="small-count" data-url="http://blog.wgzhao.com/2009/11/26/lah-chapter3-questions-key.html"></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://blog.wgzhao.com/2009/11/26/lah-chapter3-questions-key.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
