U盘的热拔插/自动挂载跟linux2.6 kernel、 udev、 hal、 dbus 、gnome-mount 、thunar的关系...
U盤的熱拔插/自動(dòng)掛載跟linux2.6 kernel、 udev、 hal、 dbus 、gnome-mount 、thunar的關(guān)系
博客分類:
- System About
將網(wǎng)上的資料整理了下。
簡(jiǎn)單的說就是:
插入新設(shè)備后,
kernel 發(fā)現(xiàn)設(shè)備變化反應(yīng)到 sysfs 上并通知 udev,
udev 把硬件相關(guān)內(nèi)容送給 hal,
hal 過濾、處理之后發(fā)送信息到 dbus 總線,
thunar 從 dbus 收到信息后在 xfdesktop 桌面顯示新圖標(biāo),
用戶點(diǎn)擊桌面圖標(biāo)后用 pmount 把設(shè)備掛上,打開掛載 目錄。
具體的說就是:
?這是當(dāng)時(shí)的情況,如今小有變化,gnome缺省使用 gnome-mount 而不是 pmount 了,gnome-mount 使用 gconf-editor 配置,而不是 pmount 的策略,其余機(jī)制沒啥變化。
(原發(fā)于BBS Linux 版面)
關(guān)鍵字: sysfs, hotplug, udev, hal, gnome-volume-manager, pmount
關(guān)于自動(dòng)掛載可移動(dòng)存儲(chǔ)介質(zhì),譬如 u 盤啥的一直是很多人想要實(shí)現(xiàn)的東東,缺省的,對(duì)于高版本內(nèi)核的系統(tǒng),gnome 里面是可以這樣的,這個(gè)原因恐怕很多人還不是很清楚,那天看了兩眼,來解釋一下,有啥不對(duì)的地方,還請(qǐng)指出
?
自動(dòng)掛載磁盤分區(qū)的操作從底層來說,是要內(nèi)核支持的,2.6 內(nèi)核的sysfs 虛擬文件系統(tǒng)就提供了這一支持,這個(gè)文件系統(tǒng) (/sys/) 通常用于反應(yīng)系統(tǒng)硬件信息,總線上的設(shè)備變化、網(wǎng)絡(luò)設(shè)備的變化等事件在這里都能反應(yīng)出來,這個(gè)文件系統(tǒng)的變化配合上內(nèi)核的 hotplug 機(jī)制就可以掌握硬件改動(dòng)相關(guān)的信息了。
?
說到內(nèi)核的 hotplug 機(jī)制,簡(jiǎn)單地說就是在硬件發(fā)生變化的時(shí)候去通知某一用戶態(tài)程序,缺省是 /sbin/hotplug,不過現(xiàn)在它已經(jīng)被 udev 取代了,收到信息之后,udev 會(huì)根據(jù) sysfs 的變化調(diào)用一些腳本來處理這個(gè)事件,這里的處理是指某個(gè)用戶空間的動(dòng)作,而不是加載驅(qū)動(dòng),加載驅(qū)動(dòng)是內(nèi)核自己的事情,在 udev 反應(yīng)過來之前就完成了。
?
下面輪到我們著名的硬件抽象層 (HAL) 程序的了,這個(gè)程序有一個(gè)派駐到 udev 的腳本,把硬件改動(dòng)信息部分地送到自己這里來處理,根據(jù)它的不同設(shè)置,有可能會(huì)提示某些東東來掛載磁盤阿、檢測(cè)新進(jìn)來的數(shù)碼相機(jī)阿……
?
那 hal 怎么發(fā)出通知呢? 這是利用一個(gè)新興的系統(tǒng)內(nèi)用戶空間消息總線系統(tǒng) -- dbus 來完成的,hal 會(huì)通過 dbus 上的一條消息總線把新加入的塊設(shè)備和相關(guān)的掛載提示信息,比如加載選項(xiàng) sync, iocharset 之類的信息發(fā)送到總線上來,只等待一個(gè)終結(jié)者來接受并處理這些信息了。
?
這個(gè)終結(jié)者對(duì)于 gnome 來說就是 gnome-volume-manager (名字太長(zhǎng)了,下面簡(jiǎn)稱 gvm),它從 dbus 上探聽消息,當(dāng)發(fā)現(xiàn)有設(shè)備掛載提示的時(shí)候就會(huì)嘗試把設(shè)備掛載上來。缺省的,還會(huì)打開一個(gè) nautilus 瀏覽窗口來瀏覽新掛載上的分區(qū)的內(nèi)容。
?
嗯,最后一個(gè)問題就是怎么掛了,眾所周知,如果塊設(shè)備在 /etc/fstab 里沒有描述存在的話,掛載就比較麻煩:
- 本來如果有 fstab 中的 user 屬性的話,普通用戶可以掛載,但? 現(xiàn)在沒有,普通用戶沒法掛
- 如果 sudo 授權(quán)的話,用戶可能獲得掛載其他分區(qū)的過大權(quán)限,危及 系統(tǒng)安全。
pmount 就是這個(gè)工具鏈上的最后一環(huán),它可以代表用戶 (運(yùn)行 gvm 的用戶) 來掛載一個(gè)屬于他的可移動(dòng)存儲(chǔ)設(shè)備,即使 fstab 里沒有這個(gè)設(shè)備存在,缺省的掛載位置是 /media/ 下,和 塊設(shè)備同名,比如 /dev/sda1 掛載到 /media/sda1/ 目錄。
?
嗯,綜上,設(shè)備的自動(dòng)掛載就完成了,呵呵,希望一大堆的關(guān)鍵詞沒把大家搞暈,回顧一下: kernel 發(fā)現(xiàn)設(shè)備變化反應(yīng)到 sysfs 上并通過 hotplug 機(jī)制通知udev, udev 把硬件相關(guān)內(nèi)容送給 hal,hal 過濾、處理之后發(fā)送信息到 dbus 上,在 dbus 上等候的 gvm 收到消息后用 pmount 把設(shè)備掛上,這樣,設(shè)備的自動(dòng)掛載就完成了 :)
從具體實(shí)現(xiàn)層面來說就是:
App
↑? ?? ?? ?? ???App等候設(shè)備處理信息并掛載設(shè)備
D-Bus
↑? ?? ?? ?? ???過濾處理內(nèi)容后送給D-Bus
HAL? ?? ?? ?? ? 它是一個(gè)位于操作系統(tǒng)和驅(qū)動(dòng)程序之上,運(yùn)行在用戶空間中的服務(wù)程序
↑? ?? ?? ?? ???把硬件相關(guān)內(nèi)容送到HAL
udev
↑? ?? ?? ?? ???kernel2.6發(fā)現(xiàn)設(shè)備變化反映到sysfs, 并通過hotplug機(jī)制通知udev
Linux Kernel2.6 自動(dòng)調(diào)用驅(qū)動(dòng)模塊
1. 自動(dòng)掛載磁盤分區(qū)的操作從底層來說,是要內(nèi)核支持的,2.6 內(nèi)核的sysfs 虛擬文件系統(tǒng)就提供了這一支持,這個(gè)文件系統(tǒng) (/sys/) 通常用于反應(yīng)系統(tǒng)硬件信息,總線上的設(shè)備變化、網(wǎng)絡(luò)設(shè)備的變化等事件在這里都能反應(yīng)出來,這個(gè)文件系統(tǒng)的變化配合上內(nèi)核的 hotplug 機(jī)制就可以掌握硬件改動(dòng)相關(guān)的信息.
說到內(nèi)核的 hotplug 機(jī)制,簡(jiǎn)單地說就是在硬件發(fā)生變化的時(shí)候去通知某一用戶態(tài)程序,缺省是 /sbin/hotplug,不過現(xiàn)在它已經(jīng)被 udev 取代了,收到信息之后,udev 會(huì)根據(jù) sysfs 的變化調(diào)用一些腳本來處理這個(gè)事件,這里的處理是指某個(gè)用戶空間的動(dòng)作,而不是加載驅(qū)動(dòng),加載驅(qū)動(dòng)是內(nèi)核自己的事情,在 udev 反應(yīng)過來之前就完成了.
2. 下面輪到我們著名的硬件抽象層(HAL)
HAL是Hardware Abstraction Layer的首字母縮寫。我最早是在Winnt 3.5的幫助中知道這個(gè)名詞的,對(duì)幫助文檔中的說法我比較認(rèn)同,所以一直對(duì)它抱有好感。不過Windows下的HAL和Linux下的HAL兩者所指并非相同之物:
Windows 下的HAL : 位于操作系統(tǒng)的最底層,直接操作物理硬件,隔離與硬件相關(guān)的信息,為上層的操作系統(tǒng)和設(shè)備驅(qū)動(dòng)程序提供一個(gè)統(tǒng)一的接口,起到對(duì)硬件的抽象作用。有了HAL,編寫驅(qū)動(dòng)程序就容易多了,因?yàn)镠AL的接口不但使用簡(jiǎn)單,而且具有更好的可移植性(沒用過)。
Linux 下的HAL :至于對(duì)硬件的抽象,Linux內(nèi)核早就有類似機(jī)制,只不過沒有專門的名稱罷了。而Linux的HAL指的并非這個(gè),它不是位于操作系統(tǒng)的最底層,直接操作硬件,相反,它位于操作系統(tǒng)和驅(qū)動(dòng)程序之上,是一個(gè)運(yùn)行在用戶空間中服務(wù)程序。
我們知道,Linux和所有的Unix一樣,習(xí)慣用文件來抽象設(shè)備,任何設(shè)備都是一個(gè)文件,比如/dev/mouse是鼠標(biāo)的設(shè)備文件。這種方法看起來不錯(cuò),每個(gè)設(shè)備都有統(tǒng)一的形式,但使用并不那么容易,設(shè)備文件名沒有什么規(guī)范,從簡(jiǎn)單的一個(gè)文件名,你無法得知它是什么設(shè)備,具有有什么特性。
結(jié)果形成這樣的尷尬:有了設(shè)備和設(shè)備驅(qū)動(dòng)程序,卻不知道如何使用它。這些亂七八糟的設(shè)備文件,讓設(shè)備的管理和應(yīng)用程序的開發(fā)都變得很麻煩,所以有必要提供一個(gè)硬件抽象層,來為上層應(yīng)用程序提供一個(gè)統(tǒng)一的接口,Linux的HAL就這樣應(yīng)運(yùn)而生了。
但HAL并不提供諸如拍照和刻錄等之類的功能,相反它只是告訴應(yīng)用程序,系統(tǒng)中有哪些設(shè)備可用,以及這些設(shè)備的類型、特性和能力等。主要說來,它提供以下幾項(xiàng)功能:
1.? ?? ?? ?獲取指定類型的設(shè)備列表。
2.? ?? ?? ?獲取/更改設(shè)備的屬性值。
3.? ?? ?? ?獲取設(shè)備具有的能力描述。
4.? ?? ?? ?設(shè)備插入/拔除時(shí),通知相關(guān)應(yīng)用程序。
5.? ?? ?? ?設(shè)備屬性或能力變化時(shí),通知相關(guān)應(yīng)用程序。
udev創(chuàng)建dev下的文件結(jié)點(diǎn),加載驅(qū)動(dòng)程序,讓設(shè)備處于可用狀態(tài)。而HAL則告訴應(yīng)用程序,現(xiàn)在有哪些設(shè)備可用,這些設(shè)備的類型、特性和能力,讓應(yīng)用程序知道如何使用它們。
設(shè)備的屬性管理是HAL最重要任務(wù)之一,有的設(shè)備屬性來源于實(shí)際的硬件,有的來源于設(shè)備信息文件(/usr/share/hal/fdi/),有的來源其它配置信息(如/usr/share/hwdata/)。設(shè)備屬性的都有標(biāo)準(zhǔn)的定義,這些屬性定義是HAL的SPEC的主要內(nèi)容之一,可以參考
http://people.freedesktop.org/~david/hal-spec/hal-spec.html
3.??udev & HAL
udev通過NetLink注冊(cè)內(nèi)核的設(shè)備事件,當(dāng)有設(shè)備插入/拔除時(shí),udev就會(huì)收到通知,它會(huì)從事件中所帶參數(shù)和sysfs中的信息,加載適當(dāng)?shù)尿?qū)動(dòng)程序,創(chuàng)建dev下的結(jié)點(diǎn),讓設(shè)備處于可用的狀態(tài)。
.? ?? ?? ?udev只是一個(gè)框架,它的行為完全受它的規(guī)則所控制,這些規(guī)則存放在目錄/etc/udev/rules.d/中,其中90-hal.rules是用來讓udev把設(shè)備插入/拔除的事件通過socket socket:/org/freedesktop/hal/udev_event轉(zhuǎn)發(fā)給HAL的。
.? ?? ?? ?HAL掛在socket:/org/freedesktop/hal/udev_event上等待事件,有事件發(fā)生時(shí)就調(diào)用函數(shù) hald_udev_data處理,它先從事件中取出主要參數(shù),創(chuàng)建一個(gè)hotplug_event對(duì)象,把它放入事件隊(duì)列中,然后調(diào)用 hotplug_event_process_queue處理事件。
.? ?? ?? ?函數(shù)hotplug_event_begin負(fù)責(zé)具體事件的處理,它把全部事件分為四類,并分別處理 hotplug_event_begin_sysfs處理普通設(shè)備事件,hotplug_event_begin_acpi處理ACPI事件,hotplug_event_begin_apm處理APM事件,hotplug_event_begin_pmu處理PMU事件。要注意的是,后三者的事件源并非源于udev,而是在device_reprobe時(shí)觸發(fā)的 (osspec_device_reprobe/hotplug_reprobe_tree /hotplug_reprobe_generate_add_events/acpi_generate_add_hotplug_event)。
.? ?? ?? ?函數(shù)hotplug_event_begin_sysfs中,如果是插入設(shè)備,則創(chuàng)建一個(gè)設(shè)備對(duì)象,設(shè)置設(shè)備的屬性,調(diào)用相關(guān)callouts,然后放入設(shè)備列表中,并觸發(fā)signal讓dbus通知相關(guān)應(yīng)用程序。如果是拔除設(shè)備,則調(diào)用相關(guān)callouts,然后從設(shè)備列表中刪除,并觸發(fā)signal 讓dbus通知相關(guān)應(yīng)用程序。
.? ?? ?? ?應(yīng)用程序可以主動(dòng)調(diào)用HAL提供的DBUS接口函數(shù),這些函數(shù)在libhal.h中有定義。應(yīng)用程序也可以注冊(cè)HAL的signal,當(dāng)設(shè)備變化時(shí),HAL通過DBUS上報(bào)事件給應(yīng)用程序。
.? ?? ?? ?callout是HAL一種擴(kuò)展方式,它在設(shè)備插入/拔除時(shí)執(zhí)行??梢栽谠O(shè)備信息文件中(/usr/share/hal目錄)指定。
.? ?? ?? ?addon也是HAL一種擴(kuò)展方式,它與callout的不同之處在于addon往往是事件的觸發(fā)者,而不是事件的消費(fèi)者。HAL的事件源主要源于 udev,而udev源于kernel的hotplug,然而有的設(shè)備如電源設(shè)備、磁盤設(shè)備和特殊按鍵等,它們并不產(chǎn)生hotplug事件。HAL就得不到通知,怎么辦呢,addon就是用于支持新事件源的擴(kuò)展方式。比如addon-acpi從/proc/acpi/event或者/var/run /acpid.socket收到事件,然后轉(zhuǎn)發(fā)成HAL事件。addon-storage檢測(cè)光盤或磁盤的狀態(tài),并設(shè)置設(shè)備的屬性。addon- keyboard檢測(cè)一些特殊按鍵,并觸發(fā)相應(yīng)事件。
access-check/ci-tracker/ck-tracker負(fù)責(zé)權(quán)限的檢查,里面提到的PolicyKit/ConsoleKit不是太熟悉,有時(shí)間再看看。
簡(jiǎn)單的說,HAL就是一個(gè)設(shè)備數(shù)據(jù)庫(kù),它管理當(dāng)前系統(tǒng)中所有的設(shè)備,你可以以多種靈活的方式去查詢這些設(shè)備,可以獲取指定設(shè)備的特性,可以注冊(cè)設(shè)備變化事件。
4. 那 hal 怎么發(fā)出通知呢? 這是利用一個(gè)新興的系統(tǒng)內(nèi)用戶空間消息總線系統(tǒng) -- dbus 來完成的,hal 會(huì)通過 dbus 上的一條消息總線把新加入的塊設(shè)備和相關(guān)的掛載提示信息,比如加載選項(xiàng) sync, iocharset 之類的信息發(fā)送到總線上來,只等待一個(gè)終結(jié)者來接受并處理這些信息了.
5. 這個(gè)終結(jié)者對(duì)于 gnome 來說就是 gnome-volume-manager (名字太長(zhǎng)了,下面簡(jiǎn)稱 gvm),它從 dbus 上探聽消息,當(dāng)發(fā)現(xiàn)有設(shè)備掛載提示的時(shí)候就會(huì)嘗試把設(shè)備掛載上來。缺省的,還會(huì)打開一個(gè) nautilus 瀏覽窗口來瀏覽新掛載上的分區(qū)的內(nèi)容。
嗯,最后一個(gè)問題就是怎么掛了,眾所周知,如果塊設(shè)備在 /etc/fstab 里沒有描述存在的話,掛載就比較麻煩:
- 本來如果有 fstab 中的 user 屬性的話,普通用戶可以掛載,但??現(xiàn)在沒有,普通用戶沒法掛
- 如果 sudo 授權(quán)的話,用戶可能獲得掛載其他分區(qū)的過大權(quán)限,危及 系統(tǒng)安全。
pmount 就是這個(gè)工具鏈上的最后一環(huán),它可以代表用戶 (運(yùn)行 gvm 的用戶) 來掛載一個(gè)屬于他的可移動(dòng)存儲(chǔ)設(shè)備,即使 fstab 里沒有這個(gè)設(shè)備存在,缺省的掛載位置是 /media/ 下,和 塊設(shè)備同名,比如 /dev/sda1 掛載到 /media/sda1/ 目錄。
嗯,綜上,設(shè)備的自動(dòng)掛載就完成了,呵呵,希望一大堆的關(guān)鍵詞沒把大家搞暈,回顧一下: kernel 發(fā)現(xiàn)設(shè)備變化反應(yīng)到 sysfs 上并通過 hotplug 機(jī)制通知udev, udev 把硬件相關(guān)內(nèi)容送給 hal,hal 過濾、處理之后發(fā)送信息到 dbus 上,在 dbus 上等候的 gvm 收到消息后用 pmount 把設(shè)備掛上,這樣,設(shè)備的自動(dòng)掛載就完成.
PS:HAL的相關(guān)文件:
首先是硬件信息文件fdi的路徑會(huì)有:
/usr/share/hal/fdi 通常是由系統(tǒng)程序安裝包提供的文件。
/etc/hal/fdi 這里是用戶或者管理員修改fdi的位置。
這兩個(gè)路徑下各自存在information policy preprobe等3個(gè)目錄,用來存放不同用途的fdi文件。后面再解釋。
其次是HAL的一些Callout和Addon,他們位于 /usr/lib/hal/scripts 及 /usr/lib/hal/ 下面
再有一些與HAL本身相關(guān)的配置文件等:
/etc/init.d/hal hal的啟動(dòng)腳本
/etc/udev/rules.d/95-hal.rules??HAL在UDEV中的規(guī)則
/etc/dbus-1/system.d/hal.conf??HAL的一些常用的Interface在DBUS中的權(quán)限設(shè)置。
相關(guān)程序
/usr/bin/lshal
/usr/bin/hal-device
/usr/bin/hal-get-property
/usr/bin/hal-set-property
/usr/bin/hal-find-by-capability
/usr/bin/hal-find-by-property
/usr/bin/hal-disable-polling
/usr/bin/hal-is-caller-locked-out
/usr/bin/hal-lock
/usr/sbin
/usr/sbin/hald
參考:http://blog.csdn.net/colorant/archive/2008/07/04/2611559.aspx
另外,關(guān)于HAL熱拔插的文檔:
http://wiki.archlinux.org/index.php/HAL_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
?
Contents
[hide ]- 1 介紹
- 1.1 關(guān)于熱插拔
- 1.2 關(guān)于卷掛載點(diǎn)
- 2 安裝和配置HAL
- 2.1 一、安裝
- 2.2 二、配置
- 2.2.1 權(quán)限策略
- 2.2.2 設(shè)備具體策略
- 2.2.2.1 NTFS寫權(quán)限
- 2.2.2.1.1 mount.ntfs鏈接
- 2.2.2.2 語言問題
- 2.2.2.3 對(duì)可移動(dòng)設(shè)備開啟noatime掛載選項(xiàng)
- 2.2.2.4 取消登錄時(shí)自動(dòng)掛載
- 2.2.2.1 NTFS寫權(quán)限
- 2.2.3 重啟或啟動(dòng)HAL
- 3 疑難解答
- 3.1 掛載失敗
- 3.1.1 IsCallerPrivileged failed
- 3.1.2 無法從Gnome掛在內(nèi)部驅(qū)動(dòng)器
- 3.1.3 權(quán)限被拒絕
- 3.1.3.1 仍然不行
- 3.1.3.2 其它修復(fù)方式
- 3.1.3.3 另一種修復(fù)方式
- 3.2 自動(dòng)掛載失敗
- 3.2.1 插入的CD/DVD不能被hal識(shí)別
- 3.3 USB閃盤/驅(qū)動(dòng)器沒有被正確地自動(dòng)掛載
- 3.4 移除U盤導(dǎo)致不正常卸載
- 3.1 掛載失敗
- 4 外部鏈接
<script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
介紹
硬件抽象層(Hardware Abstraction Layer,HAL)是一個(gè)守護(hù)進(jìn)程,它允許桌面應(yīng)用程序即時(shí)讀取硬件信息,這樣,無論接口或設(shè)備類型如何,應(yīng)用程序都能找到并使用它們。用這種方法,圖形界面以一種無縫、一致的模式為用戶提供所有的資源。
關(guān)于熱插拔
熱插拔會(huì)發(fā)生很多事情,HAL只是其中一部分。當(dāng)一個(gè)新設(shè)備被加入,例如插入一個(gè)U盤,會(huì)發(fā)生以下事情(粗略的):
- 內(nèi)核獲知此新設(shè)備并將其注冊(cè)到/sys .
- Udev 創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn)(如/dev/sdb1 ),然后加載必需的驅(qū)動(dòng)/模塊。
- HAL守護(hù)進(jìn)程接到D-Bus 的通知,將設(shè)備及其相關(guān)信息加入到數(shù)據(jù)庫(kù)。
- HAL通過D-Bus將新設(shè)備的加入這件事廣播給所有訂閱程序,如Thunar對(duì)此將在快捷邊欄上顯示圖標(biāo),或者M(jìn)etacity/Nautilus對(duì)此會(huì)在桌面添加一個(gè)圖標(biāo)。
- 可能還有其它監(jiān)聽程序,如卷管理器或者 AutoFS ,它被配置為自動(dòng)創(chuàng)建掛載點(diǎn)并掛載某些類型的驅(qū)動(dòng)器, 當(dāng)iPod插入時(shí)啟動(dòng)Rhythmbox ,等等。
HAL并不檢測(cè)硬件(內(nèi)核)、管理設(shè)備或驅(qū)動(dòng)(udev)或者自動(dòng)掛載驅(qū)動(dòng)器(卷管理器)。作為一個(gè)硬件抽象層(h ardware a bstraction l ayer),它的角色更象是一個(gè)通訊中心,為應(yīng)用程序提供簡(jiǎn)潔的設(shè)備接口。熱插拔設(shè)備無法正常檢測(cè)、使用或掛載等問題要仔細(xì)研究調(diào)查,要知道它涉及了方方面面。(參看'疑難排解')。
關(guān)于卷掛載點(diǎn)
HAL在/media/某文件夾 下掛載卷。 對(duì)于某文件夾 的命名,它使用卷的標(biāo)簽(label) ,如果卷沒有標(biāo)簽,它會(huì)使用卷的類型(type) (如果目錄已存在則尾隨數(shù)字),例如/media/disk ,、/media/disk-1 ...
要給分區(qū)命名一個(gè)標(biāo)簽,可以使用GParted (extra倉(cāng)庫(kù)中) ,或者KDE下的PartitionManager (AUR 中)。
同時(shí)請(qǐng)留意以下掛載設(shè)備時(shí)常見的三個(gè)問題:
- 目錄/media/label_of_your_volume 必須不 存在,它會(huì)由HAL自動(dòng)創(chuàng)建和銷毀。
- 設(shè)備必須沒有 寫在fstab中,否則HAL將拒絕加載它。
- 你必須有權(quán)加載設(shè)備,詳情參見 Permission Denied 。
?
如果由于某些原因你無法 給分區(qū)命名標(biāo)簽(label),可以設(shè)置個(gè)偽標(biāo)簽給HAL。你需要先準(zhǔn)備好以下兩項(xiàng):
- $device_uuid , 設(shè)備的uuid(ls -l /dev/disk/by-uuid/
- $fake_label , 你選擇的偽標(biāo)簽
將以下內(nèi)容寫入/etc/hal/fdi/policy/20-$device_name .fdi ,別忘了把$device_uuid 和$device_name 替換為真正的內(nèi)容。
File: /etc/hal/fdi/policy/20-$device_name.fdi <?xml version="1.0" encoding="UTF-8"?><deviceinfo version="0.2"><device><match key="volume.uuid" string="$device_uuid "><merge key="volume.label" type="string">$device_name </merge></match></device></deviceinfo>安裝和配置HAL
一、安裝
HAL要求守護(hù)進(jìn)程dbus的存在,因此我們需要把它們兩個(gè)都裝上:
# pacman -S dbus hal然后以root身份編輯/rc.conf 文件,把hal 添加到DAEMONS列,例如:
DAEMONS=(syslog-ng dbus halnetwork netfs ...)現(xiàn)在DBUS和HAL守護(hù)進(jìn)程就會(huì)在啟動(dòng)時(shí)加載了。由于如果dbus沒有運(yùn)行的話hal會(huì)自動(dòng)加載它,這會(huì)導(dǎo)致關(guān)機(jī)時(shí)無法卸載,因此為免麻煩,DAEMONS列表里dbus應(yīng)該排在hal前面。
注意:有些用戶報(bào)告說這樣設(shè)置會(huì)出問題。如果你發(fā)生問題的話,可以嘗試先加載hal 然后才dbus 。
或者你也可以手動(dòng)啟動(dòng)hal。以root身份輸入以下命令:
# /etc/rc.d/hal start為了讓dbus和hal正常地發(fā)揮作用,本地用戶必須是optical ,storage 組的成員。要實(shí)現(xiàn)這一點(diǎn),打開終端,以root身份輸入以下命令:
# gpasswd -a usernameoptical # gpasswd -a usernamestorage把“username“換成你的用戶名(比如johndoe)
你必須完全注銷并重新登錄,這些用戶組設(shè)置才會(huì)生效。
二、配置
權(quán)限策略
程序通過一個(gè)D-Bus接口同HAL進(jìn)行交流。在這里定義很多接口 ,每個(gè)相關(guān)含有不同方式:存儲(chǔ)設(shè)備接口,例如,有'彈出設(shè)備'和'關(guān)閉光驅(qū)'。 為了能夠'掛載'USB盤上的一個(gè)分區(qū),你必須獲取相關(guān)的D-bus接口(這個(gè)地方說的是'卷宗'volume )。
/etc/dbus-1/system.d/hal.conf這個(gè)配置文件包含了HAL-specific具體的特權(quán)。也就是哪些用戶有權(quán)力訪問哪些接口。/etc/dbus-1/system.conf這個(gè)文件內(nèi)容定義了用在D-bus接口上的例外的策略。簡(jiǎn)單來說,你需要查看你給用戶訪問DBUS/HAL接口的權(quán)力有哪些,因?yàn)镈-Bus默認(rèn)是不會(huì)給你任何全權(quán)限的。
默認(rèn)的hal.conf包含了一些允許和拒絕訪問的策略,amongst them this default (the later of two defaults and therefore seemingly the deciding one):
File: /etc/dbus-1/system.d/hal.conf <!-- Default policy for the exported interfaces --><policy context="default"><deny send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/><deny send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/><deny send_interface="org.freedesktop.Hal.Device.LaptopPanel"/><deny send_interface="org.freedesktop.Hal.Device.Volume"/><deny send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/></policy>簡(jiǎn)單的說,默認(rèn)設(shè)置是用戶被拒絕訪問如掛載或者卸載卷的接口。下面的策略就是來讓'power'和'storage'組用戶訪問特定設(shè)備的:
File: /etc/dbus-1/system.d/hal.conf <policy group="power"><allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/><allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/></policy><policy group="storage"><allow send_interface="org.freedesktop.Hal.Device.Volume"/><allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/></policy>這就是為什么你需要添加你的用戶到這些組的原因(見'初始設(shè)置'),這樣也可以減少自己設(shè)置配置文件的數(shù)量。
設(shè)備具體策略
NTFS寫權(quán)限
如果你想在掛載NTFS文件系統(tǒng)時(shí)獲得寫入支持,你必須安裝ntfs-3g 然后添加如下內(nèi)容到 /usr/share/hal/fdi/policy/10osvendor/20-ntfs-config-write-policy.fdi (不存在就新建)
<?xml version="1.0" encoding="UTF-8"?> <deviceinfo version="0.2"><device><match key="volume.fstype" string="ntfs"><match key="@block.storage_device:storage.hotpluggable" bool="true"><merge key="volume.fstype" type="string">ntfs-3g</merge><merge key="volume.policy.mount_filesystem" type="string">ntfs-3g</merge><append key="volume.mount.valid_options" type="strlist">locale=</append></match></match></device> </deviceinfo>注意:GNOME自2.20版起使用ntfs-3g掛載ntfs分區(qū),因此你不再需要添加這些了。
mount.ntfs鏈接
對(duì)hal>=0.5.10,上面的策略可能不起作用。這里有一個(gè)臨時(shí)的辦法可以強(qiáng)制hal使用ntfs-3g而不是標(biāo)準(zhǔn)的ntfs驅(qū)動(dòng)。請(qǐng)注意,這個(gè)辦法將會(huì)使你的系統(tǒng)中所有ntfs驅(qū)動(dòng)器都使用ntfs-3g的驅(qū)動(dòng)!作為root創(chuàng)建一個(gè)從mount.ntfs到ntfs-3g的軟鏈接:
# ln -s /sbin/mount.ntfs-3g /sbin/mount.ntfs這一做法可能引起的問題:
- 帶有“-i“參數(shù)的mount命令會(huì)失效
- 可能與內(nèi)核中的ntfs模塊發(fā)生沖突
語言問題
Note: 這個(gè)問題在ntfs-3g 2009.1.1和更新的版本里不會(huì)發(fā)生。如果你的文件名包含非拉丁字符的話可能會(huì)有問題。這是掛載程序沒有正確地解析這些策略和語言項(xiàng)。以下是解決方案:
- 移除軟鏈接: rm /sbin/mount.ntfs-3g
- 把它替換成包含如下內(nèi)容的bash腳本:
- 使它可執(zhí)行:chmod +x /sbin/mount.ntfs-3g
- 添加到 /etc/pacman.conf
對(duì)可移動(dòng)設(shè)備開啟noatime掛載選項(xiàng)
這可以加速文件操作,同時(shí)降低閃存設(shè)備如U盤、SD卡的損耗.
File: /etc/hal/fdi/policy/20-noatime-removable.fdi <device> <match key="block.is_volume" bool="true"><match key="@block.storage_device:storage.hotpluggable" bool="true"><merge key="volume.policy.mount_option.noatime" type="bool">true</merge></match><match key="@block.storage_device:storage.removable" bool="true"><merge key="volume.policy.mount_option.noatime" type="bool">true</merge></match></match> </device>取消登錄時(shí)自動(dòng)掛載
如果要登錄時(shí)取消自動(dòng)掛載ntfs或者其它文件系統(tǒng):
File: /etc/hal/fdi/policy/20-disable-automount.fdi <device><match key="storage.hotpluggable" bool="false"><match key="storage.removable" bool="false"><merge key="storage.automount_enabled_hint" type="bool">false</merge></match></match></device>重啟或啟動(dòng)HAL
要修改生效,需要重啟hal
# /etc/rc.d/hal restart疑難解答
Note: 所有修改需要用/etc/rc.d/hal restart 重啟HAL后才生效!掛載失敗
IsCallerPrivileged failed
如果你在沒有使用KDM或者GDM的情況下,出現(xiàn)"IsCallerPriviliged failed"提示消息,可以試一下用ck-launch-session (包含在consolekit 軟件包)來啟動(dòng)你的DE/WM。
例如對(duì)于startx/KDE,~/.xinitrc 中原來的是:
exec startkde那么新的寫法就是:
exec ck-launch-session startkde無法從Gnome掛在內(nèi)部驅(qū)動(dòng)器
如果你無法從Gnome掛在內(nèi)部驅(qū)動(dòng)器(在Nautilus中點(diǎn)擊它們),可以打開System -> Preferences下的Authorizations,然后查看org.freedesktop.hal.storage,選擇Mount file systems from internal drives,點(diǎn)擊Edit,然后將Active Console改為Yes。
權(quán)限被拒絕
注意: 解決此問題的另一種方法可見I won the struggle against hal and policykit 。它也有助于糾正掉電和系統(tǒng)關(guān)機(jī)的問題。
如果你是剛升級(jí)到的hal-0.5.11-7,突然出現(xiàn)用非root用戶掛載設(shè)備發(fā)生以下這些錯(cuò)誤導(dǎo)致失敗:
- "PermissionDeniedByPolicy mount-removable no"
- "PermissionDeniedByPolicy mount-removable-extra-options no"
- "org.freedesktop.hal.storage.mount-removable no <-- (action, result)"
- "org.freedesktop.hal.storage.mount-removable-extra-options no <-- (action, result)"
可以編輯/etc/PolicyKit/PolicyKit.conf 并粘帖以下內(nèi)容到<config>段以解決這些問題:
File: /etc/PolicyKit/PolicyKit.conf <match user="$user "> <!-- replace with your login or delete the line if you want to allow all users to manipulate devices (keep security issues in mind though) --><match action="org.freedesktop.hal.storage.*"><return result="yes"/></match><match action="hal-storage-mount-fixed-extra-options"><!-- for internal devices mounted with extra options like a wished mount point --><return result="yes" /></match><match action="hal-storage-mount-removable-extra-options"><!-- for external devices mounted with extra options like a wished mount point --><return result="yes" /></match> </match> <!-- don't forget to delete this line if you deleted the first one -->重啟dbus和hal。如果你使用KDE的話還要一同重啟KDE(否則設(shè)備通知器會(huì)出問題并停止響應(yīng))。作為這類問題的Hotfix這來自于 Gullible Jones的"So long, Arch" 一貼,也許它不是最佳的修復(fù)方案(特別是對(duì)于很多用戶的計(jì)算機(jī)),不過它的確能行得通。
Note: 請(qǐng)確認(rèn)你象<match user="myuser"> and NOT like <match user="$myuser"> 這樣輸入你的用戶名。仍然不行
如果以上方法仍然不行,可以嘗試以下“
<match user="yourusername"><return result="yes"/></match>注意: 這將允許一切!
其它修復(fù)方式
如果你從.xinitrc中啟動(dòng)窗口管理器,請(qǐng)看"IsCallerPrivileged failed"中的第2項(xiàng)。
?
另一種修復(fù)方式
File: /etc/PolicyKit/PolicyKit.conf <config version="0.1"><define_admin_auth user="USER"/> </config>其中USER是你的用戶名。
?
File: ~.xinitrc exec ck-launch-session window-manager這將給予用戶特定的管理員權(quán)限,它和hal和root用戶的hal管理權(quán)限一樣。
自動(dòng)掛載失敗
插入的CD/DVD不能被hal識(shí)別
如果插入的CD/DVD沒有被hal識(shí)別(桌面上沒有圖標(biāo)),檢查/etc/fstab ,移除可選驅(qū)動(dòng)器的相關(guān)行。
如果不行,這可能是因?yàn)槟愕脑O(shè)備沒有被HAl標(biāo)記為自動(dòng)掛載。我也不知道這是為什么,不過你可以編輯包含以下內(nèi)容的/etc/hal/fdi/information/media-check-disable-storage_model_$YOUR_DEVICE .fdi :
File: /etc/hal/fdi/information/media-check-disable-storage_model_$YOUR_DEVICE .fdi <deviceinfo version="0.2"><device><match key="info.udi" string="/org/freedesktop/Hal/devices/storage_model_DV$<merge key="storage.media_check_enabled" type="bool">false</merge></match></device></deviceinfo>如果key設(shè)為了false,那么你只需要把它改為true就行了。
USB閃盤/驅(qū)動(dòng)器沒有被正確地自動(dòng)掛載
這段內(nèi)容來自這個(gè)論壇 .
如果你在自動(dòng)掛載USB閃盤/驅(qū)動(dòng)器時(shí)遭遇了麻煩,自動(dòng)掛載CD、DVD卻毫無問題,而且如果你可以手動(dòng)掛載那些遇到麻煩的USB設(shè)備,那么你應(yīng)該在/etc/hal/fdi/policy中創(chuàng)建一個(gè)“preferences.fdi”文件,然后把下面這一行粘貼到文件中:
File: /etc/hal/fdi/policy/preferences.fdi <merge key="volume.ignore" type="bool">false</merge>而且,如果你安裝了gparted,可能還需要?jiǎng)h除這個(gè)文件/usr/share/hal/fdi/policy/gparted-disable-automount.fdi 。在[1] 這個(gè)帖子的末尾有人提到這一點(diǎn)。
同時(shí)你還得刪除/etc/fstab 行中相應(yīng)的usb設(shè)備,hal會(huì)自動(dòng)掛載它們。
移除U盤導(dǎo)致不正常卸載
如果你在沒有卸載前移除你的U盤,HAL的自動(dòng)卸載可能會(huì)工作不正常。
你會(huì)發(fā)現(xiàn)/media/.hal-mtab 中相應(yīng)的記錄沒有被刪除,并且nautilus的設(shè)備列表(還有GNOME的桌面)會(huì)保留了指向設(shè)備曾經(jīng)掛載過的空文件夾的鏈接。
這些都可以通過用延遲參數(shù)卸載U盤來解決。只要這么做:
1) 創(chuàng)建訪問權(quán)限755的可執(zhí)行腳本/usr/lib/hal/hal-unmount.sh ,內(nèi)容如下:
File: /usr/lib/hal/hal-unmount.sh #!/bin/sh # sanity check. DEVNAME should start with a / [ "$DEVNAME" != "${DEVNAME#/}" ] || exit 0# Lazily unmount drives which are removed, but still mounted if [ "$ACTION" = remove ] ; thenif [ -x /usr/bin/pumount ] ; then/usr/bin/pumount -l "$DEVNAME";else/bin/umount -l "$DEVNAME";fifiexit 02) 然后你得告訴HAL當(dāng)你移除你的U盤時(shí)運(yùn)行這個(gè)腳本。在/etc/udev/rules.d/90-hal.rules 中加入以下內(nèi)容:
File: /etc/udev/rules.d/90-hal.rules SUBSYSTEM=="block", ACTION=="remove", RUN+="/usr/lib/hal/hal-unmount.sh"3) 執(zhí)行重啟
# /etc/rc.d/hal restart外部鏈接
- HAL 0.5.10 specifications - 一個(gè)完整的HAL規(guī)范和指引。
- Dam's blog - An attempt to clarify the division of labor among the kernel, udev, D-Bus and HAL with links to HOWTOs and FAQs on each.
- Dynamic Device Handling (pdf) - 一份關(guān)于設(shè)備處理的文稿。
轉(zhuǎn)載于:https://www.cnblogs.com/fly-fish/archive/2011/10/18/2216265.html
總結(jié)
以上是生活随笔為你收集整理的U盘的热拔插/自动挂载跟linux2.6 kernel、 udev、 hal、 dbus 、gnome-mount 、thunar的关系...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google App Engine技术架
- 下一篇: 【转载】WINCE物理和虚拟地址的问题