一種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法
【專利摘要】本發(fā)明涉及安卓系統(tǒng)上存儲設備掛載方法,尤其是一種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法。步驟一,插拔外部存儲設備時,內核發(fā)出包含所有節(jié)點信息的事件;步驟二,判斷本地存儲守護進程監(jiān)測到內核事件,事件中的節(jié)點信息是否包含在安卓的已知列表里;若是,則上層掛載服務:更新磁盤狀態(tài),創(chuàng)建一個線程通知本地存儲守護進程執(zhí)行具體的掛載命令,僅掛載一個分區(qū);若否,則本地存儲守護進行,添加到可處理列表里,通知上層掛載服務,上層掛載服務:接收到通知,將節(jié)點信息添加到支持列表,并將該節(jié)點掛載;步驟三,掛載完成。本發(fā)明可以把每一個分區(qū)都成功掛載供用戶使用,避免了磁盤空間的浪費。
【專利說明】—種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法
【技術領域】
[0001]本發(fā)明涉及安卓系統(tǒng)上存儲設備掛載方法,尤其是一種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法。
【背景技術】
[0002]安卓默認方案只能識別多分區(qū)存儲設備的第一個邏輯分區(qū),剩下的分區(qū)都是無法識別的。這樣就會造成磁盤空間的浪費。例如,有一些存儲設備因為存儲空間很大,需要分區(qū)管理,例如移動硬盤,用戶把它插到安卓設備上,卻無法識別,就造成了磁盤空間的浪費。而用戶期望的是更全面的文件管理。
[0003]如圖1所示,在安卓系統(tǒng)上,熱插拔存儲設備的管理分為這幾個部分,kernel (內核)、vold (存儲類的守護進程)、frameworks (應用接口層):
Ukernel:在內核中,主要體現在驅動拋出相應的uevent (含有存儲設備信息的事件)供本地存儲守護進程分析處理。當一個存儲設備插入到系統(tǒng)中或從系統(tǒng)中移除時,kernel中相應的驅動會第一時間識別,將存儲設備信息諸如分區(qū)數量、存儲設備容量等這些信息通過uevent的方式發(fā)送出去。發(fā)送的uevent個數和類型也是和存儲設備屬性有關系的,一般的存儲設備就只有一個分區(qū),所以一般情況下會陸續(xù)發(fā)送2個uevent:1個存儲設備類型的uevent,(即“disk”類型的uevent)包含分區(qū)個數等信息,I個分區(qū)類型的uevent,(即“partit1n”類型的uevent)包含了該分區(qū)詳細信息;如果有多個分區(qū),那么會是先發(fā)送I個” disk”的uevent,然后陸續(xù)發(fā)送逐個分區(qū)的uevent ;如果O個分區(qū),那么只會發(fā)送I個“disk”的uevent。而存儲設備移除的發(fā)送順序是相反的,先依次發(fā)送“partit1n”的 uevent,最后發(fā)送“disk” 的 uevent。
[0004]2、void:存儲類的守護進程,作為安卓的一個本地服務,接收內核的消息,負責處理諸如SD、USB等存儲類設備的插拔等事件。
[0005]3、frameworks:這一層提供了一些接口如掛載卸載等可以讓用戶根據自己的需求去主動管理相應的存儲設備。主要是掛載服務MountService。
[0006]當一個存儲設備插入到系統(tǒng)中或從系統(tǒng)中移除時,kernel中相應的驅動會第一時間識別,將存儲設備信息諸如分區(qū)數量、設備容量等這些信息通過uevent的方式發(fā)送出去。
[0007]void這個守護進程會處理內核發(fā)出來的存儲設備相關的uevent,但是只會處理fstab文件中所寫的存儲區(qū)塊,就是說在fstab里面配置了幾個存儲設備,那么void就只支持幾個相應存儲設備的掛載。存儲設備如果有多個分區(qū),這些分區(qū)信息顯然不在fstab列表里,所以安卓默認策略無法支持多分區(qū)存儲設備。圖2是現有技術的安卓默認的處理流程,按此流程只能掛載存儲設備的一個分區(qū)。
[0008]名詞解釋:fstab文件:存放了安卓系統(tǒng)支持的存儲設備列表的一個配置文件。
【發(fā)明內容】
[0009]本發(fā)明的目的是,在有一些存儲設備因為存儲空間很大,需要分區(qū)管理,可以把每一個分區(qū)都成功掛載供用戶使用,避免了磁盤空間的浪費。
[0010]本發(fā)明的具體技術方案是:一種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法,包括如下步驟:
步驟一,插拔外部存儲設備時,內核發(fā)出包含所有節(jié)點信息的事件;
步驟二,判斷本地存儲守護進程監(jiān)測到內核事件,事件中的節(jié)點信息是否包含在安卓的已知列表里;若是,則上層掛載服務:更新磁盤狀態(tài),創(chuàng)建一個線程通知本地存儲守護進程執(zhí)行具體的掛載命令,僅掛載一個分區(qū);若否,則本地存儲守護進行,添加到可處理列表里,通知上層掛載服務,上層掛載服務:接收到通知,將節(jié)點信息添加到支持列表,并將該節(jié)點掛載;
步驟三,掛載完成。
[0011]有益效果
1.打破配置文件對存儲設備數量及分區(qū)的限制
既然要支持多分區(qū)掛載,就不能遵循安卓默認的機制,必須打破配置文件對存儲設備數量及分區(qū)的限制,void中必須要對fstab文件規(guī)定外的uevent進行處理,根據uevent中包含的各分區(qū)的信息將這些分區(qū)掛載到文件系統(tǒng)合適的目錄。void中有個列表mVolumes是存儲fstab中的存儲設備列表信息的,在android默認系統(tǒng)上這個列表是固定的;要支持多分區(qū)掛載,就要在存儲設備插入時動態(tài)添加存儲設備節(jié)點列表到這個mVolumes中,再通知上層掛載服務將此節(jié)點也添加到它所支持的存儲設備列表里,最后再進行mount掛載操作。
[0012]2.掛載點的創(chuàng)建與刪除
當外部存儲設備插入時,我們需要把該存儲設備的文件系統(tǒng)掛載到合適的目錄。由于安卓系統(tǒng)中的/mnt目錄在系統(tǒng)起來時就被掛載為只讀的了,系統(tǒng)正常啟動之后是沒有權限在/mnt目錄下創(chuàng)建新的掛載點。為了解決這個問題,在系統(tǒng)啟動時創(chuàng)建/mnt/storage目錄,并將其掛載成虛擬內存文件系統(tǒng)(tmpfs)格式,后續(xù)的外部存儲設備的節(jié)點都掛載到/mnt/storage 目錄下。
[0013]如今可移動存儲設備越來越大,一些用戶為了方便文件管理會對存儲設備進行分區(qū)。本發(fā)明支持安卓設備上的多分區(qū)存儲設備的掛載,方便了用戶在安卓設備上管理自己存儲設備上的文件。
【專利附圖】
【附圖說明】
[0014]圖1為安卓掛載存儲設備的整體流程涉及的框架模塊。
[0015]圖2為現有技術的安卓默認的存儲設備掛載流程。
[0016]圖3為本發(fā)明安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法。
【具體實施方式】
[0017]為使本發(fā)明實施過程、技術方案和技術效果更加清楚,下面將結合附圖,對本發(fā)明的技術方案進行清楚、完整地描述。
[0018]圖3本發(fā)明安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法?;诎沧肯到y(tǒng)本發(fā)明的實施方法如下:
存儲守護進程中void中,由于安卓默認讀取fstab存儲設備列表后,對不在此列表中的存儲設備不予處理,因此需要在接收到uevent后對這些事件進行處理。
[0019]在安卓源碼的system/vo I d/Vo IumeManager.cpp 中。
[0020]在VolumeManger接收事件處理函數中添加對這些事件的處理,具體添加代碼位置在 VolumeManager 的 handleBlockEvent 函數中,
VolumeManager::handleBlockEvent(evt) {
for (it=mVolumes->begin();it!=mVolumes->end();++it) {
hit = true ;
break ;
}
if (!hit) {//不在mVolume列表中存儲設備節(jié)點信息,
…//后續(xù)處理,創(chuàng)建新的節(jié)點
}
mVolume列表就是從fstab配置文件中讀取的存儲設備列表。當此函數處理一個插拔事件時,如果hit為false,就證明沒有處理該事件,要支持多分區(qū)存儲設備掛載。需要根據事件中的信息創(chuàng)建一個節(jié)點加入到mVolume列表里。有多少個分區(qū),就要加入多少個節(jié)點。更具體的是根據分區(qū)創(chuàng)建DirectVolume對象。
[0021 ] 此時上層掛載服務MountService對于該存儲設備依然是未知的,由于MountService 在初始化的時候會讀取 stotage_list.xml (源碼 frameworks/base/core/res/res/xml/storage_list.xml),這個與 fstab 文件的功能類似,規(guī)定了 MountService 支持的外部存儲設備。所以我們在void中創(chuàng)建節(jié)點添加到mVolume列表時,就需要發(fā)送消息給MountService,并將掛載點等信息傳送過去,MountService在onEvent函數中接收到消息后,將此掛載點加入到MountService中的可管理的列表中,然后發(fā)送命令通知void進行具體掛載操作。
[0022]進行具體的掛載操作時就要規(guī)定好我們的掛載點的命名規(guī)則。由于安卓系統(tǒng)中的/mnt目錄在系統(tǒng)起來時就被掛載為只讀的了,系統(tǒng)正常啟動之后是沒有權限在/mnt目錄下創(chuàng)建新的掛載點。為了解決這個問題,在系統(tǒng)啟動時創(chuàng)建/mnt/storage目錄,并將其掛載成虛擬內存文件系統(tǒng)(tmpfs)格式,
命令:mount tmpfs tmpfs /mnt/storage
mode=0775, uid=1000, gid=1000, size=10M, user 和 group 都設為 system,限制不超過1M的空間,因為只創(chuàng)建目錄,所以用不了多少。后續(xù)外部存儲設備的掛載點就創(chuàng)建在此目錄下。具體的分區(qū)目錄名稱為/mnt/storage/extsdXpY:“extsd”代表T卡,如果是U盤,則用“udisk”代替;“X”代表第幾個T卡或U盤,默認從O開始;“Y”代表第幾個分區(qū),默認也是從O開始。例如插入了一個帶有3個分區(qū)的SD卡,則這三個分區(qū)的目錄分別為/mnt/storage/extsdOpO、/mnt/storage/extsdOpl、/mnt/storage/extsd0p2o 根據這些參數,void就可以進行掛載操作了。
[0023]void執(zhí)行具體的掛載操作是調用Iinux的mount函數進行掛載的,例如:mount ( “/dev/block/vold/xyz”,,,/mnt/storage/extsdXpY”,“vfat”,0,0)。
[0024]掛載完成后設置一下該節(jié)點的狀態(tài)(如MEDIA_REM0VED、MEDIA_M0UNTED、MEDIA_UNM0UNTE等)。void和MountService對所有分區(qū)的節(jié)點消息都處理完后,該安卓設備就可以支持多分區(qū)存儲設備了。
[0025]本發(fā)明方法可把多分區(qū)存儲設備插入到平板電腦上,可通過文件管理器方便的管理多分區(qū)存儲設備。
[0026]以上是對本發(fā)明的優(yōu)選實施例進行的詳細描述,但本領域的普通技術人員應該意識到,在本發(fā)明的范圍內和精神指導下,各種改進、添加和替換都是可能的,例如調整接口調用順序、使用不同的編程語言(如C、C++、Java等)實現等。這些都在本發(fā)明的權利要求所限定的保護范圍內。
【權利要求】
1.一種安卓系統(tǒng)上掛載多分區(qū)存儲設備的方法,包括如下步驟: 步驟一,插拔外部存儲設備時,內核發(fā)出包含所有節(jié)點信息的事件; 步驟二,判斷本地存儲守護進程監(jiān)測到內核事件,事件中的節(jié)點信息是否包含在安卓的已知列表里;若是,則上層掛載服務:更新磁盤狀態(tài),創(chuàng)建一個線程通知本地存儲守護進程執(zhí)行具體的掛載命令,僅掛載一個分區(qū);若否,則本地存儲守護進行,添加到可處理列表里,通知上層掛載服務,上層掛載服務:接收到通知,將節(jié)點信息添加到支持列表,并將該節(jié)點掛載; 步驟三,掛載完成。
【文檔編號】G06F17/30GK104391657SQ201410677928
【公開日】2015年3月4日 申請日期:2014年11月24日 優(yōu)先權日:2014年11月24日
【發(fā)明者】葛晶波, 劉棨, 包喬晉, 王海波 申請人:上海盈方微電子有限公司