欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
devfs文件系統(二)
在本文中,我們將完成把我們的 Linux 系統轉換到 devfs,即設備文件系統。對于那些正在加入 devfs 系列的人來(lái)說(shuō),請閱讀 本系列的第
4 部分,在那里面我解釋了 devfs 是如何解決內核級設備注冊這一令人頭疼的問(wèn)題。然后請閱讀 本系列的第 5 部分,在那一部分里我談到了所有的所需步驟,您需要采用這些步驟來(lái)使得 Linux 系統與 devfs 兼容以便將系統最終轉 換到 devfs。

 

如果還沒(méi)有閱讀過(guò)第 5 部分,那么在按這里所寫(xiě)的去做之前現在就閱讀它是很重要的。 如果跳過(guò)了第 5 部分中的步驟,那么幾乎可以肯定將要安裝的初始化封裝器將不能正確地運行,并且將最終得到一個(gè)無(wú)法引導的、需要緊急恢復的系統。這不是一件好事。然而,如果已經(jīng)讀過(guò)第 5 部分,那么就可以往下做了。

 

初始化封裝器

 

開(kāi)始

 

我曾經(jīng)在第 5 部分結束時(shí),介紹了初始化封裝器的概念,并且解釋了初始化封裝器非常適合于解決若干 devfs 初始化問(wèn)題的原因。無(wú)須多說(shuō),讓我們逐步來(lái)看完整的初始化封裝器并且研究每一部分做什么。我們將從頭開(kāi)始:

 

初始化封裝器,開(kāi)始部分

 

#!/bin/bash

 

# Copyright 2001 Daniel Robbins <drobbins@gentoo.org>, Gentoo Technologies, Inc.

 

# Distributed under the GNU General Public License, version 2.0 or later.

 

 

trap ":" INT QUIT TSTP  

 

export PATH=/sbin:/bin:/usr/sbin:/usr/bin

 

umask 022

 

 

if [ $$ -ne 1 ]

 

then

 

     exec /sbin/init.system $*

 

fi

 

正如您所看到的一樣,由于在腳本的開(kāi)始有 #!/bin/bash 語(yǔ)句,所以初始化封裝器是一個(gè)真正的 bash 腳本。這里正好向您指出初始化封裝器運行 需要 bash 2.0 或更高版本;輸入 /bin/bash --version 命令來(lái)看一下 bash shell 版本是否足夠新 。如果不是,可能想知道是否安裝了 /bin/bash2 可執行文件。如果安裝了,請將腳本的第 1 行改為 #!/bin/bash2 。

 

現在,讓我們來(lái)閱讀腳本。 trap 命令防止用戶(hù)在腳本執行時(shí)中斷(例如,在引導時(shí)鍵入 control-C)腳本。然后, export 一個(gè)合理的缺省路徑并且設置缺省 umask 為 022。由于在 2.4 之前發(fā)布的一些內核中有一個(gè)會(huì )產(chǎn)生 umask 缺省為 0 的錯誤,這一錯誤可能會(huì )造成安全威脅,因此在引導階段盡可能早的設置一個(gè)缺省的 umask 總不失為一個(gè)好主意。

 

接下來(lái),碰到了第一個(gè)條件語(yǔ)句, if [ $$ -ne 1 ] 。 bash 將 $$ 擴展為當前正在運行的進(jìn)程標識,因此可以發(fā)現我們真正想問(wèn)的問(wèn)題是“我們的進(jìn)程標識根本不是 1 嗎?”這樣做有什么意義呢?如果是在引導期間,則 bash 是由內核啟動(dòng)的,由于 PID 1 是為 init 進(jìn)程保留的,所以將總會(huì )得到 PID 為 1。如果 PID 不是 1,則知道在系統已經(jīng)引導之后,正在從命令行方式運行。由于 /sbin/init 命令有雙重用途,允許超級用戶(hù)改變已經(jīng)引導的系統的運行級別,因此這很正常。如果是這樣的話(huà),那么僅僅 exec 了原來(lái)的 /sbin/init (現在 改名為 /sbin/init.system ) 。通過(guò)使用 $* 變量來(lái)傳遞任何命令行參數給 init.system ,初始化封裝器終止,并且 init.system 開(kāi)始執行。

 

內核引導選項

 

然而,如果在引導期間 正在由內核啟動(dòng)封裝器,則 bash 的 PID 將為 1 ,當 bash 繼續執行封裝器時(shí),將跳過(guò)該條件語(yǔ)句。就這么提一下,以下是接下來(lái)的幾行:

 

初始化封裝器中的更多內容

 

mount -n /proc

 

devfs="yes"

 

for copt in `cat /proc/cmdline`

 

do

 

     if [ "${copt%=*}" = "wrapper" ]

 

     then

 

         parms=${copt##*=}

 

         #parse wrapper option

 

         if [ "${parms/nodevfs//}" != "${parms}" ]

 

         then

 

             devfs="no"

 

         fi

 

     fi

 

done

 

如果運行到這一代碼塊,那就意味著(zhù)在系統引導期間,正在啟動(dòng);作為處理的第一條命令,將 /proc 安裝到根文件系統,這個(gè) /proc 當前為只讀。在那之后,執行一個(gè)大而復雜的 bash 代碼塊,該代碼塊利用了一個(gè)非常便利的 Linux 特性。您可能不了解這一特性,內核允許查看 /proc/cmdline 的內容來(lái)弄清楚 LILO 或 GRUB 傳給內核什么選項。在我們的開(kāi)發(fā)機器中,/proc/cmdline 的內容如下所示:

 

 

/proc/cmdline 的內容

 

# cat /proc/cmdline

 

root=/dev/hda6 hda=89355,16,63 mem=524224K

 

 

在上面的代碼中,利用已有的 /proc/cmdline,通過(guò)它來(lái)查找一個(gè)我們自己創(chuàng )建的、稱(chēng)為 wrapper 的內核引導變量。如果 wrapper=nodevfs 出現在內核引導選項中,那么該腳本知道不去啟動(dòng) devfs。然而,如果這一變量沒(méi)有出現在 /proc/cmdline 中,那么封裝器將進(jìn)行 devfs 初始化。這里的含意是說(shuō)您可以通過(guò)使用 wrapper=nodevfs 內核引導選項來(lái)禁止 devfs。如果這么做的話(huà), devfs 變量將被設置成 no ;否則它將被設置成 yes 。

 

封裝它

 

下面是該封裝器的剩余部分:

 

初始化封裝器的剩余部分

 

if [ "$devfs" = "yes" ]

 

then

 

if [ -e /dev/.devfsd ]

 

then

 

     clear

 

     echo

 

     echo "The init wrapper has detected that /dev has been automatically mounted by"

 

     echo "the kernel. This will prevent devfs from automatically saving and"

 

     echo "restoring device permissions. While not optimal, your system will still"

 

     echo "be able to boot, but any perm/ownership changes or creation of new compat."

 

     echo "device nodes will not be persistent across reboots until you fix this"

 

     echo "problem."

 

     echo

 

     echo "Fortunately, the fix for this problem is quite simple; all you need to"

 

     echo "do is pass the \"devfs=nomount\" boot option to the kernel (via GRUB"

 

     echo "or LILO) the next time you boot.   Then /dev will not be auto-mounted."

 

     echo "The next time you compile your kernel, be sure that you do not"

 

     echo "enable the \"Automatically mount filesystem at boot\" devfs kernel"

 

     echo "configuration option.   Then the \"devfs=nomount\" hack will no longer be"

 

     echo "needed."

 

     echo

 

      read -t 15 -p "(hit Enter to continue or wait 15 seconds...)"

 

else   

 

     mount -n /dev /dev-state -o bind

 

     mount -n -t devfs none /dev

 

     if [ -d /dev-state/compat ]

 

     then

 

             echo Copying devices from /dev-state/compat to /dev

 

             cp -ax /dev-state/compat/* /dev

 

     fi

 

fi

 

/sbin/devfsd /dev >/dev/null 2>&1;

 

fi

 

exec /sbin/init.system $*

 

 

現在我們碰到了一個(gè)大的條件語(yǔ)句,只有在 devfs 被設置成為 yes 時(shí),該條件語(yǔ)句才會(huì )執行。如果不是這樣,則完全跳過(guò) devfs 初始化,甚至不會(huì )安裝 devfs。這會(huì )導致一個(gè)常見(jiàn)的非 devfs 引導。

 

然而,如果 正在安裝 devfs,則進(jìn)入該條件語(yǔ)句。在該條件語(yǔ)句里,檢查內核是否已經(jīng)安裝 devfs;通過(guò)檢查 /dev/.devfsd 字符設備是否存在來(lái)實(shí)現這一目的。當安裝 devfs 時(shí),內核自動(dòng)創(chuàng )建該設備,并且隨后的 devfsd 進(jìn)程將使用它來(lái)與內核通信。如果已經(jīng)安裝了 devfs(因為用戶(hù)選擇了“Automatically mount devfs at boot”內核選項),將打印一條信息告訴用戶(hù):由于只有在內核 還沒(méi)有 devfs 時(shí),才可以安裝 devfs 的持久性特性,現在無(wú)法完成這一任務(wù)。

 

設備持久性

 

然而,如果一切正常,則執行了在上篇文章中所談到的 devfs 安裝:/dev 被綁定安裝到 /dev-state 并且 devfs 文件系統被安裝在 /dev 上。然后,執行一項在上篇文章中 沒(méi)有提到的一個(gè)步驟;檢查目錄 /dev-state/compat 是否存在并且遞歸地把它的內容復制到 /dev 目錄。雖然這一過(guò)程最初看起來(lái)有些多余(我們將利用 devfsd 的設備持久性特性,不是嗎?),但是最終會(huì )證明這一過(guò)程是必要和有用的。需要一個(gè) compat 目錄的原因在于 devfsd 的持久性特性 僅僅只能使用支持 devfs 的驅動(dòng)器。

 

最后,啟動(dòng) devfsd ,然后退出該條件語(yǔ)句并且 exec 實(shí)際的 init, /sbin/init.system 來(lái)開(kāi)始標準的系統引導過(guò)程。除了現在需要一個(gè)支持 devfs 的系統之外,所有東西都是標準的 :)

 

初始化封裝器安裝

 

下面是我們如何安裝初始化封裝器。首先, 獲取 wrapper.sh 所需資源,并且把它保存在系統的某個(gè)地方。然后,按下面所說(shuō)的做:

 

安裝初始化封裝器

 

# cd /sbin

 

# cp init init.system

 

# cp /path/to/wrapper.sh init

 

# chmod +x init

 

現在初始化封裝器安裝在正確的地方了。

 

調整 umount

 

通過(guò)使用初始化封裝器,避免了編制大量復雜的啟動(dòng)腳本來(lái)進(jìn)行調整。不過(guò),我們可能還是不能避免 一個(gè)調整。既然,我們將 devfs 安裝在 /dev,則 rc 腳本卸載根文件系統將可能會(huì )非常困難。幸運的是,有一個(gè)簡(jiǎn)便方法可以解決這一問(wèn)題。只需要輸入 cd /etc/rc.d; grep -r umount * 或 cd /etc/init.d; grep -r umount * 來(lái) grep rc 腳本目錄中所有出現 umount 的地方,具體輸入哪條命令取決于 rc 腳本安裝在什么地方。然后,在每個(gè)引用 umount 的腳本里,請確保調用時(shí)帶有選項 -r 。雖然在各處使用 umount -r 仍然會(huì )起作用,但這一特定的 umount 的命令對于卸載根文件系統是十分重要的:)

 

-r 選項告訴 umount ,如果沒(méi)能成功卸載文件系統,就以只讀方式重新安裝。對于把根文件系統設置到一致?tīng)顟B(tài)來(lái)說(shuō),這已經(jīng)足夠了,而且即便根文件系統由于在 /dev 上的有一個(gè)安裝而無(wú)法卸載(由于無(wú)法卸載打開(kāi)的設備節點(diǎn)),這也為根文件系統重新引導做好了準備。

 

現在,我們 幾乎為重新引導做好了準備;但是在重新引導之前,讓我們來(lái)看一下 devfsd 并且修改 /etc/devfsd.conf 以便支持兼容性設備和設備持久性。不用擔心,我們離完成轉換到 devfs 只有一步之遙。

 

devfsd.conf

 

用您喜愛(ài)的編輯器打開(kāi) /etc/devfsd.conf。下面是我推薦的 devfsd.conf 中的頭四行:

 

devfsd.conf,開(kāi)始部分

 

REGISTER         .*               MKOLDCOMPAT

 

UNREGISTER       .*               RMOLDCOMPAT

 

REGISTER         .*               MKNEWCOMPAT

 

UNREGISTER       .*               RMNEWCOMPAT

 

上面四行中的每一行都含有一個(gè) 事件( REGISTER 或 UNREGISTER ),一個(gè)正則表達式( .* )以及一項操作( *COMPAT 字符串)。那么,它們都表示什么意思呢?第 1 行告訴 devfsd ,當有內核中注冊 任何設備( .* 是表示匹配 任何設備的正則表達式)時(shí),執行 MKOLDCOMPAT 操作。 MKOLDCOMPAT 操作是 devfsd 內置的,它的含義是“創(chuàng )建任何與正在通過(guò) devfs 注冊的設備相對應的舊兼容設備”。正如您可能想到的一樣,在刪除設備時(shí),會(huì )運行 RM*COMPAT 操作,這使得這些特定的兼容設備魔術(shù)般的消失??偟膩?lái)說(shuō),這四行語(yǔ)句告訴 devfsd ,當設備注冊時(shí),創(chuàng )建兼容設備(如果有的話(huà)),當解除設備注冊時(shí),刪除兼容設備。多虧了這幾行,當 IDE 設備驅動(dòng)器在系統中注冊 /dev/ide/host0/bus0/target0/lun0/disc devfs 樣式的設備時(shí), devfs 自動(dòng)創(chuàng )建一個(gè)匹配 /dev/hda 兼容樣式的設備。這對于諸如 mount 和 fsck 命令來(lái)說(shuō),是極其有幫助的,這些命令可能會(huì )讀一個(gè)包含舊樣式設備的 /etc/fstab 。一般來(lái)說(shuō),創(chuàng )建兼容設備使得 devfs 的轉換成了一個(gè)無(wú)縫轉換。devfsd.conf 中的下一行是:

 

自動(dòng)裝載模塊

 

devfsd.conf,續上

 

LOOKUP           .*               MODLOAD

 

這一項告訴 devfsd ,無(wú)論什么時(shí)侯“查看”任何設備( .* ),就執行 MODLOAD 操作,這是指當程序查找特定設備節點(diǎn)是否存在時(shí)所發(fā)生的操作。 MODLOAD 操作將導致執行 modprobe /dev/mydev ,這里的 /dev/mydev 是特定進(jìn)程所要查找的設備名。多虧了這一特性(以及正確配置的 /etc/modules.conf),當啟動(dòng)音樂(lè )播放器或其它美妙的東西時(shí),可能可以按照需要自動(dòng)裝入聲卡驅動(dòng)器。

 

設備持久性

 

以下是 devfsd.conf 中的接下來(lái)的幾行:

 

devfsd.conf,續上

 

REGISTER         ^pt[sy]/.*       IGNORE

 

CHANGE           ^pt[sy]/.*       IGNORE

 

REGISTER         .*               COPY     /dev-state/$devname $devpath

 

CHANGE           .*               COPY     $devpath /dev-state/$devname

 

CREATE           .*               COPY     $devpath /dev-state/$devname

 

這幾行告訴 devfsd 使用 /dev-state 作為用于設備許可權和所有權變更以及任何用戶(hù)可以創(chuàng )建的兼容設備的資源庫。在頭兩行中,顯式地告訴 devfsd ,當內核中注冊了任何偽終端設備或當它們的屬性被更改時(shí),不要執行任何特殊的操作。如果沒(méi)有這幾行,則在重引導系統之后,仍然會(huì )保留偽終端的許可權和所有權。那樣做不太理想,因為應該總是在系統啟動(dòng)之后給予偽終端一套新的缺省許可權。

 

接下來(lái)的三行為所有其它設備打開(kāi) /dev-state 持久性。特別地,注冊設備或 devfsd 自己?jiǎn)?dòng)時(shí),將 從 /dev-state 恢復設備的任何屬性(以及復制給任何現有的兼容設備),并且我們將立即 備份屬性的任何更改,以及將任何新兼容設備創(chuàng )建到 /dev-state 中去。

 

CFUNCTION 和符號鏈接

 

給出以下幾行,最終完成 devfsd.conf:

 

devfsd.conf,結束

 

REGISTER         ^cdrom/cdrom0$           CFUNCTION GLOBAL symlink cdroms/cdrom0 cdrom

 

UNREGISTER       ^cdrom/cdrom0$           CFUNCTION GLOBAL unlink cdrom

 

REGISTER         ^misc/psaux$             CFUNCTION GLOBAL symlink misc/psaux mouse

 

UNREGISTER       ^misc/psaux$             CFUNCTION GLOBAL unlink mouse

 

這最后四行是可選的,但它們也值得一看。雖然對于設備節點(diǎn),/dev-state 持久性工作得非常好,但對符號鏈接卻根本不起任何作用,它會(huì )忽略符號鏈接。因此,這就產(chǎn)生一個(gè)問(wèn)題:人們怎么確保 /dev/mouse 或 /dev/cdrom 符號鏈接不僅存在,而且在重新引導系統之后它還是存在的呢?幸運的是, devfsd 可配置性非常好,這四行(或類(lèi)似這樣的,可以定制你的特定系統)將完成這一任務(wù)。頭兩行告訴 devfsd ,當注冊 /dev/cdrom/cdrom() 時(shí),使 /dev/cdrom 符號鏈接出現。為了做到這一點(diǎn), devfsd 實(shí)際上執行指定的 libc 函數的動(dòng)態(tài)調用,這里是 symlink() 和 unlink() 。該文件的最后兩行使用相同的方法,在 /dev/misc/psaux(PS/2 鼠標)設備注冊到 devfs 時(shí),創(chuàng )建 /dev/mouse 符號鏈接。根據 您的系統來(lái)定制這幾行,然后保存該文件。如果您愿意,可以 下載這個(gè) devfsd.conf 文件,用在您自己的系統上。

 

重新引導之前的注意事項

 

在重新引導之前,您可能想看一下 Richard Gooch 的 devfs FAQ;您可能會(huì )找到關(guān)于 devfs 命名方案的信息,這些信息對于熟悉新風(fēng)格設備名是非常有幫助的(請參閱下面的 參考資料)。我還建議您打印一份 本系列第 5 部分,以備您在解決與引導相關(guān)的問(wèn)題時(shí),能利用“緊急 bash 搶救”指導。記住,如果初始化封裝器因為某種原因而崩潰,請遵循我的緊急搶救指導,重新安裝根文件系統為讀/寫(xiě),然后執行下面步驟,這總是可以除去它的:

 

如果需要,請返回至使用封裝器前的狀態(tài)

 

# cd /sbin

 

# mv init wrapper.sh

 

# mv init.system init

 

在執行完這些步驟,并將文件系統重新安裝成只讀,然后,重新引導之后,系統將返回到使用預封裝器前的狀態(tài)?,F在繼續,重新引導,體驗一下 devfs
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
下接 android linux 基礎知識總結[下]1
/dev目錄的創(chuàng )建
掌握udev
一步步設計自己的驅動(dòng)程序
根文件系統的制作
linux內核初始化以及啟動(dòng)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久