【usb儲存掛載】android6.0固定usb儲存掛載路徑

yingxian_Fei發表於2017-12-19

在除錯android裝置時遇上裝置有多個usb介面的情況,此時在usb上接入多個U盤,發現先接入的U盤和後接入的U盤掛載點與接入順序有關係。比如對於掛載節點/mnt/storage1,存在誰先插入誰就縣掛載的問題,這對於應用來說並不友好,因為應用可能希望將資料都儲存到一個固定的usb介面上接入的裝置中,此時可以使用本文中提供的修改方式,主要是修改fstab和android的init.rc實現。

1、檢視接入點資訊

我們需要先知道每個usb節點對應fstab中的記錄,這個很好獲得,第一個是插入儲存裝置時通過核心的列印得知,還有一種方式是通過插入u盤裝置時vold的掛載列印資訊獲取,但是日誌都有可能沒有開啟,所以這裡需要按照實際情況檢視。如本文中使用如下命令檢視vold中相關列印:

logcat -c;logcat -v time -s VoldConnector

此時接入U盤,可以看到列印的日誌中有如下資訊:

1-01 08:18:31.411 D/VoldConnector( 6505): RCV <- {640 disk:8:0 [  441.323363] sd 3:0:0:0: [sda] Attached SCSI removable disk
8}
01-01 08:18:31.412 D/VoldConnector( 6505): RCV <- {641 disk:8:0 30752000000}
01-01 08:18:31.413 D/VoldConnector( 6505): RCV <- {642 disk:8:0 SanDisk 
01-01 08:18:31.413 D/VoldConnector( 6505): }
01-01 08:18:31.413 D/VoldConnector( 6505): RCV <- {644 disk:8:0 /sys//devices/soc.0/1c1c000.ehci2-controller/usb2/2-1/2-1:1.0/host3/target3:0:0/3:0:0:0/block/sda}
01-01 08:18:31.459 D/VoldConnector( 6505): RCV <- {650 public:8:4 0 "disk:8:0" ""}
01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {651 public:8:4 0}
01-01 08:18:31.460 D/VoldConnector( 6505): SND -> {34 volume mount public:8:4 2 0}
01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {643 disk:8:0}
01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {651 public:8:4 1}
01-01 08:18:31.525 D/VoldConnector( 6505): RCV <- {652 public:8:4 vfat}
01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {653 public:8:4 usbhost2}
01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {654 public:8:4 KRMSVOL_CN_}
01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {656 public:8:4 /mnt/media_rw/usbhost2}
01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {655 public:8:4 /storage/usbhost2}
[  442.689739] FAT-fs (sda4): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
01-01 08:18:32.855 D/VoldConnector( 6505): RCV <- {651 public:8:4 2}
01-01 08:18:32.856 D/VoldConnector( 6505): RCV <- {200 34 Command succeeded}
01-01 08:18:32.856 E/VoldConnector( 6505): NDC Command {34 volume mount public:8:4 2 0} took too long (1397ms)
其中/devices/soc.0/1c1c000.ehci2-controller/為該U盤對應到裝置中的節點資料,這部分說的有點模糊,表達能力不好,具體也就是每個usb裝置接入後核心中會生成儲存相關資訊的節點,而這個和接入的usb埠是有關係的,所以我們需要得到這個資訊,後面用這個資訊直接掛到對應的掛載節點上。

2、fstab中指定掛載名

修改fstab,修改上面裝置節點對應的掛載點的label標籤,標籤主要包含在fstab的掛載flag中,voldmanaged後,這個欄位的說明在android原始碼fs_mgr.c中進行解析,解析是會獲取其等號後面的值並以冒號隔開,其中冒號隔開的第一個部分為掛載的label標籤,第二個為序號,具體我也不清楚什麼意思,不知道是不是為了滿足一個接入的儲存裝置保護多個分割槽而準備的,這裡我們使用預設的auto,我們為我們的每個usb接入點分配不同的label,這樣就能保證每個usb對應的掛載點都是唯一的。我修改後的fstab如下:

# Android fstab file.
#<src>                                         <mnt_point>  <type>  <mnt_flags and options>  <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK


/dev/block/by-name/system               /system             ext4    ro,barrier=1                                                            				       wait,verify
/dev/block/by-name/cache                /cache              ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable
/dev/block/by-name/mediadata            /mediadata          ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable
/dev/block/by-name/alog                 /logger             ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=continue   wait,check,formattable
/dev/block/by-name/data                 /data               ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable
/dev/block/by-name/UDISK                /udisk               ext4    defaults   wait,check,formattable
/devices/soc.0/1c11000.sdmmc/mmc_host/mmc*  	auto                vfat    defaults                                                                wait,check,voldmanaged=sdcard:auto
/devices/soc.0/1c0f000.sdmmc/mmc_host/mmc*  	auto                vfat    defaults                                                                wait,check,voldmanaged=extsd:auto
/devices/soc.0/1c12000.sdmmc/mmc_host/mmc*  	auto                vfat    defaults                                                                wait,check,voldmanaged=extsd2:auto
/devices/soc.0/1c10000.sdmmc/mmc_host/mmc*  	auto               vfat    defaults                                                                wait,check,voldmanaged=extsd3:auto
/devices/soc.0/1c13000.udc-controller	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost:auto
/devices/soc.0/1c14000.ehci0-controller/usb*    auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost1:auto
/devices/soc.0/1c14000.ohci0-controller/usb*	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost1:auto
/devices/soc.0/1c1c000.ehci2-controller/usb*	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost2:auto
/devices/soc.0/1c1c000.ohci2-controller/usb*	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost2:auto
/devices/soc.0/1c19000.ehci1-controller/usb*	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost3:auto
/devices/soc.0/1c19000.ohci1-controller/usb*	auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost3:auto
/dev/block/zram0                             none           swap    defaults                                                                zramsize=134217728

3、修改init.rc

這部分也可以不修改,只不過有時候fstab掛載的路徑很長,這個時候可以在init.rc中建立一個軟連線到fstab掛載的目錄上,然後應用直接使用init.rc中建立的軟連線來操作儲存裝置。如我建立了一個/mnt/usbhost的掛載目錄用來儲存所有的usb儲存裝置的軟連線,之後建立了三個軟連線到具體掛載的目錄上:

	mkdir   /mnt/usbhost 0777 system system
	symlink /storage/usbhost1 /mnt/usbhost/Storage01
	symlink /storage/usbhost2 /mnt/usbhost/Storage02
	symlink /storage/usbhost3 /mnt/usbhost/Storage03	


相關文章