如何在 FreeBSD 下壓 MP3
2024-07-26 00:29:15
供稿:網(wǎng)友
Dru Lavigne
11/29/2000
在前面的文章里,我們學(xué)習(xí)了怎么顯示和管理運(yùn)行中的進(jìn)程。今天,我想描述一下那些進(jìn)程實(shí)際上如何啟動(dòng)的。
當(dāng)你啟動(dòng)計(jì)算機(jī)進(jìn)入FreeBSD時(shí)會(huì)有很多巧妙的事情發(fā)生。在此我無(wú)法論及所有的細(xì)節(jié),但FreeBSD handbook極好地解釋了引導(dǎo)過(guò)程。當(dāng)你啟動(dòng)你的計(jì)算機(jī)時(shí),可能會(huì)注意到內(nèi)核對(duì)硬件作了檢測(cè)并在終端上顯示了相應(yīng)的結(jié)果。當(dāng)檢測(cè)結(jié)束時(shí),內(nèi)核會(huì)啟動(dòng)兩個(gè)進(jìn)程:進(jìn)程 0 (swapper)和進(jìn)程 1 (init)。
負(fù)責(zé)進(jìn)程控制初始化的程序是init;沒(méi)有它,其它的進(jìn)程無(wú)法啟動(dòng)。在引導(dǎo)時(shí),init要做兩項(xiàng)重要的工作:首先,它在rc的控制之下裝入啟動(dòng)腳本,然后它初始化終端以便使用戶可以登錄。讓我們分別描述這些功能,從rc開(kāi)始:
whatis rc
rc(8) - command scripts for auto-reboot and daemon startup
這些腳本實(shí)際位于/etc/rc;通常,位于/etc下的這個(gè)配置文件對(duì)應(yīng)于手冊(cè)的第五部分,所以你可以根據(jù)手冊(cè)對(duì)配置文件作正確地修改。但是,如果你打:
man 5 rc
你卻會(huì)得到以下信息:
No entry for rc in section 5 of the manual
這對(duì)于上面提到的它位于手冊(cè)第八部分來(lái)說(shuō)看起來(lái)有點(diǎn)古怪,因?yàn)檫@部分手冊(cè)包含的是系統(tǒng)維護(hù)和操作命令,通常它們都是后臺(tái)進(jìn)程。讓我們進(jìn)一步來(lái)看一下這個(gè)文件:
more /etc/rc
# System startup script run by init on autoboot
# or after single-user.
# Output and error are redirected to console by init,
# and the console is the controlling terminal.
# Note that almost all of the user-configurable behavior
# is no longer in # this file, but rather in /etc/defaults/rc.conf.
# Please check that file first before contemplating any changes
# here. If you do need to change this file for some reason, we
# would like to know about it.
好,相當(dāng)清晰;看來(lái)對(duì)于該文件我們自己是不能亂來(lái)的。這里有些相當(dāng)重要的東西對(duì)于正確引導(dǎo)我們的系統(tǒng)所必須的。讓我們往后跳,看一些重要的部分來(lái)找出啟動(dòng)時(shí)實(shí)際上都發(fā)生了些什么。注意當(dāng)在引導(dǎo)過(guò)程中處理rc腳本時(shí),init會(huì)把所有的輸出和錯(cuò)誤信息記錄到終端上。
rc首先做的事之一就是設(shè)置路徑變量,以使它可以找到你FreeBSD系統(tǒng)上的可執(zhí)行程序:
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
然后它會(huì)查找/etc/defaults/rc.conf and和/etc/rc.conf這兩個(gè)文件:
# If there is a global system configuration file, suck it in.
if [ -f /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
elif [ -f /etc/rc.conf ]; then
. /etc/rc.conf
fi
接著它會(huì)作一個(gè)文件系統(tǒng)連貫性檢查。如果你曾經(jīng)非正常關(guān)閉FreeBSD系統(tǒng),你會(huì)在引導(dǎo)過(guò)程中看到它在這一步上發(fā)出抱怨的。
echo Automatic boot in PRogress...
fsck -p
假定fsck沒(méi)有遇到任何問(wèn)題,它就馬上裝載你的文件系統(tǒng):
# Mount everything except nfs filesystems.
mount -a -t nonfs
在其它任何進(jìn)程啟動(dòng)之前,你的CMOS時(shí)鐘必須調(diào)整為內(nèi)核時(shí)鐘可以理解的形式:
adjkerntz -i
然后整理var目錄,將引導(dǎo)信息寫(xiě)入dmesg.boot:
clean_var() {
if [ ! -f /var/run/clean_var ]; then
rm -rf /var/run/*
find /var/spool/lock ! -type d -delete
rm -rf /var/spool/uucp/.Temp/*
# Keep a copy of the boot messages around
dmesg >/var/run/dmesg.boot
接著rc會(huì)讀取以下文件:
/etc/rc.sysctl
/etc/rc.serial
/etc/rc.pccard
/etc/rc.network
/etc/rc.network6
然后復(fù)位終端權(quán)限:
# Whack the pty perms back into shape.
chflags 0 /dev/tty[pqrsPQRS]*
chmod 666 /dev/tty[pqrsPQRS]*
chown root:wheel /dev/tty[pqrsPQRS]*
并清理自己產(chǎn)生的“垃圾”以及/tmp目錄:
# Clean up left-over files
# Clearing /tmp at boot-time seems to have a long tradition. It doesn't
# help in any way for long-living systems, and it might accidentally
# clobber files you would rather like to have preserved after a crash
# (if not using mfs /tmp anyway).
# See also the example of another cleanup policy in /etc/periodic/daily.
# Remove X lock files, since they will prevent you from restarting X11
# after a system crash.
現(xiàn)在rc準(zhǔn)備啟動(dòng)一些后臺(tái)進(jìn)程,首先是syslogd和named:
# Start system logging and name service. Named needs to start before syslogd
# if you don't have a /etc/resolv.conf.
然后是inetd、cron、lpd、sendmail、sshd和usbd:
# Now start up miscellaneous daemons that don't belong anywhere else
接著rc將更新motd(每日信息)并執(zhí)行“uname -m”,這條命令會(huì)在屏幕上顯示構(gòu)架類型。
(/etc/rc文件結(jié)尾)
當(dāng)?shù)竭_(dá)/etc/rc的結(jié)尾時(shí),rc的工作就完成了。在此我們重新回顧一下:init調(diào)用rc腳本,它會(huì)讀取一些全局的和本地的配置文件以正確裝載文件系統(tǒng)并建立系統(tǒng)后臺(tái)進(jìn)程可以啟動(dòng)的環(huán)境。你的操作系統(tǒng)現(xiàn)在已經(jīng)啟動(dòng)并運(yùn)行著,但到此為止,還沒(méi)有一個(gè)用戶可以與操作系統(tǒng)實(shí)際交互的環(huán)境。這就是init第二個(gè)重要的功能。
配置文件/etc/ttys將會(huì)被讀取以決定初始化的終端。不象/etc/rc,該文件可以由超級(jí)用戶經(jīng)常編輯以確保讓init來(lái)初始化所需的終端。
為了理解此文件,我們必須了解在你的FreeBSD系統(tǒng)上有三種類型的終端。以“ttyv”開(kāi)頭后跟一個(gè)數(shù)字的是虛擬終端;它們都是用戶可以獲得的物理存在于FreeBSD系統(tǒng)上的終端。缺省情況下,這些虛擬終端中的第一個(gè),或叫“ttyv0”,表示控制臺(tái)。以“ttyd”開(kāi)頭后跟一個(gè)數(shù)字的是串行線路或撥號(hào)終端;它們是用戶用調(diào)制解調(diào)器遠(yuǎn)程訪問(wèn)你的FreeBSD系統(tǒng)時(shí)可獲得的終端。最后一種終端類型就是偽終端或網(wǎng)絡(luò)終端;它們以“ttyp”開(kāi)頭后跟一個(gè)數(shù)字或字母,用于通過(guò)網(wǎng)絡(luò)連接訪問(wèn)你的FreeBSD系統(tǒng)。
如果我們用以下命令看此文件:
more /etc/ttys
我們會(huì)看到此文件分為三部分,每個(gè)部分分別對(duì)應(yīng)這三種類型的終端。同時(shí)每個(gè)部分還分為四欄,總結(jié)為下面的圖表:
欄名
含義
name
終端設(shè)備的名稱
getty
在終端上啟動(dòng)運(yùn)行的程序,通常為getty。其它項(xiàng)目包括xdm,它用來(lái)啟動(dòng)X Window系統(tǒng),或none,說(shuō)明沒(méi)有程序。
type
對(duì)于虛擬終端,對(duì)應(yīng)的類型為cons25。其它通常的值包括偽終端network,調(diào)制解調(diào)器入口dialup,以及unknown,用于用戶試圖以無(wú)法預(yù)定的類型進(jìn)行連接的終端。
status
它必須是on或off。如果是on,init將運(yùn)行g(shù)etty欄指定的程序。如果出現(xiàn)單詞“secure”,說(shuō)明該tty允許root登錄;為避免這種情況,可以用單詞“insecure”。
讓我們從虛擬終端部分開(kāi)始解釋該文件;可以看到它是以設(shè)置控制臺(tái)開(kāi)始的:
# If console is marked "insecure", then init will ask
# for the root passWord when going to single-user mode.
console none unknown off secure
如果在引導(dǎo)過(guò)程中fsck命令運(yùn)行出了問(wèn)題,init將使你的FreeBSD系統(tǒng)進(jìn)入單用戶模式以使root用戶可以修復(fù)問(wèn)題。如果你用insecure代替secure來(lái)設(shè)置控制臺(tái),init將在你可以繼續(xù)干之前索取口令。
ttyv0 "/usr/libexec/getty Pc" cons25 on secure
# Virtual terminals
ttyv1 "/usr/libexec/getty Pc" cons25 on secure
ttyv2 "/usr/libexec/getty Pc" cons25 on secure
ttyv3 "/usr/libexec/getty Pc" cons25 on secure
ttyv4 "/usr/libexec/getty Pc" cons25 on secure
ttyv5 "/usr/libexec/getty Pc" cons25 on secure
ttyv6 "/usr/libexec/getty Pc" cons25 on secure
ttyv7 "/usr/libexec/getty Pc" cons25 on secure
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
你可以看到在我的FreeBSD系統(tǒng)上除了控制臺(tái)以外還有八個(gè)虛擬終端;我可以通過(guò)按ALT鍵加一個(gè)控制鍵來(lái)訪問(wèn)每個(gè)終端。例如ALT F1可訪問(wèn)控制臺(tái),ALT F2訪問(wèn)ttyv1, ALT F3訪問(wèn)ttyv2,等等。如果我啟動(dòng)了X會(huì)話,那么它可以用ALT F8來(lái)訪問(wèn)。如果我把ttyv8上的單詞off改為on,那么我可以在引導(dǎo)時(shí)得到一個(gè)X終端而不是控制臺(tái)。然后可以繼續(xù)用我ALT加功能鍵來(lái)訪問(wèn)其它終端。我的所有這些虛擬終端都標(biāo)為“secure”,說(shuō)明它們都可接受root登錄。你可以有多少個(gè)虛擬終端是由你的FreeBSD版本所決定的;如果你希望建立更多虛擬終端,可以讀一下這個(gè)faq。
現(xiàn)在讓我們移到撥號(hào)終端:
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0 "/usr/libexec/getty std.9600" dialup off secure
ttyd1 "/usr/libexec/getty std.9600" dialup off secure
ttyd2 "/usr/libexec/getty std.9600" dialup off secure
ttyd3 "/usr/libexec/getty std.9600" dialup off secure
你可以看到我有四個(gè)可獲得的撥號(hào)終端,但它們都被關(guān)閉了。如果我想讓用戶通過(guò)調(diào)制解調(diào)器訪問(wèn)我的FreeBSD系統(tǒng),我就必須至少打開(kāi)它們中的一個(gè),還必須決定是否讓這些用戶可以用root身份登錄;如果不,就把單詞“secure”改為“insecure”。你是否看到getty欄含有數(shù)字9600,它說(shuō)明數(shù)據(jù)傳輸率為9600bps。因?yàn)楝F(xiàn)在很多調(diào)制解調(diào)器都有更高的速率,我也可以把它改為57600。最后,最好讀一下FreeBSD handbook中的撥號(hào)服務(wù)部分。
/etc/ttys文件的最后一部分是網(wǎng)絡(luò)或偽終端。你會(huì)看到它們有很多,準(zhǔn)確地說(shuō)是255個(gè),范圍從:
# Pseudo terminals
ttyp0 none network
到
ttySv none network
且缺省情況下它們都沒(méi)有被允許。
如果你為了使/etc/ttys更改生效以使init使用這些更改,可以超級(jí)用戶的身份向init發(fā)送一個(gè)HUP信號(hào),如:
kill -1 1
這里前面的-1代表信號(hào)1(HUP),而后面1代表進(jìn)程1(init)。
那么現(xiàn)在,哪個(gè)/etc/ttys文件中提到的getty程序繼續(xù)保持運(yùn)行呢?man 8中對(duì)getty的描述如下:
描述
init(8)調(diào)用getty程序打開(kāi)并初始化tty行,讀取一個(gè)登錄名,然后調(diào)用login(1)。
所以,init讀取/etc/ttys并在每個(gè)你在配置文件中設(shè)定的終端上啟動(dòng)一個(gè)getty進(jìn)程。getty的工作是監(jiān)視終端看是否有人試圖登錄。如果有的話,getty將啟動(dòng)登錄程序校驗(yàn)用戶的登錄名和口令。如果校驗(yàn)合格,登錄程序會(huì)啟動(dòng)用戶的登錄命令解釋器并把用戶置于他們的宿主目錄下。當(dāng)用戶具有一個(gè)命令解釋器后,他們就可以與操作系統(tǒng)交互了。現(xiàn)在它就可以讓命令解釋器解釋用戶的輸入并確保啟動(dòng)了必要的進(jìn)程。
當(dāng)一個(gè)用戶退出登錄時(shí),再次調(diào)用init啟動(dòng)其它的getty進(jìn)程以繼續(xù)監(jiān)視終端等待其它的登錄嘗試。
讓我們看一下ps命令的輸出來(lái)總結(jié)一下剛才這次引導(dǎo)的整個(gè)過(guò)程,F(xiàn)reeBSD 4.1缺省已經(jīng)安裝了ps程序。我將用-ax開(kāi)關(guān)以包含系統(tǒng)進(jìn)程:
ps -ax
PID TT STAT TIME COMMAND
0 ?? DLs 0:00.01 (swapper)
1 ?? ILs 0:00.16 /sbin/init --
2 ?? DL 0:00.02 (pagedaemon)
3 ?? DL 0:00.00 (vmdaemon)
4 ?? DL 0:00.02 (bufdaemon)
5 ?? DL 0:01.02 (syncer)
1056 ?? Is 0:00.00 adjkerntz -i
1187 ?? Ss 0:00.08 syslogd -s
1206 ?? Is 0:00.05 inetd -wW
1208 ?? Is 0:00.11 cron
1622 ?? Ss 0:00.02 sendmail: accepting connections on port 25 (sendmail)
1621 v0 Ss 0:00.12 -csh (csh)
1701 v0 R+ 0:00.00 ps -ax
1699 v1 Is+ 0:00.01 /usr/libexec/getty Pc ttyv1
1619 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2
1618 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3
1617 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4
1616 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5
1615 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6
1614 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7
現(xiàn)在你可以認(rèn)識(shí)很多進(jìn)程:swapper的PID為0而init的為1。adjkerntz,syslogd,inetd,cron和sendmail都是由rc啟動(dòng)的。當(dāng)然,我必須在一個(gè)命令解釋器上運(yùn)行這個(gè)ps命令;在上述情況中,它是從ttyv0上的c shell解釋器運(yùn)行的。getty進(jìn)程等待虛擬終端1-7上的登錄。而在虛擬終端8上則沒(méi)有運(yùn)行g(shù)etty進(jìn)程,因?yàn)樵摻K端在/etc/ttys中被標(biāo)為了“off”。