[size=+0][size=+0]要了解linux下的mount命令是如何掛載設備的工作原理,首先我們要回答以下四個問題:[size=+0][size=+0]1.怎麼知道應該去掛載?[size=+0]2.掛載的幾種文件格式3.如何去掛載?[size=+0]4.掛載的位置如何確定?[size=+0][size=+0]弄明白了這四個問題,就能知道monut的實現原理及工作過程。[size=+0]下面我們來詳細分析下
[size=+0][size=+0]下載並獲得nautilsu源碼: [size=+0][size=+0][Lee@leedd.com ~]$ yumdownloader --source nautilus[size=+0][size=+0][size=+0]載入插件: refresh-packagekit[size=+0][size=+0]nautilus-2.24.2-5_nd5_8.src.rpm | 5.2 MB 00:00[size=+0][size=+0][size=+0][Lee@leedd.com ~]$ rpm -ivh nautilus-2.24.2-5_nd5_8.src.rpm[size=+0][size=+0][size=+0][Lee@leedd.com rpmbuild]$ rpmbuild -bp SPECS/nautilus.spec[size=+0][size=+0][size=+0][Lee@leedd.com rpmbuild]$cd BUILD[size=+0][size=+0][size=+0][Lee@leedd.com BUILD]$ pwd[size=+0][size=+0][size=+0]/home/Lee/rpmbuild/BUILD[size=+0][size=+0]在[size=+0][size=+0]nautilus-2.24.2/libnautilus-private/nautilus-autorun.c[size=+0][size=+0]中[size=+0][size=+0]定位[size=+0][size=+0]mount[size=+0][size=+0]實現相關的函數 [size=+0][size=+0]用函數[size=+0][size=+0]: should_autorun_mount (GMount *mount)[size=+0][size=+0]來實現自動掛載,其中[size=+0][size=+0]: [size=+0][size=+0]enclosing_volume = g_mount_get_volume (mount) ;[size=+0][size=+0][size=+0] //[size=+0][size=+0]用[size=+0][size=+0]g_mount_get_volume (mount)[size=+0][size=+0]來獲取需要[size=+0][size=+0]mount[size=+0][size=+0]的對象,返回[size=+0][size=+0]Gvolume[size=+0][size=+0]或[size=+0][size=+0]NULL [size=+0][size=+0]if (enclosing_volume != NULL)[size=+0][size=+0][size=+0] //[size=+0][size=+0]如果該介質(封閉的捲)非空,並且如下:[size=+0]if (g_object_get_data (G_OBJECT (enclosing_volume), "nautilus-allow-autorun") != NULL) { [size=+0][size=+0][size=+0][size=+0] //[size=+0][size=+0]獲取封閉數據卷的類型,非空[size=+0]ignore_autorun = FALSE; [size=+0]g_object_set_data (G_OBJECT (enclosing_volume), "nautilus-allow-autorun", NULL); [size=+0]} [size=+0]} [size=+0]if (ignore_autorun) { [size=+0]if (enclosing_volume != NULL) { [size=+0]g_object_unref ( enclosing_volume); [size=+0][size=+0][size=+0][size=+0] [size=+0][size=+0][size=+0][size=+0][size=+0][size=+0] //,[size=+0][size=+0]對封閉的捲[size=+0][size=+0](enlosing_volume)[size=+0][size=+0]進行引用計數並排列位置[size=+0]} [size=+0]return FALSE; [size=+0]} [size=+0][size=+0][size=+0] [size=+0][size=+0]通過上面的簡單分析,我們可以知道mount工作原理及流程,並回答上面四個問題 [size=+0][size=+0]1.怎麼知道應該去掛載?[size=+0][size=+0]—————-g_mount_get_volume (mount)函數獲取需要mount的對象來實現(返回值為Gvolume或NULL) [size=+0]2. [size=+0]掛載的幾種文件格式[size=+0] g_object_get_data (G_OBJECT (enclosing_volume), “nautilus-allow-autorun”)獲取nautilus-allow-autorun的數據文件類型 [size=+0][size=+0]可以掛載的[size=+0][size=+0]文件類型[size=+0][size=+0]: iso9660 ext ext2 ext3 fat fhs hpfs jfs ntfs ufs vfat等等—-通過man mount獲得 [size=+0][size=+0]3.如何去掛載[size=+0][size=+0]?[size=+0][size=+0]用什麼掛載:[size=+0][size=+0]用函數: should_autorun_mount (GMount *mount)來判斷實現自動掛載 [size=+0][size=+0]具體參考本文上方函數解釋 [size=+0][size=+0]4.掛載的位置如何確定:[size=+0][size=+0]用g_object_unref(enclosing_volume)來對封閉的捲(enlosing_volume)進行引用計數,當g_object_unref()值為unreffed既是不再需要時候取消該掛載位置 |