📄 makeworld.html
字号:
<p>“选择再次查看<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span>结果”将会在提供给选择之前,显示文件的不同处,就象<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>所做的一样。</p><p>在<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>完成了对系统文件的处理后,你会得到其它的选项。<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>可能会问你是否要重建密码文件,如果你的FreeBSD版本超过5.0,还会问你是否想要执行<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">MAKEDEV</span>(8)</span>,最后带上一个选项删除剩下的临时文件。</p></div><div class="SECT3"><h3 class="SECT3"><a id="AEN30914" name="AEN30914">21.4.11.2. 手册更新</a></h3><p>如果想要手工更新,但不要只是从<tt class="FILENAME">/usr/src/etc</tt>把文件复制<ttclass="FILENAME">/etc</tt>就了事。有些文件是必须先``安装''的。这是因为<ttclass="FILENAME">/usr/src/etc</tt>目录并 <span class="emphasis"><iclass="EMPHASIS">不是</i></span>想像的那样是<ttclass="FILENAME">/etc</tt>目录的一个复制。事实上,有些是文件是<ttclass="FILENAME">/etc</tt>有的,而<tt class="FILENAME">/usr/src/etc</tt>里边没有。</p><p>如果你使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span> (作为推荐),你可以向前跳到<ahref="makeworld.html#UPDATE-DEV">下一节</a>。</p><p>手工做最简单的方式是安装这些文件到一个新的目录,完成后再来查找不同处。</p><div class="WARNING"><blockquote class="WARNING"><p><b>备份你已有的<ttclass="FILENAME">/etc</tt></b>虽然,理论上,没有什么会自动访问这个目录,事情还是做稳操胜当一点。复制已有<tt class="FILENAME">/etc</tt>不到一个安全的地方,如:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cp -Rp /etc /etc.old</kbd></pre><p><var class="OPTION">-R</var>完成递归复制(设者注:即可以复制目录以下的所有内容),<varclass="OPTION">-p</var>保留文件的时间、所属等等。</p></blockquote></div><p>你需要建立的个虚目录(a dummy set of directories )来安装新的<ttclass="FILENAME">/etc</tt>和其它文件。<ttclass="FILENAME">/var/tmp/root</tt>是个不错的选择,除此之外,还有一些子目录是需要的。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mkdir /var/tmp/root</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src/etc</kbd><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">make DESTDIR=/var/tmp/root distrib-dirs distribution</kbd></pre><p>这样就建好了需要的目录结构,然后安装文件。在<ttclass="FILENAME">/var/tmp/root</tt>下建立的大部分子目录是空的,而且要删除掉。最简单的方式是:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /var/tmp/root</kbd><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">find -d . -type d | xargs rmdir 2>/dev/null</kbd></pre><p>这样会删除所有的空目录。(标准的错误信息被重定向到了<ttclass="FILENAME">/dev/null</tt>,以防止关于非空目录的警告。</p><p><tt class="FILENAME">/var/tmp/root</tt>现在包含了应放在<ttclass="FILENAME">/</tt>下某个位置的所有文件。你现在必须仔细检查每一个文件,检测它们与你已有的文件有多大不同。</p><p>注意,有些已经安装在<ttclass="FILENAME">/var/tmp/root</tt>下的文件有个``.''在开头。在写的时候,像这样唯一的文件是<tt class="FILENAME">/var/tmp/root/</tt> 和 <ttclass="FILENAME">/var/tmp/root/root/</tt>里shell启动文件,尽管可能有其它的(依赖于你什么时候读取这个)。确信使用<tt class="COMMAND">ls -a</tt>可以看到它们。</p><p>最简单的方式是使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span> 去比较两个文件:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">diff /etc/shells /var/tmp/root/etc/shells</kbd></pre><p>这会显示出<tt class="FILENAME">/etc/shells</tt> 文件和新的<ttclass="FILENAME">/var/tmp/root/etc/shells</tt>文件的不同处。用这些来决定是合并你已做的变化还是复制你的旧文件过来。</p><div class="TIP"><blockquote class="TIP"><p><b>使用日戳(Time Stamp)命名新的Root(根)目录(<ttclass="FILENAME">/var/tmp/root</tt>),这样你可以轻松地比较两个版本的不同:</b>频繁重建系统意味着必须频繁更新<tt class="FILENAME">/etc</tt>,而这可能会有点烦琐。</p><p>在合并到<ttclass="FILENAME">/etc</tt>的文件里,最新更改的你可以做个复制,由此加快这个(指更新)过程。下边就给出了一个怎样做的主意。</p><div class="PROCEDURE"><ol type="1"><li><p>像平常一样建立系统(Make the world)。当你想更新<tt class="FILENAME">/etc</tt>和其它目录里,给目标目录一个含有当前日期的名字。假如你是1998年2月14日做的,你可以执行下边的:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mkdir /var/tmp/root-19980214</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src/etc</kbd><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">make DESTDIR=/var/tmp/root-19980214 \ distrib-dirs distribution</kbd></pre></li><li><p>如上边列出的,从这个目录合并变化。</p><p>在你完成后,<span class="emphasis"><i class="EMPHASIS">不要</i></span>删除<ttclass="FILENAME">/var/tmp/root-19980214</tt>目录。</p></li><li><p>在你下载了最新版的源码并改过后,执行第一步。这样将得到一个新的目录,可能叫做<ttclass="FILENAME">/var/tmp/root-19980221</tt>(如果等了一周做的升级)。</p></li><li><p>你现在能看到两个目录间的不同了---在隔周的时间里使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span>建立递归diff产生的不同。:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /var/tmp</kbd><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">diff -r root-19980214 root-19980221</kbd></pre><p>一般情况下,这两种间的不同处比<ttclass="FILENAME">/var/tmp/root-19980221/etc</tt>和<ttclass="FILENAME">/etc</tt>之间的不同要小很多。因为不同点更小,也就更容易把这些变化移到你的<tt class="FILENAME">/etc</tt>目录里边。</p></li><li><p>你现在可以删除早先的两个<tt class="FILENAME">/var/tmp/root-*</tt>目录:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">rm -rf /var/tmp/root-19980214</kbd></pre></li><li><p>每次你需要合并这些变化到<tt class="FILENAME">/etc</tt>里,就重复这个流程。</p></li></ol></div><p>你可以使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">date</span>(1)</span>自动产生目录的名称:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">mkdir /var/tmp/root-`date "+%Y%m%d"`</kbd></pre></blockquote></div></div></div><div class="SECT2"><h2 class="SECT2"><a id="UPDATE-DEV" name="UPDATE-DEV">21.4.12. 更新<ttclass="FILENAME">/dev</tt></a></h2><div class="NOTE"><blockquote class="NOTE"><p><b>Note:</b> 如果你正在运行FreeBSD 5.0或更后的版本,你可以安全地跳过这部分。这些版本使用了<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">devfs</span>(5)</span> 来透明地分配设备结点。</p></blockquote></div><p>许多情况下,在有必要更新设备结点时,<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>工具就可以实现,并且可以自动地完成。这里的说明用于怎样手工更新设备结点。</p><p>考虑到安全,这里用的是多步流程。</p><div class="PROCEDURE"><ol type="1"><li><p>复制<tt class="FILENAME">/var/tmp/root/dev/MAKEDEV</tt>到<ttclass="FILENAME">/dev</tt>:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">cp /var/tmp/root/dev/MAKEDEV /dev</kbd></pre><p>如果你使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>去更新<ttclass="FILENAME">/etc</tt>,那么你的<ttclass="FILENAME">MAKEDEV</tt>脚本应该已经被更新过,虽然它不会影响检查(使用<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span>),必要时手工复制一下。</p></li><li><p>现在,给当前的<ttclass="FILENAME">/dev</tt>做个快照。照的时候一定要注意每个文件名的许可(permissions)、所属(ownerships)、主从数字(majorand minor numbers),不必包括日戳(time stamps)。最简单的方式是使用<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">awk</span>(1)</span>提取信息:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /dev</kbd><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out</kbd></pre></li><li><p>重做设备结点:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">sh MAKEDEV all</kbd></pre></li><li><p>这时,把这个目录的另一个快照输出到<ttclass="FILENAME">/var/tmp/dev2.out</tt>。现在检查这两个文件,查找任何你没建立的设备结点。就该不会很多,但是保险一点总是好的。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">diff /var/tmp/dev.out /var/tmp/dev2.out</kbd></pre><p>你可能注意到磁盘分区(disk slice)的差别,它会使像:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">sh MAKEDEV sd0s1</kbd></pre><p>那样的命令重新建立分区入口(slice entries)。 你的具体情况可能不同。</p></li></ol></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN31098" name="AEN31098">21.4.13. 更新<ttclass="FILENAME">/stand</tt></a></h2><div class="NOTE"><blockquote class="NOTE"><p><b>Note:</b>这一步只是为了收尾,可以安全省略。如果你在使用FreeBSD 5.2或更新的版本,<ttclass="FILENAME">/rescue</tt>目录会为用户进行自动更新,使用的是在<tt class="COMMAND">makeinstallworld</tt>期间静态编译地最新的二进制文件,因此也就不用废话更新<ttclass="FILENAME">/stand</tt>的必要性了。</p></blockquote></div><p>为了完成,你可能想额外地更新<ttclass="FILENAME">/stand</tt>里的文件。这些文件由链接到<ttclass="FILENAME">/stand/sysinstall</tt>的二进制文件硬链接组成。这个文件要静态链接,以便没有其它文件系统时(尤其是<tt class="FILENAME">/usr</tt>)被装载时也能工作。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src/release/sysinstall</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make all install</kbd></pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN31115" name="AEN31115">21.4.14. 重启</a></h2><p>现在完成了。在你检查所有内容都放置正确后,你可以重启系统了。 只是简单的<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">shutdown</span>(8)</span>可以这样做:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">shutdown -r now</kbd></pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN31124" name="AEN31124">21.4.15. 结束</a></h2><p>恭喜!你现在成功升级了你的FreeBSD系统。</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -