Chapter 10. 系統管理

Wei-Hon Chen
10.1. 系統起始設定檔在哪?
10.2. 我該如何簡單地加入使用者?
10.3. 在我編輯 crontab 檔案之後,為什麼我老是收到這樣的訊息: ``root: not found''?
10.4. 為什麼我想要用 su 成為 root 時,會得到 ``you are not in the correct group to su root'' 的錯誤訊息?
10.5. 我在 rc.conf 還是某個起動檔案裡犯了錯誤, 因為檔案系統變成唯讀的,我無法去編輯它。我該怎麼辦?
10.6. 為什麼我沒辦法設定我的印表機?
10.7. 我要怎麼樣修正我的系統所使用的鍵盤對映 (keyboard mapping)?
10.8. 為什麼我在系統啟動時,得到 ``unknown: <PNP0303> can't assign resources'' 的訊息?
10.9. 為什麼我無法讓 user quotas 正常工作?
10.10. FreeBSD 支援 System V IPC 格式指令集?
10.11. 我該如何讓 sendmail 透過 UUCP 來遞送郵件?
10.12. 當我用撥接連上網路時該怎麼設定信件遞送?
10.13. 除了 Sendmail 外,還有哪些郵件伺服器可以使用呢?
10.14. 我忘了 root 密碼了!怎麼辦?
10.15. 我該怎麼讓 Control-Alt-Delete 不會重新啟動系統?
10.16. 我該怎麼把 DOS 文字檔案重新格式化成 UNIX 的?
10.17. 我該怎麼用名稱砍掉 process?
10.18. 為何在 su 一直說我不在 root 的 ACL 裡?
10.19. 我該怎麼移除 Kerberos?
10.20. 我該怎麼增加系統的虛擬終端機?
10.21. /dev/snd0 這個裝置做不出來!
10.22. 可以不用開機,重新讀取 /etc/rc.conf、 再次啟動 /etc/rc 嗎?
10.23. 什麼是 sandbox?
10.24. 什麼是 securelevel?
10.25. 我想要把我的系統昇級到最新的 -STABLE,但是得到的是 -RC 或 -PRERELEASE!怎麼了?
10.26. 我試著要安裝一個新的核心,但是無法 chflags。我該怎麼解決?
10.27. 在我的系統上,我無法變更時間超過一秒以上的範圍! 我該怎麼辦?
10.28. 為什麼 rpc.statd 用了 256 megabytes 的記憶體?
10.29. 為什麼我沒辦法取消 schg 檔案旗標?
10.30. 為什麼近來的新版 FreeBSD 預設無法利用 .shosts 完成 SSH 認證?
10.31. 什麼是 vnlru?

10.1. 系統起始設定檔在哪?

從 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 系統主控台設定。

10.2. 我該如何簡單地加入使用者?

使用 adduser(8) 指令。如果需要更複雜的使用方式, 請用 pw(8) 這個指令。

要再次移除使用者,使用 rmuser(8) 指令。還有, pw(8) 也可以使用。

10.3. 在我編輯 crontab 檔案之後,為什麼我老是收到這樣的訊息: ``root: not found''?

通常都是因為編輯了系統的 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 字串是欲執行的命令的第一個字,但是實際上 並沒有這樣的命令存在。

10.4. 為什麼我想要用 su 成為 root 時,會得到 ``you are not in the correct group to su root'' 的錯誤訊息?

這是一個安全特性。想要利用 su 成為 root (或其它有 superuser 權限的帳號),你一定要在 wheel 群組內。如果沒有這個特性的話, 任何人只要在系統裡有帳號,並且恰巧知道 root 的密碼,就可以取得 superuser 等級的權限以存取系統。有了這個特性, 這樣的情況就不會發生;如果使用者不在 wheel 群組內的話,su(1) 會讓他們連試著鍵入密碼的機會都沒有。

要讓某人可以利用 su 成為 root 的話, 只要把他們放入 wheel 群組內即可。

10.5. 我在 rc.conf 還是某個起動檔案裡犯了錯誤, 因為檔案系統變成唯讀的,我無法去編輯它。我該怎麼辦?

當電腦問你 shell 完整路徑名時,只要按 ENTER ,然後執行 mount / 以讀寫模式 重新掛載根檔案系統。你也許需要執行 mount -a -t ufs ,將你慣用的文字編輯器所在的檔案系統掛載上來。如果 你慣用的文字編輯器在網路檔案系統上的話,你必須先手動將網路設定 起來,以便將網路檔案系統掛載上來,或是使用本地端檔案系統上的 編輯器,例如 ed(1)

如果你想要使用像 vi(1) 或是 emacs(1) 等的全螢幕 文字編輯器的話,你也需要執行 export TERM=cons25 ,以便讓這些編輯器能夠從 termcap(5) 資料庫裡讀取正確的資料。

當你已經完成了這些步驟後,你可以照你平常修改文法錯誤的方式 去編輯 /etc/rc.conf 檔案。在核心 (kernel) 啟動時所顯示的錯誤訊息,能夠告訴你檔案中哪一行有錯誤。

10.6. 為什麼我沒辦法設定我的印表機?

請參考一下 Handbook 中,有關列印的部份。它應該能夠解決 你大部份的問題。請參考 Handbook 中的列印部份

有些印表機需要主機支援的驅動程式 (host-based driver) 才能 執行任何列印功能。FreeBSD 本身並不支援這些所謂的 "WinPrinters"。 如果你的印表機無法在 DOS 或 Windows NT 4.0 下執行,那它大概就是一台 WinPrinter。你唯一能使用 這樣的印表機的希望,就是試試 print/pnm2ppa 支不支援它了。

10.7. 我要怎麼樣修正我的系統所使用的鍵盤對映 (keyboard mapping)?

請參考 Handbook 中的 using localization 章節,尤其是 console setup 章節。

10.8. 為什麼我在系統啟動時,得到 ``unknown: <PNP0303> can't assign resources'' 的訊息?

以下是從 freebsd-current 通信論壇的一篇文章中節錄出來的。

 

"無法指派資源 (can't assign resources)" 訊息表示 那些裝置是傳統的 ISA 裝置,而核心中已經編入不認得 PNP 的驅動程 式。這些裝置包括鍵盤控制器,可程式化岔斷控制晶片,還有幾個標準 設備。資源無法指派給這些裝置,是因為早已有驅動程式使用那些位址 了。

 
--Garrett Wollman , 2001 年四月 24 日 

10.9. 為什麼我無法讓 user quotas 正常工作?

  • 不要在 / 打開 quotas,

  • 把 quotas 檔放在它必須強迫置入的檔案系統內,舉例:

    檔案系統Quota 檔
    /usr/usr/admin/quotas
    /home/home/admin/quotas
    ......

  • 10.10. FreeBSD 支援 System V IPC 格式指令集?

    是的,FreeBSD 支援 System V-style IPC。這包括共享記憶體, 訊息跟信號。你需要在你的核心設定檔內加入下列幾行以啟動它們。

        options    SYSVSHM          # enable shared memory
        options    SYSVSEM          # enable for semaphores
        options    SYSVMSG          # enable for messaging

    Note: 在 FreeBSD 3.2 以及之後的版本,這些選項已經是 GENERIC 核心的一部份,也就是說它們已 經編進了你的系統中。

    重新編譯並安裝。

    10.11. 我該如何讓 sendmail 透過 UUCP 來遞送郵件?

    跟隨 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_domainsnocanonify, 和 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

    10.12. 當我用撥接連上網路時該怎麼設定信件遞送?

    如果你已經有一個固定的 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。你可能會希望告訴 sendmailrelay.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

    10.13. 除了 Sendmail 外,還有哪些郵件伺服器可以使用呢?

    Sendmail 是 FreeBSD 預設使用的郵件伺服器,但是你還是可以很容易地以其它 郵件伺服器 (例如,從 port 安裝的郵件伺服器) 取代之。

    port 裡有很多可供選擇的郵件伺服器,像 mail/eximmail/postfixmail/qmailmail/zmailer 等, 就是幾個很受歡迎的選擇。

    多樣選擇是好事,而且大家有許多郵件伺服器可以使用也被認為是 好事;所以請避免在通信論壇裡問像 "Sendmail 有比 Qmail 好嗎?" 這樣的問題。如果你真的很想問的話,請先到通信論壇 archive 裡找一下。每一個郵件伺服器的優點與缺點,以前大概就已經 討論好幾次了。

    10.14. 我忘了 root 密碼了!怎麼辦?

    不要驚慌!只要重新啟動系統,在看到 Boot: 時輸入 boot -s 即可進入單使用者模式 (在 3.2-RELEASE 之前的版本請改用 -s)。 在問要使用哪個 shell 時,按下 ENTER。你會看到一個 # 的提示號,輸入 mount -u / 以重新掛上(mount) 你的根檔案系統可供讀/寫。執行 passwd root 以更換 root 密碼,然後執行 exit(1) 繼續啟動程序。

    10.15. 我該怎麼讓 Control-Alt-Delete 不會重新啟動系統?

    如果你是使用 FreeBSD 2.2.7-RELEASE 或之後版本的 syscons(系統內定的主控台驅動程式),把下列這行放到核心設定檔內, 然後重做一個新的核心:

        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 去讀取 這個鍵盤對應以確保更動生效。當然如果你正在用適合你國籍的鍵盤對應, 你應該編輯那一個。

    10.16. 我該怎麼把 DOS 文字檔案重新格式化成 UNIX 的?

    只要使用這個 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 還要快上一點點。

    10.17. 我該怎麼用名稱砍掉 process?

    使用 killall(1)

    10.18. 為何在 su 一直說我不在 root 的 ACL 裡?

    這個錯誤是因為 Kerberos 分散認證系統。這個問題並不是很嚴重 但是令人厭煩。你可以用 -K 選項去執行 su,或是像下個問題所描述的 移除 Kerberos。

    10.19. 我該怎麼移除 Kerberos?

    要從系統裡移除 Kerberos,重裝你正在執行的 release 版本的 bin distribution。如果你有 CDROM,你可以 mount cd(假設在 /cdrom) 並執行:

        # cd /cdrom/bin
        # ./install.sh

    或者你也可以將 /etc/make.conf 裡的 "MAKE_KERBEROS" 選項全都拿掉,然後再 build world.

    10.20. 我該怎麼增加系統的虛擬終端機?

    如果你有許多 telnet,ssh,X 或是 screen 使用者,你或許會用完 虛擬終端機,這能教你怎麼加更多:

    1. 建立並安裝一個新的核心程式並且把這一行

          pseudo-device pty 256

      加入到設定檔裡。

    2. 執行這個命令:

          # cd /dev
          # sh MAKEDEV pty{1,2,3,4,5,6,7}

      會造出 256 個虛擬終端機的裝置節點。

    3. 編輯 /etc/ttys 並加入符合 256 個終端機的行數。它們應該符合已經存在單項的格式,舉例來說, 它們看起來像:

          ttyqc none network

      字母設計的順序是 tty[pqrsPQRS][0-9a-v],使用正規表示式。

    4. 用新的核心程式重新啟動電腦就可以了。

    10.21. /dev/snd0 這個裝置做不出來!

    並沒 snd 這個裝置的存在。這個名字 是用來當作各個組成 FreeBSD 聲音驅動程式組,諸如 mixersequencer,以及 dsp 的簡稱。

    可以用以下的命令作出這些裝置:

        # cd /dev
        # sh MAKEDEV snd0

    10.22. 可以不用開機,重新讀取 /etc/rc.conf、 再次啟動 /etc/rc 嗎?

    先進入單人使用者模式,然後再回到多使用者模式。

    在主控台執行:

        # shutdown now
        (Note: without -r or -h)
        
        # return
        # exit

    10.23. 什麼是 sandbox?

    "Sandbox" 是系統安全用的術語,有兩個意義:

    • 放在某些虛擬防護牆裡的執行程序,這些防護牆是用來阻止 某些人侵入這道程序,進而出入於更大的系統中。

      這道程序可以完全在防護牆裡 "動作"。也就 是說,它所執行的任何程式不可能會滲透到牆的外面。所以如果 您對它有安全上的顧慮,並不需要特別去監聽它的一舉一動,反 正它只能在牆內活動。

      舉例來說,可以用 userid 來做這道防護牆,這正是 security 和 named 說明文件中的定義。

      現在就用 ntalk 這個服務作說明(見 /etc/inetd.conf)。這個服務以前的 userid 是 root,現在執行時則是用 ttytty 這個使用者就是一個 sandbox,如果有人能夠順利用 ntalk 侵入系統,現在他就算進得來也只能用這個 userid。

    • 放在某個模擬機器裡的程式,這比上述來得更嚴密。基本上 這表示能侵入該程式的人相信他能再進入所屬的機器,但事實上 只會進入模擬出來的機器,無法進一步修改任何真實的資料。

      達到這個目的最常用的方法,就是在某個子目錄下做出模擬的 環境,然後用 chroot 執行該程式,這樣該程式的根目錄便是這個 子目錄,而非系統真正的根目錄。

      另一個常見作法是將某個檔案系統 mount 成唯讀,但在它 上面另外製造出程式以為可以寫入的檔案系統。這個程式會相信 它可以對其他檔案讀寫,但只有它看不到這個唯讀效應 - 系統 執行的一般程式都看得到。

      我們試圖將這類 sandbox 盡量透明化,讓使用者或侵入者 無法看到他是否在某個 sandbox 裡面。

    UNIX 實作兩種 sandbox,一個在程式層面,另一個則是由 userid 來達成。

    每個 UNIX 執行程序會用防火牆將它和所有其他程序隔開,某個程序 不可以隨意修改其他程序位址的資料。這和 Windows 中,程式可以輕易 修改其他位址資料,結果導致當機的情形大不相同。

    每個 UNIX 程序都屬於某個特定的 userid。如果該 userid 不是 root,就會將它和其他使用者的程序隔開。 Userid 同時也用於硬碟資料的存取權上。

    10.24. 什麼是 securelevel?

    securelevel 是核心中所實作的一個安全機制。基本上當 securelevel 是正值時,核心會限制某些工作;即使是 superuser (也就是 root) 也無法完成那些工作。在撰寫 本文時,securelevel 機制在一般的限制外,還能夠限制以下的功能:

    • 清除某些特定的檔案旗標,例如 schg (系統唯讀標旗, the system immutable flag)

    • 經由 /dev/mem/dev/kmem, 將資料寫入至核心記憶體中

    • 載入核心模組

    • 更動 ipfirewall(4) 規則。

    想要檢查在某個運作中的系統的 securelevel 狀態,只要執行以下 命令即可:

        # sysctl kern.securelevel

    輸出的結果會包含一個 sysctl(8) 變數名稱 (在這個例子中, 它是 kern.securelevel) 以及一個數字。後者即是 目前的 securelevel 值。如果它是一個正值 (也就是大於 0),表示至少 有一些 securelevel 的保護機制已經開啟了。

    你沒有辦法降低一個運作中的系統的 securelevel;如果可以的話, 就失去了這個機制的意義了。如果你要作一些需要 securelevel 為 非正值才可以的動作的話 (例如 installworld 或更動日期),你需要修改 /etc/rc.conf 內的 securelevel 設定 (找找 kern_securelevelkern_securelevel_enable 變數),然後重新開機。

    想要知道更多有關於 securelevel 與各個不同等級影響的細節, 請參考 init(8) 說明文件。

    Warningsecurelevel 可不是萬靈丹;它有許多已知的缺陷,往往造成 一種安全的假象。

    它一個最大的問題,就是要讓這個功能完全有效的話,在 securelevel 發揮作用前的啟動過程中,所有使用到的檔案都 必須被保護起來。如果一個攻擊者在 securelevel 有效前 (由於 有些系統在啟動中所作的事情,無法在較高的 securelevel 中 正常運作,所以這會在啟動過程中後期才會運作),能讓他們的程式 被執行的話,securelevel 的保護就完全無效了。保護啟動程序 中所有的檔案在技術上是可行的,但是如果真的這樣作的話,系統 維護將會變成一場夢魘。即使只是修改一個設定檔,也必須將整個 系統關閉,至少也得到單人模式。

    除了這點,還有許多其它的東西都在通信論壇上討論,尤其是 freebsd-security。請到 這裡 搜尋以前的 討論。有些人希望 securelevel 能夠儘快消失,由另一個更優秀的 機制取代,不過機會有點渺茫。

    風險自行承擔。

    10.25. 我想要把我的系統昇級到最新的 -STABLE,但是得到的是 -RC 或 -PRERELEASE!怎麼了?

    簡單地說:那只是名字而已。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 一文。

    10.26. 我試著要安裝一個新的核心,但是無法 chflags。我該怎麼解決?

    簡單地說:你的 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 的資訊。

    10.27. 在我的系統上,我無法變更時間超過一秒以上的範圍! 我該怎麼辦?

    簡單地講:你系統的 securelevel 也許大於 1。直接重新開機至 單人模式,然後再修改時間。

    詳細地說:在 securelevel 大於 1 的情況下,FreeBSD 不允許時間 變動大於一秒。你可以用以下的命令來檢查目前的 securelevel:

        # sysctl kern.securelevel

    你無法降低 securelevel;你必須啟動電腦至單人模式下以修改時間, 或是修改 /etc/rc.conf 再重新開機。請參考 init(8) 說明文件,以取得更多有關 securelevel 的資訊,還有 /etc/defaults/rc.confrc.conf(5) 說明文件,以取得更多有關 rc.conf 的資訊。

    10.28. 為什麼 rpc.statd 用了 256 megabytes 的記憶體?

    不,那不是 memory leak,而且它也不是真的用了 256 Mbyte 的記憶體。它只是喜歡 (意思就是總會這樣作) 將一狗票的記憶體 映謝到它自己的位址空間,以方便作事。就技術而言,這樣並沒有 什麼不對;這樣只是會讓 top(1)ps(1) 嚇一大跳而已。

    rpc.statd(8) 會將它的狀態檔案 (位於 /var ) 映射至它的位址空間裡;為了防止需要的時候再增大所 導致的重新映射,它一次會使用相當大的大小。從程式碼來看的話就 更明顯了,可以看到 mmap(2) 的長度參數為 0x10000000 ,它是 IA32 架構上的十六分之一的定址空間,也就是 256MB。

    10.29. 為什麼我沒辦法取消 schg 檔案旗標?

    你正在一個提高了 securelevel (也就是大於 0) 的系統運作。 降低 securelevel 再試試看。請參考 FAQ 中對 securelevel 的說明init(8) 說明文件。

    10.30. 為什麼近來的新版 FreeBSD 預設無法利用 .shosts 完成 SSH 認證?

    為什麼近來新版 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 執行就會生效了。

    10.31. 什麼是 vnlru?

    當系統達到上限 kern.maxvnodes 時, vnlru 會清除並釋放 vnode。這個核心 執行緒大部份的時間都沒事作,只有當你有很大的記憶體,而且 正在存取上萬個小檔案時,才會被啟動。