TShopping

 找回密碼
 註冊
搜索
查看: 997|回復: 3

[分享] Mount命令掛載設備的實現原理

[複製鏈接]
發表於 2013-10-24 13:03:52 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
[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既是不再需要時候取消該掛載位置

 

臉書網友討論
發表於 2013-11-9 00:59:43 | 顯示全部樓層
不錯不錯.,..我喜歡

版主招募中

發表於 2013-11-9 00:59:43 | 顯示全部樓層
寫得好啊 估計有馬甲


您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-11 18:08 , Processed in 0.057991 second(s), 23 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表