<?xml version="1.0" encoding="big5"?> <!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN" "../../../share/xml/freebsd45.dtd"> <!-- The FreeBSD Documentation Project The FreeBSD Chinese (Traditional) Documentation Project Original Revision: 1.5 --> <article lang='zh_tw'> <articleinfo> <title>遠端安裝 &os; 作業系統而不必接 Remote Console</title> <author> <firstname>Daniel</firstname> <surname>Gerzo</surname> <affiliation> <address><email>danger@FreeBSD.org</email></address> </affiliation> <!-- 11 April 2008 --> </author> <legalnotice id="trademarks" role="trademarks"> &tm-attrib.freebsd; &tm-attrib.general; </legalnotice> <copyright> <year>2008</year> <holder>The &os; Documentation Project</holder> </copyright> <pubdate>$FreeBSD$</pubdate> <releaseinfo>$FreeBSD$</releaseinfo> <abstract> <para>本文介紹如何在沒辦法連到遠端 console 的機器做 &os; 遠端安裝。 本文構想來自於作者與 &a.mm; 的合作成果, 以及 &a.pjd; 所投注的諸多心血。</para> </abstract> </articleinfo> <sect1 id="background"> <title>緣起</title> <para>世上有許多 server hosting provider,但其中有官方支援 &os; 則不是相當多。 他們通常會在所提供的機器上有 &linux; distribution 的安裝支援。</para> <para>有些會讓您可選擇喜好的 &linux; distribution 來裝, 像這種情況就可以試著安裝 &os;。 而有些則是會提供救急用的系統, 這種也可以用來安裝 &os;。</para> <para>本文介紹這些遠端基本安裝 &os; 的方式,以及 RAID-1 與 <application>ZFS</application> 設定步驟。</para> </sect1> <sect1 id="intro"> <title>介紹</title> <para>茲摘錄一下本文的目的以及闡述這邊所涵蓋的東西。 對於無官方支援 &os; 的代管服務(colocation)用戶而言, 本文中所介紹到的指令會相當有用。</para> <procedure> <step> <para>正如先前 <link linkend="background">緣起</link> 所提到的,許多名聲還不賴的 server hosting 公司會提供一些救急用系統,可以透過 <acronym>LAN</acronym> 方式開機,也可以透過 <application>SSH</application> 方式進行管理。 通常會有該加值服務, 以讓他們的客戶可以連進來修復有問題的作業系統。 本節之後將介紹如何透過救急系統來安裝 &os;。</para> <!-- XXXTR: Solaris has a restore command, something like sysrestore, FreeBSD Should have one too. --> </step> <step> <para>下一節會介紹如何在本機設定以及打造最小巧的 &os; —— 該版最後會在遠端機器上透過 ramdisk 方式啟動,並以 <application>sysinstall</application> 從 <acronym>FTP</acronym> mirror 站來安裝完整的 &os; 作業系統。</para> </step> <step> <para>本文其餘部分將介紹安裝程序,以及 <application>ZFS</application> 檔案系統的設定。</para> </step> </procedure> <sect2 id="requirements"> <title>需求</title> <para>為了成功完成遠端安裝,必須要有:</para> <itemizedlist> <listitem> <para>要有可以上網的作業系統,並且 <application>SSH</application> 可以連線。</para> </listitem> <listitem> <para>瞭解 &os; 的安裝程序</para> </listitem> <listitem> <para>熟悉如何使用 &man.sysinstall.8;</para> </listitem> <listitem> <para>有 &os; 安裝光碟片或者 <acronym>ISO</acronym> image 檔</para> </listitem> </itemizedlist> </sect2> </sect1> <sect1 id="preparation"> <title>準備 - <application>mfsBSD</application></title> <para>在裝 &os; 之前,要先打造最小化的 &os; 作業系統 image 檔, 以便可以從硬碟上開機。 如此一來,新的系統就可以透過網路來操作, 而剩下來的安裝部分即可不必透過 console。</para> <para>而 <application>mfsBSD</application> 這套工具就是用來打造小型的 &os; image 檔。 <application>mfsBSD</application> (名字其中 <quote>mfs</quote> 就是 <quote>memory file system</quote>)所建造出來的 整套系統會透過 ramdisk 方式來運作。 由於此一特色,硬碟的部分就不受限, 因此可以用來安裝完整的 &os; 作業系統。 <application>mfsBSD</application> 的首頁位於 <ulink url="http://people.freebsd.org/~mm/mfsbsd/"></ulink>, 其中連結有該工具的最新 release 部分。</para> <para>請注意:<application>mfsBSD</application> 內部運作方式的細節,不 在本文介紹範圍之內。 若對這方面有興趣的讀者,可至 <application>mfsBSD</application> 官網查閱相關文件。</para> <para>首先下載最新的 <application>mfsBSD</application> 並解壓縮之, 然後切到解壓縮後的工作目錄,也就是 <application>mfsBSD</application> script 檔所在處:</para> <screen>&prompt.root; <userinput>fetch http://people.freebsd.org/~mm/mfsbsd/mfsbsd-latest.tar.gz</userinput> &prompt.root; <userinput>tar xvzf mfsbsd-<replaceable>1.0-beta1</replaceable>.tar.gz</userinput> &prompt.root; <userinput>cd <replaceable>mfsbsd-1.0-beta1</replaceable>/</userinput></screen> <sect2 id="mfsbsd-config"> <title>設定 <application>mfsBSD</application></title> <para>在將 <application>mfsBSD</application> 開機之前, 有幾個重要設定要先設妥。 此時最重要的設定,很明顯就是網路設定。 到底網路怎麼設最好,則取決於所處的網路環境, 以及該網路卡會以哪一種驅動程式載入而定。 我們將會看到 <application>mfsBSD</application> 如何在任何網路情況下進行設定。</para> <para>另一件重要事就是設定 <username>root</username> 密碼。 這點可以透過 <filename>conf/rootpw.conf</filename> 來完成。 請切記:該檔密碼是以明文方式存放,因此不建議放真正平常有在用的密碼。 然而這密碼只是臨時密碼而已,可以在之後開機時再做更換。</para> <sect3> <title>設定網路(<filename>conf/interfaces.conf</filename> 方式)</title> <para>若對要裝的機器網卡為何還不知道是哪一款,但可以善加利用 <application>mfsBSD</application> 的自動偵測功能。 <application>mfsBSD</application> 的開機 script 會根據網卡的 MAC 位址範圍來偵測正確的驅動程式,像是下列的 <filename>conf/interfaces.conf</filename> 設定內容:</para> <programlisting>initconf_interfaces="ext1" initconf_mac_ext1="00:00:00:00:00:00" initconf_ip_ext1="192.168.0.2" initconf_netmask_ext1="255.255.255.0"</programlisting> <para>別忘了在 <filename>conf/rc.conf</filename> 內要加上 <literal>defaultrouter</literal> 的相關設定:</para> <programlisting>defaultrouter="192.168.0.1"</programlisting> </sect3> <sect3> <title>設定網路(<filename>conf/rc.conf</filename> 方式)</title> <para>若已經知道網卡是哪一種,那麼要設定網路的話直接改 <filename>conf/rc.conf</filename> 會比較方便。 該檔設定語法與 &os; 標準的 &man.rc.conf.5; 是一致的。</para> <para>舉個例子,若知道該機器網卡是用 &man.re.4;,那麼就在 <filename>conf/rc.conf</filename> 做下列類似設定:</para> <programlisting>defaultrouter="192.168.0.1" ifconfig_re0="inet 192.168.0.2 netmask 255.255.255.0"</programlisting> </sect3> </sect2> <sect2 id="mfsbsd-build"> <title>打造 <application>mfsBSD</application> image</title> <para>打造 <application>mfsBSD</application> image 檔的過程相當簡單。</para> <para>首先是把 &os; 安裝光碟或者安裝用的 <acronym>ISO</acronym> image 檔丟到 <filename class="directory">/cdrom</filename>。 為維持所有例子的一致,本文假設都是用 &os; 7.0-RELEASE <acronym>ISO</acronym>。 而把 ISO image 檔掛載到 <filename class="directory">/cdrom</filename> 目錄相當簡單, 就是用 &man.mdconfig.8;:</para> <screen>&prompt.root; <userinput>mdconfig -a -t vnode -u 10 -f <replaceable>7.0-RELEASE-amd64-disc1.iso</replaceable></userinput> &prompt.root; <userinput>mount_cd9660 /dev/md10 /cdrom</userinput></screen> <para>接著就開始打造可開機的 <application>mfsBSD</application> image:</para> <screen>&prompt.root; <userinput>make BASE=/cdrom/<replaceable>7.0-RELEASE</replaceable></userinput></screen> <note> <para>上述的 <command>make</command> 指令要在 <application>mfsBSD</application> 的最上層目錄執行,比方說 <filename class="directory">~/mfsbsd-1.0-beta1/</filename>。</para> </note> </sect2> <sect2> <title><application>mfsBSD</application> 開動</title> <para>現在 <application>mfsBSD</application> image 已經備妥, 要上傳到遠端機器的救急系統或者預先安裝的 &linux; distribution。 要完成這工作最適合的工具就是 <application>scp</application>:</para> <screen>&prompt.root; <userinput>scp disk.img root@192.168.0.2:.</userinput></screen> <para>為了能順利啟動 <application>mfsBSD</application> image, 要把檔案放在欲安裝機器的第一顆(可開機)硬碟上。 假設例子的第一顆開機硬碟代號為 <devicename>sda</devicename>, 那麼作法就類似下面這樣:</para> <screen>&prompt.root; <userinput>dd if=/root/disk.img of=/dev/sda bs=1m</userinput></screen> <para>若一切順利,該 image 檔現在應該會在第一顆硬碟的 <acronym>MBR</acronym> 磁區並可以開始進行重開機了。 可以用 &man.ping.8; 工具來檢測該機器開機完畢與否。 一旦 ping 到之後, 就可以透過 &man.ssh.1; 連進去,並且用 <username>root</username> 以及剛設定的密碼登入。</para> </sect2> </sect1> <sect1 id="installation"> <title>&os; 作業系統的安裝</title> <para>現在 <application>mfsBSD</application> 已順利啟動,並且應該可以透過 &man.ssh.1; 方式來連。 本節將介紹如何建立 slice 分割、設定 <application>gmirror</application> 以作 RAID-1、如何以 <application>sysinstall</application> 來安裝 &os; 作業系統的最小化安裝。</para> <sect2> <title>準備硬碟</title> <para>首先要作的是配置硬碟空間給 &os;,像是建立 slice 跟分割區。 很明顯地,目前在跑的作業系統是載入到系統記憶體內執行, 因此要對硬碟配置並無任何問題。 這些工作可以用 <application>sysinstall</application> 或者以 &man.fdisk.8; 搭配 &man.bsdlabel.8; 來完成。</para> <para>首先先把各硬碟都先清空。 請對各硬碟作下列指令:</para> <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/<replaceable>ad0</replaceable> count=2</userinput></screen> <para>接著,以您慣用的工具來建立 slice 以及設定 label。 通常會建議以 的 <application>sysinstall</application> 工具來作會比較輕鬆, 或者是強而又不太會出槌的文字介面 &unix; 標準工具(像是 &man.fdisk.8;, &man.bsdlabel.8;),這部分稍後也會一併介紹。 前者部分在 &os; Handbook 的 <ulink url="&url.books.handbook;/install-steps.html">安裝 &os;</ulink> 章節有相當詳盡的介紹,所以這邊主要要介紹的是如何建立 RAID-1 系統以及 <application>ZFS</application>。 這邊會介紹建立以 &man.gmirror.8; 做成的小型 mirrored 檔案系統: <filename class="directory">/</filename> (根目錄), <filename class="directory">/usr</filename> 以及 <filename class="directory">/var</filename>,而硬碟的其餘剩餘空間則通通以 &man.zpool.8; 做成 <application>ZFS</application> 的 mirrored 檔案系統 。 請注意:必須要先把 &os; 作業系統裝好並開完機後,才能進行設定 <application>ZFS</application> 檔案系統。</para> <para>下面的例子會介紹如何建立 slice 以及 label、在每個分割區上啟用 &man.gmirror.8;、如何在每個 mirrored 分割區上建立 <application>UFS2</application> 檔案系統:</para> <screen>&prompt.root; <userinput>fdisk -BI /dev/ad0</userinput> <co id="fdisk"/> &prompt.root; <userinput>fdisk -BI /dev/ad1</userinput> &prompt.root; <userinput>bsdlabel -wB /dev/ad0s1</userinput> <co id="bsdlabel-writing"/> &prompt.root; <userinput>bsdlabel -wB /dev/ad1s1</userinput> &prompt.root; <userinput>bsdlabel -e /dev/ad0s1</userinput> <co id="bsdlabel-editing"/> &prompt.root; <userinput>bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt</userinput> <co id="bsdlabel-restore"/> &prompt.root; <userinput>gmirror label root /dev/ad[01]s1a</userinput> <co id="gmirror1"/> &prompt.root; <userinput>gmirror label var /dev/ad[01]s1d</userinput> &prompt.root; <userinput>gmirror label usr /dev/ad[01]s1e</userinput> &prompt.root; <userinput>gmirror label -F swap /dev/ad[01]s1b</userinput> <co id="gmirror2"/> &prompt.root; <userinput>newfs /dev/mirror/root</userinput> <co id="newfs"/> &prompt.root; <userinput>newfs /dev/mirror/var</userinput> &prompt.root; <userinput>newfs /dev/mirror/usr</userinput></screen> <calloutlist> <callout arearefs="fdisk"> <para>對該硬碟建立 slice 並且在第零軌處將開機表作初始。 請對該機器所有硬碟都作此一動作。</para> </callout> <callout arearefs="bsdlabel-writing"> <para>對各硬碟寫入 label 以及 bootstrap 碼。</para> </callout> <callout arearefs="bsdlabel-editing"> <para>現在手動修改該硬碟的 label,至於如何建立分割區(partitions) 請參閱 &man.bsdlabel.8; 說明。 分割區分別建立:<literal>a</literal> 是給 <filename class="directory">/</filename> (根目錄), <literal>b</literal> 給 swap, <literal>d</literal> 給 <filename class="directory">/var</filename>, <literal>e</literal> 給 <filename class="directory">/usr</filename>, 最後,會在稍後步驟把 <literal>f</literal> 給 <application>ZFS</application> 使用。</para> </callout> <callout arearefs="bsdlabel-restore"> <para>把剛剛的 label 設定先匯出,再匯入到第二顆硬碟上, 如此一來兩邊的硬碟 label 設定就會同樣。</para> </callout> <callout arearefs="gmirror1"> <para>在各分割區上啟用 &man.gmirror.8;</para> </callout> <callout arearefs="gmirror2"> <para>請注意:<option>-F</option> 選項是用在 swap 上。 這參數會讓 &man.gmirror.8; 認為該硬體是處於可靠狀態, 即使發生電源故障或系統當掉,也不會去同步。</para> </callout> <callout arearefs="newfs"> <para>在各個有做 mirror 的分割區上建立 <application>UFS2</application> 檔案系統</para> </callout> </calloutlist> </sect2> <sect2> <title>系統安裝</title> <para>這裡是最重要的一環, 本節介紹實際上如何在先前一節所做好的硬碟安裝最小化的 &os;, 為了完成此一目標,所有檔案系統都必須掛載妥當,才能讓 <application>sysinstall</application> 可以把 &os; 裝到硬碟內:</para> <screen>&prompt.root; <userinput>mount /dev/mirror/root /mnt</userinput> &prompt.root; <userinput>mkdir /mnt/var /mnt/usr</userinput> &prompt.root; <userinput>mount /dev/mirror/var /mnt/var</userinput> &prompt.root; <userinput>mount /dev/mirror/usr /mnt/usr</userinput></screen> <para>做完上述動作之後,請執行 &man.sysinstall.8;。 請從主選單中選擇 <guimenuitem>Custom</guimenuitem> 安裝,選 <guimenuitem>Options</guimenuitem> 按 <keycap>Enter</keycap>。 然後以方向鍵移動到 <literal>Install Root</literal> 處,按 <keycap>Space</keycap> 鍵然後改為 <filename class="directory">/mnt</filename>,再按 <keycap>Enter</keycap> 鍵以將修改值存起來,然後按 <keycap>q</keycap> 鍵即可離開這個 <guimenuitem>Options</guimenuitem> 畫面。</para> <warning> <para>請注意:本步驟極為重要,若忽略的話那麼 <application>sysinstall</application> 就沒辦法安裝 &os;。</para> </warning> <para>接著選 <guimenuitem>Distributions</guimenuitem>,然後移動游標到 <option>Minimal</option> 處,按 <keycap>Space</keycap> 鍵。 本文之所以介紹最小化安裝是為了要節省網路流量,因為系統安裝是透過 <application>ftp</application> 方式來進行。 要離開本畫面,請選 <option>Exit</option> 即可。</para> <note> <para>至於 <guimenuitem>Partition</guimenuitem> 及 <guimenuitem>Label</guimenuitem> 步驟則可略過, 因為這些目前已經都設定完畢了。</para> </note> <para>在 <guimenuitem>Media</guimenuitem> 選單中請選 <option>FTP</option>。 請選最近的 mirror 站,並且讓 <application>sysinstall</application> 假設網路已經設妥。 接下來就會回到 <guimenuitem>Custom</guimenuitem> 選單。</para> <para>最後,按下 <guimenuitem>Commit</guimenuitem> 即可開始進行安裝。 完成安裝後,即可離開 <application>sysinstall</application>。</para> </sect2> <sect2> <title>後續安裝步驟</title> <para>此時 &os; 作業系統應該已經裝完,然而還有些後續流程要做。 必須要做一些後續設定,才能讓 &os; 可以開機跟登入。</para> <para>現在必須要用 &man.chroot.8; 以切到剛剛新裝好的系統內。 指令如下:</para> <screen>&prompt.root; <userinput>chroot /mnt</userinput></screen> <para>然後再打下列指令以繼續完成:</para> <itemizedlist> <listitem> <para>把 <literal>GENERIC</literal> kernel 複製到 <filename class="directory">/boot/kernel</filename> 目錄:</para> <screen>&prompt.root; <userinput>cp -Rp /boot/GENERIC/* /boot/kernel</userinput></screen> </listitem> <listitem> <para>建立 <filename>/etc/rc.conf</filename>, <filename>/etc/resolv.conf</filename> 及 <filename>/etc/fstab</filename> 檔案。 別忘了,要記得在 <filename>/etc/rc.conf</filename> 檔設相關網路設定,以及把 <application>sshd</application> 啟用。 此外, <filename>/etc/fstab</filename> 檔應該會長像下面這樣:</para> <programlisting># Device Mountpoint FStype Options Dump Pass# /dev/mirror/swap none swap sw 0 0 /dev/mirror/root / ufs rw 1 1 /dev/mirror/usr /usr ufs rw 2 2 /dev/mirror/var /var ufs rw 2 2 /dev/cd0 /cdrom cd9660 ro,noauto 0 0</programlisting> </listitem> <listitem> <para>新增 <filename>/boot/loader.conf</filename> 檔, 並且內容填入下列:</para> <programlisting>geom_mirror_load="YES" zfs_load="YES"</programlisting> </listitem> <listitem> <para>執行下列指令,以在下次開機時啟用 <application>ZFS</application> :</para> <screen>&prompt.root; <userinput>echo 'zfs_enable="YES"' >> /etc/rc.conf </userinput></screen> </listitem> <listitem> <para>使用 &man.adduser.8; 工具來新增其他使用者帳號。 別忘了, 至少要有一個帳號得加入 <groupname>wheel</groupname> 群組, 才能在重開機後以該帳號切換為 root。</para> </listitem> <listitem> <para>再次檢查上述相關的設定,是否有遺漏或打錯。</para> </listitem> </itemizedlist> <para>現在該系統終於可以重開機了,請用 &man.reboot.8; 指令以重開機。</para> </sect2> </sect1> <sect1 id="zfs"> <title>ZFS</title> <para>系統重開機完畢之後,應該就可以登入了。 歡迎使用全新的 &os; 安裝方式, 完全透過遠端而不必接上 remote console!</para> <para>接下來只剩要調整 &man.zpool.8; 以及建立 &man.zfs.8; 檔案系統而已。 <application>ZFS</application> 的建立及管理是相當淺顯易懂。 首先, 建立 mirrored pool:</para> <screen>&prompt.root; <userinput>zpool create tank mirror /dev/ad[01]s1f</userinput></screen> <para>接著,建立檔案系統:</para> <screen>&prompt.root; <userinput>zfs create tank/ports</userinput> &prompt.root; <userinput>zfs create tank/src</userinput> &prompt.root; <userinput>zfs set compression=gzip tank/ports</userinput> &prompt.root; <userinput>zfs set compression=on tank/src</userinput> &prompt.root; <userinput>zfs set mountpoint=/usr/ports tank/ports</userinput> &prompt.root; <userinput>zfs set mountpoint=/usr/src tank/src</userinput></screen> <para>一切就是這樣簡單。 若對 &os; 上的 <application>ZFS</application> 細節部分有興趣,請參閱 &os; Wiki 上的 <ulink url="http://wiki.freebsd.org/ZFS">ZFS</ulink> 一節說明。</para> </sect1> </article>