2011年5月9日 星期一

ubuntu以可写模式挂载移动硬盘

前几天因为原先ubuntu9.10老是出现问题,一挂载外置移动硬盘,然后整个系统就卡住,home目录下的分区大小不断减少 ,最后一直减少为0。找了一段时间,找不出问题,再加上编译android有某些特别需求,所以,干脆就升级了事。又因为11.04那个界面变化太大,而且可能不稳 定,工作还事需要稳定一点的系统,再三权衡,最后升级ubuntu10.10.
ubuntu10.10对于我来说,最重要的是工作。但最让我郁闷的事,现在这个新系统一挂载U盘或者引动硬盘你竟然都不可写,这个问题好郁闷,以前9.10的时候是没有这个问题的。所以,花了很多时间找问题,最后,没办法啦,哥那么努力解决,能不好嘛,丢!
先看9.1010.10挂载后的情况:
michael@cowboy:/tmp$ ps -ef > mount.9.10_usb

michael@cowboy:/tmp$ grep mount mount.9.10_usb

root 1296 1 0 14:24 ? 00:00:00 /usr/sbin/rpc.mountd --manage-gids

root 2325 1 0 14:29 ? 00:00:00 /sbin/mount.ntfs /dev/sdc2 /media/usb-1 -o rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,dmask=0077

root 2365 1 0 14:29 ? 00:00:00 /sbin/mount.ntfs /dev/sdc1 /media/usb-1 -o rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,dmask=0077

root 2367 1 0 14:29 ? 00:00:00 /sbin/mount.ntfs /dev/sdc3 /media/usb-3 -o rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,dmask=0077

root 2369 1 0 14:29 ? 00:00:00 /sbin/mount.ntfs /dev/sdc5 /media/usb-4 -o rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,dmask=0077

michael@core:/tmp$ ps -ef > mount.10.10_usb

michael@core:/tmp$ grep mount mount.10.10_usb

root 2886 1 0 12:03 ? 00:00:00 /sbin/mount.ntfs /dev/sdc1 /media/usb-1 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0177

root 2867 1 0 12:03 ? 00:00:00 /sbin/mount.ntfs /dev/sdc2 /media/usb-2 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0177

root 2880 1 0 12:03 ? 00:00:00 /sbin/mount.ntfs /dev/sdc3 /media/usb-3 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0177

root 2884 1 0 12:03 ? 00:00:00 /sbin/mount.ntfs /dev/sdc5 /media/usb-4 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0177

michael@core:/tmp$

两个系统对比,有两个区别: fmaskuhelper。其中10.10fmask=0177,这样,里面的那个1就让使移动硬盘挂载时候没有可写权限了。而9.10没有这个标识,默认 fmask=0000,所以,什么权限都有,所以,你打开你在9.10进入usb移动硬盘的分区后,很明显,各个文件,各个目录都是绿色的,让眼睛也挺难受的。 Uhelper10.10变成了 udisks,其实我也不知道 devkit和 它有什么区别。后面经过我查阅, udisks把挂载的参数(类似“rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0177 ”)传递给mount.ntfs(其实就事mount.ntfs-3g的符号链接),然后由mount.ntfs-3g挂载。


虽然找到了这两个区别,但是,一开始我一直想找到一个配置文件,以为直接配置一下挂载权限就可以了,比如说:

方法一:直接修改/etc/fstab, 见参考文档“Mount Partitions Automatically”,在 fstab 最后面添加几行

#Entry for USB harddisk(sudo blkid):

#UUID=74909E1990456789 /media/usb-1 ntfs rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077 0 0

#UUID=9A4080094345678 /media/usb-2 ntfs rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077 0 0

#UUID=2C644D3F6423456 /media/usb-3 ntfs rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077 0 0

#UUID=1E4C86404C123456 /media/usb-4 ntfs rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077 0 0

效果呢,见下面的方法二。


方法二:使用 ntfs-config

sudo apt-get install ntfs-config

The following NEW packages will be installed:

libntfs-3g79 ntfs-3g ntfs-config

….......

sudo ntfs-config

配置了,但是最后呢,还是去修改 /etc/fstab,要是我是我下次开始不接移动硬盘的话,开机登录画面就说挂载不上,问你要不 要跳过的提示,当你按shift+sS)然后进入系统后,再手工点击挂载usb硬盘盘符,会提示“error mounting: mount exited with exit code 1:helper Failed with: mount: only root can mount /dev/sdb1 on /media/usb-1”。到现在为止,我都不知道ntfs-config到底是怎么使用的,郁闷。


方法三:修改/etc/hal/fdi/policy/preferences.fd文件,更改权限。见下面参考链接“自动挂载移动设置的问题”。可是,当我想修改的时候。我发现我的这个文件没有了,本来好像是有的,不知道怎么搞来搞去,就不见了。最后我也没知道怎么让这个文件生出来,所以,不想太多了。


方法四: 使用gconf-editor 修改挂载ntfs文件系统的权限。执行下面一条命令

gconftool-2 -t list --list-type string -s /system/storage/default_options/ntfs-3g/mount_options "[defaults, exec]"


可是,如果你先用命令gconf-editor 观察,根本就没有storage这个项,不知道哪里来的,至少我这个10.10的系统见不到这个项了。所以,原来老系统可以生效的,现在新系统,强加进去不一定药到病除呢。


所以说,折腾来折腾去,指标不治本,干脆,直接改udisks的代码吧。参考“How to set Gnome automount permissions?”。里面说得挺详细了,我也把整个过程复制一下过来吧.


michael@core:~/work/tools/ntfs/udisks$ ls

michael@core:~/work/tools/ntfs/udisks$ apt-get source udisks

Reading package lists... Done

Building dependency tree

Reading state information... Done

NOTICE: 'udisks' packaging is maintained in the 'Git' version control system at:

git://git.debian.org/git/pkg-utopia/udisks.git

Need to get 736kB of source archives.

Get:1 http://mirrors.163.com/ubuntu/ maverick/main udisks 1.0.1+git20100614-3 (dsc) [2,427B]

Get:2 http://mirrors.163.com/ubuntu/ maverick/main udisks 1.0.1+git20100614-3 (tar) [715kB]

Get:3 http://mirrors.163.com/ubuntu/ maverick/main udisks 1.0.1+git20100614-3 (diff) [18.5kB]

Fetched 736kB in 2s (296kB/s)

gpgv: Signature made Tue 28 Sep 2010 01:02:30 AM CST using RSA key ID 26B47B9F

gpgv: Can't check signature: public key not found

dpkg-source: warning: failed to verify signature on ./udisks_1.0.1+git20100614-3.dsc

dpkg-source: info: extracting udisks in udisks-1.0.1+git20100614

dpkg-source: info: unpacking udisks_1.0.1+git20100614.orig.tar.gz

dpkg-source: info: unpacking udisks_1.0.1+git20100614-3.debian.tar.gz

dpkg-source: info: applying 00git-fix-luks-forced-removal.patch

dpkg-source: info: applying 01-mkfs-tempdir.patch

dpkg-source: info: applying 02-defer_smart_probing.patch

dpkg-source: info: applying 05-german-translations.patch

dpkg-source: info: applying 10-ide-cd-support.patch

dpkg-source: info: applying 11-remove-unused-probers.patch

michael@core:~/work/tools/ntfs/udisks$

michael@core:~/work/tools/ntfs/udisks$

michael@core:~/work/tools/ntfs/udisks$ ls

udisks-1.0.1+git20100614 udisks_1.0.1+git20100614-3.debian.tar.gz udisks_1.0.1+git20100614-3.dsc udisks_1.0.1+git20100614.orig.tar.gz

michael@core:~/work/tools/ntfs/udisks$

michael@core:~/work/tools/ntfs/udisks$ cd udisks-1.0.1+git20100614/

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$ vi src/device.c


修改代码:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

static const char *vfat_defaults[] = { "uid=", "gid=", "shortname=mixed", "dmask=0077", "utf8=1",/*"showexec",*/ NULL };
static const char *vfat_allow[] = { "flush", "utf8=", "shortname=", "umask=", "dmask=", "fmask=","codepage=", "iocharset=", "usefree", /*"showexec",*/ NULL };
static const char *vfat_allow_uid_self[] = { "uid=", NULL };
static const char *vfat_allow_gid_self[] = { "gid=", NULL };
/* ---------------------- ntfs -------------------- */ /* this is assuming that ntfs-3g is used */
static const char *ntfs_defaults[] = { "uid=", "gid=", "dmask=0077", "fmask=0077,*/ NULL };
static const char *ntfs_allow[] = { "umask=", "dmask=", "fmask=", NULL };

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$ sudo apt-get install devscripts

[sudo] password for michael:

Reading package lists... Done

Building dependency tree

Reading state information... Done

devscripts is already the newest version.

0 upgraded, 0 newly installed, 0 to remove and 38 not upgraded.

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$ sudo apt-get build-dep udisks

Reading package lists... Done

Building dependency tree

Reading state information... Done

0 upgraded, 0 newly installed, 0 to remove and 38 not upgraded.

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$ debuild

dpkg-buildpackage -rfakeroot -D -us -uc


…..................


dpkg-deb: building package `udisks' in `../udisks_1.0.1+git20100614-3_i386.deb'.

dpkg-genchanges >../udisks_1.0.1+git20100614-3_i386.changes

dpkg-genchanges: not including original source code in upload

dpkg-source --after-build udisks-1.0.1+git20100614

dpkg-buildpackage: binary and diff upload (original source NOT included)

Now running lintian...

W: udisks: binary-without-manpage sbin/umount.udisks

Finished running lintian.

Now signing changes and any dsc files...

Could not find a signing program (pgp or gpg)!

debuild: fatal error at line 1258:

running debsign failed

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$

michael@core:~/work/tools/ntfs/udisks/udisks-1.0.1+git20100614$ cd ..

michael@core:~/work/tools/ntfs/udisks$ ls

udisks-1.0.1+git20100614 udisks_1.0.1+git20100614-3.dsc udisks_1.0.1+git20100614-3_i386.changes udisks_1.0.1+git20100614.orig.tar.gz

udisks_1.0.1+git20100614-3.debian.tar.gz udisks_1.0.1+git20100614-3_i386.build udisks_1.0.1+git20100614-3_i386.deb udisks-doc_1.0.1+git20100614-3_all.deb

michael@core:~/work/tools/ntfs/udisks$

michael@core:~/work/tools/ntfs/udisks$ sudo dpkg -i udisks_1.0.1+git20100614-3_amd64.deb


安装之前,不用”sudo apt-get remove udisks”dpkg会“升级”原先的udisks。安装完毕后,重新启动,插入usb移动硬盘,一切ok!


启动后:执行ps -ef | grep mount 命令

michael@core:~$ ps -ef | grep mount

root 2920 1 0 00:16 ? 00:00:00 /sbin/mount.ntfs /dev/sdb1 /media/usb-1 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077

root 2920 1 0 00:16 ? 00:00:00 /sbin/mount.ntfs /dev/sdb2 /media/usb-2 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077

root 3028 1 0 00:16 ? 00:00:00 /sbin/mount.ntfs /dev/sdb3 /media/usb-3 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077

root 3047 1 0 00:16 ? 00:00:00 /sbin/mount.ntfs /dev/sdb5 /media/usb-4 -o rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,dmask=0077,fmask=0077


或者michael@core:~$ tail -f /var/log/syslog命令也可以观察。


另外补充点其他的:

apt-get source udisks 后,会自动帮你把补丁打进源码。但是某些代码就不一定帮你打补丁,比如说ntfs-config。需要你手工打入补丁。手工打补丁下载的源码有个特点,就是有个“*.diff.gz”文件。但不知道是不是这个原理。最好的方法还是用meld对比一下orig解压出来的源码。

还有一个比较讨厌的事就是:移动硬盘自动挂载分区后,回自动打开盘符。这个方式老弹出来,不好,所以,可以参考“Disable/Enable Auto-Mount in Ubuntu 10.04/10.10”,执行命令gconf-editor,进入“apps --> nautilus --> preferences”,把“media_automount_open”后面的勾去掉。


参考链接:

1. 自动挂载移动设置的问题[已解决] http://www.linuxsir.org/bbs/showthread.php?t=355802

2. Disable/Enable Auto-Mount in Ubuntu 10.04/10.10 http://www.liberiangeek.net/2010/09/disableenable-auto-mount-ubuntu-10-0410-10-maverick-meerkat/

3. Mount Partitions Automatically https://help.ubuntu.com/community/AutomaticallyMountPartitions

4. How to set Gnome automount permissions? http://ubuntuforums.org/showthread.php?p=10033108


标签: Howto auto mount external hard drive, USB udisks, fmask, dmask, ntfs, ntfs-3g, ubuntu, 10.10, 10.04,可写,移动硬盘


沒有留言:

張貼留言