從 2.0.5R 到 2.2.1R,主要的設定檔是 /etc/sysconfig。所有的選項都被指定在這個檔, 而其他像 /etc/rc (參見 rc(8)) 和 /etc/netstart 只是引用它。
觀察 /etc/sysconfig 這個檔並修正其值以 適合你的系統。這個檔用註解填滿以表示何處該放置什麼設定。
在 post-2.2.1 以後及 3.0,/etc/sysconfig 亦更名為一個更容易描述的檔名叫 rc.conf(5) ,並且語法簡化了些。 /etc/netstart 亦更名為 /etc/rc.network 因此所有的檔案都可以用 cp /usr/src/etc/rc* /etc 來拷貝。
在 3.1 以及,/etc/rc.conf 被移到 /etc/defaults/rc.conf。 千萬不要編輯這個檔! 如果 /etc/defaults/rc.conf 內有想要更動的項目, 你應該將那一行的內容拷貝到 /etc/rc.conf, 然後再修改它。
例如 FreeBSD 3.1 及以後的版本內,有一個 DNS 伺服器 named, 而你想要啟動它。你所需要作的事就是:
# echo named_enable="YES" >> /etc/rc.conf
想要在 FreeBSD 3.1 及以後的版本中,啟動本地端服務的話,將 shell script 置於 /usr/local/etc/rc.d 目錄 下。這些 shell script 應該設定成可執行,並且檔名以 .sh 結束。 在 FreeBSD 3.0 及更早的版本中,你應該直接編輯 /etc/rc.local 檔。
/etc/rc.serial用來初始化序列埠 (像是鎖定埠的特性等)。
/etc/rc.i386 是 Intel 專用設定, 像是 iBCS2 模擬或是 PC 系統主控台設定。
使用 adduser(8) 指令。如果需要更複雜的使用方式, 請用 pw(8) 這個指令。
通常都是因為編輯了系統的 crontab (/etc/crontab) 然後就用 crontab(1) 去安裝它:
# crontab /etc/crontab
這樣作是不對的。系統的 crontab 和 crontab(1) 所更新的使用者的 crontab 格式並不一樣 (crontab(5) 說明文件針對差異處有詳細的說明)。
如果你已經用這種方法,額外多出的 crontab 只就是 /etc/crontab 的拷貝,只是格式是錯誤的。 可用以下的命令刪除:
# crontab -r
下次你編輯 /etc/crontab 檔案的時候, 你不用作任何動作去通知 cron(8) ,它自動會去偵測是否有更動。
如果你想要每天、每週、或是每月固定執行某些動作一次,也許加個 shell script 在 /usr/local/etc/periodic 目錄下會更好,系統的 cron 會固定執行 periodic(8) 命令, 它可將你的程式和其它的系統週期性工作一起執行。
這個錯誤的真正原因,是因為系統的 crontab 有一個額外的欄位, 說明該命令要以什麼使用者身份執行。在 FreeBSD 的預設系統 crontab 中,所有的項目都是 root。 當這個 crontab 被當作是 root 的使用者 crontab (它和系統的 crontab 是 不 一樣的),cron(8) 會以為 root 字串是欲執行的命令的第一個字,但是實際上 並沒有這樣的命令存在。
這是一個安全特性。想要利用 su 成為 root (或其它有 superuser 權限的帳號),你一定要在 wheel 群組內。如果沒有這個特性的話, 任何人只要在系統裡有帳號,並且恰巧知道 root 的密碼,就可以取得 superuser 等級的權限以存取系統。有了這個特性, 這樣的情況就不會發生;如果使用者不在 wheel 群組內的話,su(1) 會讓他們連試著鍵入密碼的機會都沒有。
要讓某人可以利用 su 成為 root 的話, 只要把他們放入 wheel 群組內即可。
當電腦問你 shell 完整路徑名時,只要按 ENTER ,然後執行 mount / 以讀寫模式 重新掛載根檔案系統。你也許需要執行 mount -a -t ufs ,將你慣用的文字編輯器所在的檔案系統掛載上來。如果 你慣用的文字編輯器在網路檔案系統上的話,你必須先手動將網路設定 起來,以便將網路檔案系統掛載上來,或是使用本地端檔案系統上的 編輯器,例如 ed(1)。
如果你想要使用像 vi(1) 或是 emacs(1) 等的全螢幕 文字編輯器的話,你也需要執行 export TERM=cons25 ,以便讓這些編輯器能夠從 termcap(5) 資料庫裡讀取正確的資料。
當你已經完成了這些步驟後,你可以照你平常修改文法錯誤的方式 去編輯 /etc/rc.conf 檔案。在核心 (kernel) 啟動時所顯示的錯誤訊息,能夠告訴你檔案中哪一行有錯誤。
請參考一下 Handbook 中,有關列印的部份。它應該能夠解決 你大部份的問題。請參考 Handbook 中的列印部份。
有些印表機需要主機支援的驅動程式 (host-based driver) 才能 執行任何列印功能。FreeBSD 本身並不支援這些所謂的 “WinPrinters”。 如果你的印表機無法在 DOS 或 Windows NT 4.0 下執行,那它大概就是一台 WinPrinter。你唯一能使用 這樣的印表機的希望,就是試試 print/pnm2ppa 支不支援它了。
請參考 Handbook 中的 using localization 章節,尤其是 console setup 章節。
以下是從 FreeBSD-CURRENT 通信論壇的一篇文章中節錄出來的。
“無法指派資源 (can't assign resources)” 訊息表示 那些裝置是傳統的 ISA 裝置,而核心中已經編入不認得 PNP 的驅動程 式。這些裝置包括鍵盤控制器,可程式化岔斷控制晶片,還有幾個標準 設備。資源無法指派給這些裝置,是因為早已有驅動程式使用那些位址 了。 |
||
--Garrett Wollman
<wollman@FreeBSD.org> , 2001 年四月 24
日 |
可能你 kernel 設定未加入 quotas 支援(預設是無)。如果是這樣子的話, 那麼請把下面這行加到 kernel 設定檔內並重新編譯、安裝:
options QUOTA
細節部分,請參閱 Handbook 內的 quotas 章節。
請不要直接在 / 打開 quotas
把 quotas 檔放在它必須強迫置入的檔案系統內,舉例:
是的,FreeBSD 支援 System V-style IPC。這包括共享記憶體, 訊息跟信號。你需要在你的 kernel 設定檔內加入下列幾行以啟動它們。
options SYSVSHM # enable shared memory options SYSVSEM # enable for semaphores options SYSVMSG # enable for messaging
注: 在 FreeBSD 3.2 以及之後的版本,這些選項已經是 GENERIC 核心的一部份,也就是說它們已 經編進了你的系統中。
重新編譯並安裝。
跟隨 FreeBSD 套裝而來的 sendmail 設定是適合那些直接連上網際網路 的站台。想透過 UUCP 交換郵件的站台必須另外安裝 sendmail 的設定檔案。
手動修改 /etc/sendmail.cf 是絕對必要的。 第 8 版的 sendmail 提供一個全新的入口以透過一些像 m4(1) 的處理就能產生設定檔,這事實上是一個高層概念等級的技巧性設定。 你應該可以在 /usr/src/usr.sbin/sendmail/cf 以下裡使用它:
假如你不是用 full sources 方式安裝系統,那麼 sendmail 設定項目可能已經分散成好幾個來源分布檔在等著你,假設你已經 mount 光碟機,做以下動作:
# cd /cdrom/src # cat scontrib.?? | tar xzf - -C /usr/src contrib/sendmail
別驚慌,這只有數十萬個位元組的大小。在 cf 目錄裡的 README 可以提供一個 m4 設定法的基 本介紹。
以 UUCP 遞送來說,建議你最好使用 mailertable 特點。建構一個資料庫讓 sendmail 可以使用它自己的路徑決策。
首先,你必須建立自己的 .mc 檔。 /usr/src/usr.sbin/sendmail/cf/cf 目錄是這些 檔案的家。查看一下,已經有好幾個範例檔,假設你已經命名自己的檔叫 foo.mc,你要做的只是把它轉換成一個有效的 sendmail.cf:
# cd /usr/src/usr.sbin/sendmail/cf/cf # make foo.cf # cp foo.cf /etc/mail/sendmail.cf
一個典型的 .mc 檔看起來可能像這樣:
VERSIONID(`Your version number') OSTYPE(bsd4.4) FEATURE(accept_unresolvable_domains) FEATURE(nocanonify) FEATURE(mailertable, `hash -o /etc/mail/mailertable') define(`UUCP_RELAY', your.uucp.relay) define(`UUCP_MAX_SIZE', 200000) define(`confDONT_PROBE_INTERFACES') MAILER(local) MAILER(smtp) MAILER(uucp) Cw your.alias.host.name Cw youruucpnodename.UUCP
accept_unresolvable_domains, nocanonify, 和 confDONT_PROBE_INTERFACES 特性將避免任何在 遞送郵件時會用到 DNS 的機會。UUCP_RELAY 項目的出現理由很奇怪,就不要問為何了。簡單的放入一個網際網路 上可以處理 .UUCP 虛擬網域位址的主機名稱;通常,你只需要在這 裡填入你 ISP 的信件回覆處 (mail replay)。
你已經做到這裡了,你還需要這個叫 /etc/mail/mailertable。如果你只有一個用 來傳遞所有郵件的對外通道的話,以下的檔案就足夠了:
# # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable uucp-dom:your.uucp.relay
另一個更複雜的例子看起來像這樣:
# # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable # horus.interface-business.de uucp-dom:horus interface-business.de uucp-dom:if-bus interface-business.de uucp-dom:if-bus heep.sax.de smtp8:%1 horus.UUCP uucp-dom:horus if-bus.UUCP uucp-dom:if-bus uucp-dom:
如你所見,這是某個真實檔案裡的一部份。首三行處理網域定址信件 不應該被送出到內定路徑,而由某些 UUCP 鄰居(UUCP neighbor)取代 的特殊情形,這是為了 “縮短”遞送的路徑。下一行處理到 本地乙太網路網域的信件讓它可以使用 SMTP 來遞送。最後,UUCP 鄰居提到 .UUCP 虛擬網域的記載,允許一個 uucp-neighbor !recipient 推翻 內定規則。最後一行則以一個單獨的句點做結束,以 UUCP 遞送到提供當 你全世界性郵件閘門的UUCP 鄰居。所有在 uucp-dom: 關鍵字裡的節點名稱必須都是有效的 UUCP 鄰居,你可以用 uuname 命令去確認。
提醒你這個檔案在使用前必須被轉換成 DBM 資料庫檔案,最好在 mailertable 最上面用註解寫出命令列來完成這個工作。當你每次更換你 的 mailertable 後你總是需要執行這個命令。
最後提示:如果你不確定某些特定的信件路徑可用,記得把 -bt
選項加到 sendmail。這會將 sendmail 啟動在 address test mode;只要按下 0,接著輸入你希望測試的信件路徑位址。
最後一行告訴你使用內部的信件代理程式,代理程式的會通知目的主機,
以及(可能轉換的)位址。要離開此模式請按 Control-D。
% sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3,0 foo@example.com canonify input: foo @ example . com .. parse returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . > > ^D
如果你已經有一個固定的 IP 數字,你不需要調整任何內定值。設好 你要指定的網路名稱,其他的 sendmail 都會幫你做完。
如果你拿到的是動態配置的 IP 數字而使用撥接 ppp 連接到網際網 路,你可能已經在你的 ISP 信件主機上有一個信箱。假設你的 ISP 網域 是 example.net,你的使用者名 稱是 user。亦假設你稱自己的主機名稱是 bsd.home 而你的 ISP 告訴你可以使用 relay.example.net 當作信件回覆處。
為了從你的信箱接收信件,你將需要安裝取信程式以便從信箱取回信件。 Fetchmail 是一個不錯的選擇,因為它支 援許多不同的通訊協定,通常你的 ISP 會提供 POP3。如果你選擇使用 user-ppp,你可以在連線到網路成功後自動抓取你的信件,只要在 /etc/ppp/ppp.linkup裡面設定以下這項:
MYADDR: !bg su user -c fetchmail
假使你正使用 sendmail (如下所示) 傳送信件到非本地帳號,置入以下命令:
!bg su user -c "sendmail -q"
在上面那項命令之後。這會強迫 sendmail 在連接上網路後馬上開始處理 mailqueue。
我假設你在 bsd.home 機器上有一個 user 的帳號。在 bsd.home 機器上 user 的家目錄裡建立一個 .fetchmailrc 的檔案:
poll example.net protocol pop3 fetchall pass MySecret
無須贅言,這個檔除了 user 外不應該被任 何人讀取,因為它包含 MySecret 這個密碼。
為了在寄信時有正確的抬頭 from:,你必須告訴 sendmail 使用 user@example.net 而非 user@bsd.home。你可能會希望告訴 sendmail 從 relay.example.net 送出所有信件, 加快信件傳送。
以下的 .mc 檔應能滿足你的要求:
VERSIONID(`bsd.home.mc version 1.0') OSTYPE(bsd4.4)dnl FEATURE(nouucp)dnl MAILER(local)dnl MAILER(smtp)dnl Cwlocalhost Cwbsd.home MASQUERADE_AS(`example.net')dnl FEATURE(allmasquerade)dnl FEATURE(masquerade_envelope)dnl FEATURE(nocanonify)dnl FEATURE(nodns)dnl define(`SMART_HOST', `relay.example.net') Dmbsd.home define(`confDOMAIN_NAME',`bsd.home')dnl define(`confDELIVERY_MODE',`deferred')dnl
如何轉換這個 .mc 檔案到 sendmail.cf 檔的詳細細節,請參考上一節。 另外,在更新 sendmail.cf 以後不要忘記重新啟動 sendmail。
Sendmail 是 FreeBSD 預設使用的郵件伺服器,但是你還是可以很容易地以其它 郵件伺服器 (例如,從 port 安裝的郵件伺服器) 取代之。
port 裡有很多可供選擇的郵件伺服器,像 mail/exim、 mail/postfix、 mail/qmail、 mail/zmailer 等, 就是幾個很受歡迎的選擇。
多樣選擇是好事,而且大家有許多郵件伺服器可以使用也被認為是 好事;所以請避免在通信論壇裡問像 “Sendmail 有比 Qmail 好嗎?” 這樣的問題。如果你真的很想問的話,請先到通信論壇 archive 裡找一下。每一個郵件伺服器的優點與缺點,以前大概就已經 討論好幾次了。
不要驚慌!只要重新啟動系統,在看到 Boot: 時輸入 boot -s 即可進入單使用者模式 (在 3.2-RELEASE 之前的版本請改用 -s)。 在問要使用哪個 shell 時,按下 ENTER。你會看到一個 # 的提示號,輸入 mount -u / 以重新掛上(mount) 你的根檔案系統可供讀/寫。執行 passwd root 以更換 root 密碼,然後執行 exit(1) 繼續啟動程序。
如果你是使用 FreeBSD 2.2.7-RELEASE 或之後版本的 syscons(系統內定的主控台驅動程式),把下列這行放到 kernel 設定檔內, 然後重做一個新的核心:
options SC_DISABLE_REBOOT
若是使用 FreeBSD 2.2.5-RELEASE 或之後版本的 PCVT 主控台驅動 程式,則以下列選項代替:
options PCVT_CTRL_ALT_DEL
其他更早期的 FreeBSD 版本,請修改你正在使用的主控台鍵盤對應, 並將所有 boot 關鍵字以 nop 取代。內定的鍵盤對應是在 /usr/share/syscons/keymaps/us.iso.kbd。 你可能需要明白的吩咐 /etc/rc.conf 去讀取 這個鍵盤對應以確保更動生效。當然如果你正在用適合你國籍的鍵盤對應, 你應該編輯那一個。
只要使用這個 perl 命令:
% perl -i.bak -npe 's/\r\n/\n/g' file ...
file 就是要處理的檔案。這個修改是在內部完成,原始的檔案會儲存成 副檔名為 .bak 的檔案。
或者你可以使用 tr(1) 這個命令:
% tr -d '\r' < dos-text-file > unix-file
dos-text-file 是包含 DOS 文字的 檔案,而 unix-text-file 則是包含轉換 的輸出結果。這比使用 perl 還要快上一點點。
使用 killall(1) 。
這個錯誤是因為 Kerberos 分散認證系統。這個問題並不是很嚴重 但是令人厭煩。你可以用 -K 選項去執行 su,或是像下個問題所描述的 移除 Kerberos。
要從系統裡移除 Kerberos,重裝你正在執行的 release 版本的 bin distribution。如果你有 CDROM,你可以 mount cd(假設在 /cdrom) 並執行:
# cd /cdrom/bin # ./install.sh
或者你也可以將 /etc/make.conf 裡的 "MAKE_KERBEROS" 選項全都拿掉,然後再 build world.
如果你有許多 telnet,ssh,X 或是 screen 使用者,你或許會用完 虛擬終端機,這能教你怎麼加更多:
建立並安裝一個新的 kernel 並且把這一行
pseudo-device pty 256
加入到設定檔裡。
執行這個命令:
# cd /dev # sh MAKEDEV pty{1,2,3,4,5,6,7}
會造出 256 個虛擬終端機的裝置節點。
編輯 /etc/ttys 並加入符合 256 個終端機的行數。它們應該符合已經存在單項的格式,舉例來說, 它們看起來像:
ttyqc none network
字母設計的順序是 tty[pqrsPQRS][0-9a-v],使用正規表示式。
用新的 kernel 重新啟動電腦就可以了。
並沒 snd 這個裝置的存在。這個名字 是用來當作各個組成 FreeBSD 聲音驅動程式組,諸如 mixer, sequencer,以及 dsp 的簡稱。
可以用以下的命令作出這些裝置:
# cd /dev # sh MAKEDEV snd0
先進入單人使用者模式,然後再回到多使用者模式。
在主控台執行:
# shutdown now (Note: without -r or -h) # return # exit
簡單地說:那只是名字而已。RC 的意思是 “Release Candiate, 發行候選版本”,它表示新版本快要發行了。在 FreeBSD 中, -PRERELEASE 通常是發行前的程式碼凍結的代名詞。(有些發行版本中, -BETA 標籤跟 -PRERELEASE 是相同意思的。)
詳細地說:FreeBSD 從兩個地方分支出它的發行版本。主版號、 點零、release (例如 3.0-RELEASE 及 4.0-RELEASE) 的,是從發展過程 開始時分支出來的,通常稱為 -CURRENT 。有副版號的版本 (例如 3.1-RELEASE 或 4.2-RELEASE),是 活躍的 -STABLE 分支中的發行版本 快照。從 4.3-RELEASE 開始,每一個發行版本有它自己的分支,可為 偏好極度保守的發展速度 (通常只會作安全方面的更新) 的人所用。
準備要製作發行版本時,其所在的分支會經過一定的程序。有一個是 程式碼凍結。當程式碼凍結開始時,分支名稱會更名,以反映它快要成為 一個發行版本了。舉個例子,如果原來的分支叫 4.5-STABLE,它的名字 會變成 4.6-PRERELEASE 以表示程式碼已凍結,並且額外的發行前測試 將要開始了。臭蟲更正仍可回報,以成為發行版本的一部份。當程式碼 有了可成為發行版本的雛形時,它的名字就會變成 4.6-RC,以表示發行 版本快好了。進入 RC 階段後,只有找到的最有影響的臭蟲才會被修正。 當發行版本 (本例中為 4.6-RELEASE) 產生後,發行版本會有自己的分支, 原分支會被更名為 4.6-STABLE。
想要得知更多有關版本號碼與各 CVS 分支的資訊,請參考 Release Engineering 一文。
簡單地說:你的 securelevel 可能大於零。直接重新開機到 單人模式,再安裝核心。
詳細地說:FreeBSD 在 securelevel 大於零情況下,不允許 變更系統旗標 (system flags)。你可以用這個指令檢查你的 securelevel:
# sysctl kern.securelevel
你沒有辦法降低 securelevel;你必須啟動系統到單人模式以 安裝核心,或是修改 /etc/rc.conf 內的 securelevel 再重新開機。請參考 init(8) 說明文件,以取得 更多有關 securelevel 的資訊,還有 /etc/defaults/rc.conf 和 rc.conf(5) 說明文件,以取得更多有關 rc.conf 的資訊。
簡單地講:你系統的 securelevel 也許大於 1。直接重新開機至 單人模式,然後再修改時間。
詳細地說:在 securelevel 大於 1 的情況下,FreeBSD 不允許時間 變動大於一秒。你可以用以下的命令來檢查目前的 securelevel:
# sysctl kern.securelevel
你無法降低 securelevel;你必須啟動電腦至單人模式下以修改時間, 或是修改 /etc/rc.conf 再重新開機。請參考 init(8) 說明文件,以取得更多有關 securelevel 的資訊,還有 /etc/defaults/rc.conf 和 rc.conf(5) 說明文件,以取得更多有關 rc.conf 的資訊。
不,那不是 memory leak,而且它也不是真的用了 256 Mbyte 的記憶體。它只是喜歡 (意思就是總會這樣作) 將一狗票的記憶體 映謝到它自己的位址空間,以方便作事。就技術而言,這樣並沒有 什麼不對;這樣只是會讓 top(1) 和 ps(1) 嚇一大跳而已。
rpc.statd(8) 會將它的狀態檔案 (位於 /var ) 映射至它的位址空間裡;為了防止需要的時候再增大所 導致的重新映射,它一次會使用相當大的大小。從程式碼來看的話就 更明顯了,可以看到 mmap(2) 的長度參數為 0x10000000 ,它是 IA32 架構上的十六分之一的定址空間,也就是 256MB。
你正在一個提高了 securelevel (也就是大於 0) 的系統運作。 降低 securelevel 再試試看。請參考 FAQ 中對 securelevel 的說明 和 init(8) 說明文件。
為什麼近來新版 FreeBSD .shosts 認證預設 為取消的原因,是因為 ssh(1) 預設不安裝為 suid 成 root。要 “修正” 這點,你可以作下列的 任何一件事:
要一勞永逸解決,請將 /etc/make.conf 裡的 ENABLE_SUID_SSH 設成 true ,然後再重新 build ssh (或是執行 make world)。
只作一時的修正的話,可以 root 身份 執行 chmod 4755 /usr/bin/ssh 將 /usr/bin/ssh 設成 4555 。然後將 ENABLE_SUID_SSH= true 加入 /etc/make.conf 裡,這樣下次 make world 執行就會生效了。
本文及其他文件,可由此下載:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。
若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢
<questions@FreeBSD.org>。
關於本文件的問題,請洽詢 <doc@FreeBSD.org>。