【usb儲存掛載】android6.0固定usb儲存掛載路徑
在除錯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
相關文章
- iscsi 掛載網路儲存及儲存訪問
- Oracle 共享儲存掛載Oracle
- 掛載大容量儲存
- linux 之USB掛載Linux
- 物件儲存服務OBS obsfs掛載物件
- linux掛載網路儲存mount有問題Linux
- Linux 掛載2T以上儲存Linux
- Linux下掛載USB盤Linux
- Linux 上如何禁用 USB 儲存Linux
- win10怎麼禁止usb儲存_win10系統如何禁用usb儲存裝置Win10
- win10禁用所有usb儲存裝置方法 win10如何禁止使用usb儲存裝置Win10
- win10 禁用usb儲存方法 win10 如何禁用usbWin10
- 記一次centos掛載ceph儲存的坑CentOS
- 記一次雲主機如何掛載物件儲存物件
- HP儲存掛載後,linux系統無法fdiskLinux
- 疑似slax掛載usb的解決方法(轉)
- USB儲存裝置無法識別的原因
- Redhat下掛載大小超過2T儲存的方法Redhat
- CentOS 6.6掛載大於2TB以上的iSCSI儲存CentOS
- mysql程式碼閱讀-外掛載入及儲存引擎接入MySql儲存引擎
- debian掛載光碟機、軟碟機、usb(轉)
- Redhat 5.3掛載IBM DS4800儲存並安裝RDAC多路徑軟體RedhatIBM
- windows10系統如何關閉USB儲存裝置Windows
- Linux中輕鬆使用USB移動儲存器(轉)Linux
- MySQL修改預設儲存路徑MySql
- PostgreSQLSQLOUTLINE外掛sr_plan(儲存、篡改、固定執行計劃)SQL
- 華為儲存多路徑
- 儲存-配置多路徑
- Props 混入 外掛 插槽 本地儲存
- Typecho COS外掛實現網站靜態資源儲存到COS,降低本地儲存負載網站負載
- spacy儲存和載入模型模型
- AIX作業系統掛載iSCSI磁碟裝置,並建立為共享儲存AI作業系統
- oracle 修改表空間儲存路徑Oracle
- Windows 11 可以透過組策略來禁止使用USB儲存裝置。Windows
- Docker容器中資料兩種持久化儲存方式:卷和掛載宿主目錄Docker持久化
- 關於儲存控制器的多路徑機制(轉載)
- 儲存載入模型model.save()模型
- store下載檔案儲存位置