UBUNTU下以MTP模式自動掛載NEXUS 7

來源:互聯網
上載者:User

   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.