android裝置通過USB線纜,使用兩種模式與電腦串連:PTP和MTP
PTP模式,android裝置被看作一個數位相機,這個功能已經能夠在ubuntu 12.04上正常工作。但是僅僅能夠訪問裝置上的DCIM和picture檔案夾
MTP模式,是把android的裝置視作一個多媒體裝置來進行訪問,所以能夠訪問使用者空間的所有檔案系統,但是這種模式在ubuntu 12.04下面還不支援,需要一些步驟的配置才能正常工作。
下面的教程以nexus 7為例子來配置,使你的電腦(ubuntu12.04)能夠通過usb口將nexus 7作為大量儲存裝置來進行訪問,而且將會自動掛載和移除裝置。
1.安裝mtp fuse(使用者空間檔案系統(Filesystem
in Userspace,簡稱FUSE))
1.1選擇fuse擴充
很多的fuse擴充都可以用來在你的ubuntu系統上掛載mtp裝置:
原始的 mtpfs
project 是建立在libmtp庫上的
jmtpfs,是mtpfs的重寫
go-mtpfs,一種新的有一些限制的mtp
我選擇go-mtpfs的原因:
1.比其他的都要穩定
2.串連和改變目錄非常塊
3.檔案傳輸速度很快
4.檔案傳輸使用的臨時空間很小
5.能夠直接變更檔的名字
但是也有一些限制:
1.不能傳輸大於2G的檔案
2.檔案的時間戳記不能儲存
3.不能使用其他賬戶掛載的檔案系統
1.2 配置fuse
1.更改/etc/fuse.conf 這個檔案的屬性 :# sudo chmod a+r /etc/fuse.conf
2.修改檔案內容:把“user_allow_other”這一行的注釋取消掉
這樣做的目的是,能夠允許這台電腦上的其他使用者掛載檔案系統
1.3配置安裝go-mtofs
go-mtpfs使用google的go語言編譯器,git倉庫在:https://github.com/hanwen/go-mtpfs/.
將代碼取到本地,然後先安裝go的編譯器:
sudo apt-get install golang-go
安裝libmtp的標頭檔
sudo apt-get install libmtp-dev
然後在go-mtpfs的原始碼目錄運行:sudo go install產生go-mtpfs二進位檔案,將go-mtpfs拷貝到/usr/loacal/sbin/go-mtpfs就完成了安裝
還可以直接下載go-mtpfs的二進位檔案,http://hanwen.home.xs4all.nl/public/software/go-mtpfs/
1.4建立掛載點
# sudo mkdir /media/Nexus7
# sudo chmod 777 /media/Nexus7
2.建立udev規則
2.1檢測VENDOR_ID和PRODUCT_ID
如果想要在任意模式下都能擷取訪問Nexus 7的許可權,就需要聲明所有這些模式下的udev規則
有以下幾個模式:
- Recovery mode
- Fastboot mode
- PTP mode (with USB debug on or off)
- MTP mode (with USB debug on or off)
在每個模式下,使用lsusb命令,查看nexus7的Vendor_ID和Product_ID:
#lsusb
Recovery mode(電源+音量上):Bus 002 Device 022: ID 18d1:d001 Google Inc.(選擇adb模式下)
Fastboot mode:Bus 002 Device 021: ID 18d1:4e40 Google Inc.
PTP mode(with USB deug on):Bus 002 Device 024: ID 18d1:4e44 Google Inc.
PTP mode(with USB deug off):Bus 002 Device 025: ID 18d1:4e43 Google Inc.
MTP mode(with USB deug on):Bus 002 Device 027: ID 18d1:4e42 Google Inc.
MTP mode(with USB deug off):Bus 002 Device 028: ID 18d1:4e41 Google Inc.
以上這些,藍色標識的就是Vendor_ID,紅色表示的就是Product_ID,要將這些規則寫入/etc/udev/rules.d/51-android.rules 這個檔案中(見最後)。51-android.rules這個檔案,在我們安裝adb驅動的時候曾經建立過,為什麼這個檔案叫這個名字?
因為udev是linux下面的裝置管理員,支援隨插即用,它允許指定一系列的響應規則,在它偵測到新裝置加入的時候,執行他們。
udev要求這些規則儲存在/etc/udev/rules.d/50-udev.rules中。udev按照字元排序依次解釋這些檔案中的規則,如果你希望自己添加的規則在預設規則之後處理,那麼檔案名稱必須大於50,比如51
2.2 檢測MODEL和MODEL_ID
這個步驟是用來檢測nexus 7的插入和拔出,即當你的nexus7使用mtp模式與電腦串連時,自動掛載mtp的檔案系統,當你拔出,自動卸載檔案系統。
這些udev規則需要建立在裝置的MODEL和MODEL_ID能夠正常工作。
檢測model和model_id的步驟如下:
1.運行udev的監視命令:udevadm monitor --environment --udev
2.用你的nexus7的mtp模式串連電腦
3.等待數秒
4.拔出
gexueyuan@gexueyuan:~$ udevadm monitor --environment --udev
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
UDEV [23855.884828] add /devices/pci0000:00/0000:00:1d.7/usb2/2-4 (usb)
ACTION=add
BUSNUM=002
DEVLINKS=/dev/libmtp-2-4
DEVNAME=/dev/bus/usb/002/030
DEVNUM=030
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-4
DEVTYPE=usb_device
ID_BUS=usb
ID_MEDIA_PLAYER=1
ID_MODEL=Nexus_7
ID_MODEL_ENC=Nexus\x207
ID_MODEL_ID=4e41
ID_MTP_DEVICE=1
ID_REVISION=9999
ID_SERIAL=asus_Nexus_7_015d15b4fe2c0200
ID_SERIAL_SHORT=015d15b4fe2c0200
ID_USB_INTERFACES=:ffff00:
ID_VENDOR=asus
ID_VENDOR_ENC=asus
ID_VENDOR_ID=18d1
MAJOR=189
MINOR=157
PRODUCT=18d1/4e41/9999
………………
UDEV [23993.092275] remove /devices/pci0000:00/0000:00:1d.7/usb2/2-4 (usb)
ACTION=remove
BUSNUM=002
DEVLINKS=/dev/libmtp-2-4
DEVNAME=/dev/bus/usb/002/030
DEVNUM=030
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-4
DEVTYPE=usb_device
ID_BUS=usb
ID_MEDIA_PLAYER=1
ID_MODEL=Nexus_7
ID_MODEL_ENC=Nexus\x207
ID_MODEL_ID=4e41
ID_MTP_DEVICE=1
ID_REVISION=9999
ID_SERIAL=asus_Nexus_7_015d15b4fe2c0200
………………
現在我們得到了我們想要的資料,其實ID_MODEL在不一樣的android版本是不一樣的
在Jelly Bean4.1.2是Nexus
在Jelly Bean4.2+的版本是Nexus_7
在不同的模式下運行還將得到不同的ID_MODEL_ID,這和之前是對應的,mtp模式下,如果usb debug關掉就是4e41,反之是4e42。
現在我們來寫51-android.rules 這個檔案:
# Bootloader/fastboot nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0666", OWNER="<gexueyuan>"
#Recovery nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0666", OWNER="<gexueyuan>"
# MTP mode with USB debug off nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e41", MODE="0666", OWNER="<gexueyuan>"
# MTP mode with USB debug on nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0666", OWNER="<gexueyuan>"
# PTP media with USB debug off nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e43", MODE="0666", OWNER="<gexueyuan>"
PTP media with USB debug on nexus 7
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e44", MODE="0666", OWNER="<gexueyuan>"
# Google Nexus 7 MTP mode : automatic mount when plugged (all android versions)
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e41", ACTION=="add", RUN+="/usr/bin/sudo -b -u gexueyuan /usr/local/sbin/go-mtpfs -allow-other=true /media/Nexus7"
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e42", ACTION=="add", RUN+="/usr/bin/sudo -b -u gexueyuan /usr/local/sbin/go-mtpfs -allow-other=true /media/Nexus7"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e41", ACTION=="add", RUN+="/usr/bin/sudo -b -u gexueyuan /usr/local/sbin/go-mtpfs -allow-other=true /media/Nexus7"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e42", ACTION=="add", RUN+="/usr/bin/sudo -b -u gexueyuan /usr/local/sbin/go-mtpfs -allow-other=true /media/Nexus7"
# # Google Nexus 7 MTP mode : automatic unmount when unplugged (all android versions)
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e41", ACTION=="remove", RUN+="/bin/umount /media/Nexus7"
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e42", ACTION=="remove", RUN+="/bin/umount /media/Nexus7"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e41", ACTION=="remove", RUN+="/bin/umount /media/Nexus7"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e42", ACTION=="remove", RUN+="/bin/umount /media/Nexus7"
上面的規則請使用自己的登入明來替換gexueyuan,然後是重啟udev服務。
#sudo service udev restart
現在你的nexus7應該已經可以自動掛載成檔案系統了
3.在/etc/fstab中聲明
到這裡,我們已經達到自動掛載檔案系統的目的了,你能夠拷貝檔案,能夠重新命名檔案,但由於不是真正的檔案系統,還面臨著以下的問題:
1.不能拷貝大於2G的檔案
2.不能建立空檔案
3.不能在這個檔案系統裡面拖拽檔案
4.不能直接在這個檔案系統開啟檔案
除此之外,還有一個問題是,不能在檔案系統列表裡面直接點擊箭頭來卸載,要解決這一點,我們需要在/etc/fstab裡面寫入一些聲明。
首先運行命令:#mount
...
DeviceFs(Nexus 7) on /media/Nexus7 type fuse.DeviceFs(Nexus 7) (rw,nosuid,nodev,allow_other,user=yourlogin)
然後我們通過這條資訊在/etc/fstab結尾來添加一條規則
……
DeviceFs(Nexus\0407) /media/Nexus7 fuse.DeviceFs(Nexus\0407) allow_other,rw,user,noauto 0 0
這樣我就能夠在mtp模式卸載,而且你的nexus 7也會出現在Devices這一欄。
參考來源:http://bernaerts.dyndns.org/linux/247-ubuntu-automount-nexus7-mtp