linux中使用cifs挂载windows 7的共享文件提示mount error(5): Input/output error

时间:2023-01-26 21:34:12

在配置window7共享成功,并在window7中可以访问

在linux中可以使用 如下命令得到共享列表:



 smbclient -U Administrator -L //192.168.1.101/www
Enter Administrator's password:
Domain=[QIDIZI-K27] OS=[Windows 7 Professional 7601 Service Pack 1] Server=[Windows 7 Professional 6.1]

        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       远程 IPC
        www             Disk
Connection to 192.168.1.101 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
NetBIOS over TCP disabled -- no workgroup available


说明linux能够连接到window了;


尝试mount,注意,cifs type支持需要安装,有些系统可能有smbfs,但是好像通用的是cifs,所以在centos7中使用yum install cifs-utils来安装支持:


[root@qidiziCentos www2]# mount -t cifs --verbose -o username=Administrator,password="密码" //192.168.1.101/www /media/

mount.cifs kernel mount options: ip=192.168.1.101,unc=\\192.168.1.101\www,user=Administrator,pass=********
mount error(5): Input/output error

Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)


ok,出错了,

从google上找了半天,这块错误好像每个人遇到都不一样.解决的方式也不一样.

后来自己测试发现.应该是其它人有可能使用xp来共享.所以,解决就不一样.

对于window7来说,加上以下参数就可以解决了:vers=2.1,sec=krb5



[root@qidiziCentos www2]# mount -t cifs --verbose -o username=Administrator,password="密码",vers=2.1,sec=krb5 //192.168.1.101/www /media/
mount.cifs kernel mount options: ip=192.168.1.101,unc=\\192.168.1.101\www,vers=2.1,sec=krb5,user=Administrator,pass=********
[root@qidiziCentos www2]# ls /media/
新建文本文档.txt

只不过,centos共享显示出来的文件,是否存在用户组还有权限无法设置的问题,现在还不好确定,刚使用这个方式能连接成功而已.

是否符合所有的要求,现在不好说....

估计还得折腾;


经过初步测试,感觉smb client得到的文件都是临时挂在os中,那么,应该处理方式是类似:给这类文件/文件夹,指定的mode或是owner,ok,挂载时,就以这些指定属性来显示,作为本os的必要属性显示.也因为它只是读取时才得知你访问的文件是什么,就无法预先或当做已经存在的文件来处理:给它改变成不同mode等;如果是这样,那么client这边就需要建立hash表,建立比如mode/owner/inode等之类信息了,那么,对于一个从server边已经删除再重新建立,client会如何处理呢?这也是一个问题吧.只不过,这样情况通知队列式通知也是能做到区别是否某个对应文件的.update hash表.只不过,测试了下cifs好像暂时没有这种功能,使用chmod -x 在file_mode=0777参数情况下,chmod虽然成功了,但是ll出来还是0777;

好吧.目前我的nginx还不需要区别mode.毕竟只是测试.如果再严格点要求,估计只能使用rsync这类来同步式共享了


根据权限的测试,最后mount的参数如下,可以根据参数名字,来看看那些参数可以做一些改变来达到需要的目的;


umount /home/www && mount -t cifs --verbose -o username=Administrator,password="密码",sec=krb5,vers=2.1,ip=10.0.2.2,domain=QIDIZI-PCS,uid=998,gid=997,forceuid,forcegid,port=445,file_mode=0777,dir_mode=0777,cruid=998,rw,setuids,cache=strict,noacl //10.0.2.2/www /home/www


如果需要自动挂载(开机自动挂载):

写法是,打开/etc/fstab,在最后一行加入,要非常注意密码不能使用""来包含它,在fstab中竟然把""当成密码部分来解释,最后会出现如下错误,这是我一个参数一个参数测试得到的.但是""号在bash下挂载,却不会出现问题,并没有把""当成密码一部分的处理方式.这说明fstab的参数传递还是有问题存在的.

[root@qidiziCentos qidizi]# sudo mount -a
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)


//10.0.2.2/www /home/www cifs username=Administrator,password=密码,sec=krb5,vers=2.1,ip=10.0.2.2,domain=QIDIZI-PCS,uid=998,gid=997,forceuid,forcegid,port=445,file_mode=0777,dir_mode=0777,cruid=998,rw,setuids,cache=strict,noacl,iocharset=utf8,noperm 0 0


看来想互相共享,但是权限或者是用户在各自系统能够独立且有效里,通过smb这种方式是无法实现了,目前来看.好像它没有考虑过要用各种方案来完成系统所有的功能;

也就是如果:想达到把这些文件当成os本身实际的资源,与硬盘中的其它文件唯一不同的是获取来源只是一个从硬盘读取,另一个从网络获取差别而已,这种需求,看来有点难度了.通过smb共享.是否存在于一种网络读取式的硬盘分区呢?^_^再找找.或者ntfs-3g挂载window物理分区也是舍得一试的方案


再仔细看眼man mount.cifs中一节话,确实断了我再去尝试可以分配不同文件的mode/ownership念头了:


FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS
       The core CIFS protocol does not provide unix ownership information or mode for files and
       directories. Because of this, files and directories will generally appear to be owned by
       whatever values the uid= or gid= options are set, and will have permissions set to the
       default file_mode and dir_mode for the mount. Attempting to change these values via
       chmod/chown will return success but have no effect.

另外说明一下.我window是主机,virtualbox中跑的才是linux:centos;

centos使用的virtualbox的连接是nat,nat的配置是10.0.2.0/24,从centos中看到,网关应该是10.0.2.2,并不是1....

所以.我的window的wifi ip192.168.1.101是会变化的.,在centos中使用这个ip来mount是不好的,window重新连接wifi就可能发生ip改变了;

那mount肯定失败.所以,这里可以换成10.0.2.2centos的网关也是可以使用的;


这么考虑是因为有原因的:


1 经过几天的折腾和需求这是目前唯一能解决的方案:

  需求是:

               A:   virtualbox中跑的centos,需要提供window和其它pc的web服务.那么host-only可以排除了; 

               B: 需要开放22端口给window,但是又不能使用bridge,因为它的ip会变,在window上使用ssh时就非常麻烦,这个时候host-only与nat都可以选择.

              C:需要widnow与centos共享文件,,虽然virtual提供了共享文件,但是发现在centos中它的文件的mod是固定的,无法改变,就不能满足需要做目录和文件权限控制时的需要了


共享这块考虑过webdav+nginx,发现在window边提交修改是没有问题的,但是一在centos中使用命令echo abc >到任意一个webdav控制下的文件时,在window这边这个文件立刻变成无内容,又不行了这个方法;;


尝试在centos中做smb server.如果选择的连接方式是nat,发现使用端口指向到到window的127.0.0.2时,已经存在445端口绑定在一个svhost.exe上好像,而这个445端口,在window7下是无法关闭,也不能改变端口.那么把centos的445通过端口映谢的方式也行不通了.


虽然可以说使用host-only来做,但是host-only无法把centos端口上的80端口绑定到window的*.*.*.*:80上,只能host-only使用,也就是说想共享centos的smb服务,和暴露80到全部的windowip上;那么至少要让centos拥有nat+host-ony或host-only+bridge;


如果说使用host-only+nat或是nat+bridge,就会出现二个lan网卡,在centos上的某些服务,比如php的mysql模块,就会通过任意其中一个网卡,比如把nat+host-only的host-only不让它共享window的wifi连接,也就是说,host-only从centos看来,它是不能wan的,只能通过nat走.那么.mysql这时可能通过host-only来尝试连接wan,应该可以通过router来指定吧?感觉就更加麻烦了,我没有试过,让nat和host-only都可以连接wan,但是我觉得这样处理二个lan网卡都能连接wan,也是有问题的.到时肯定存在数据随机选择的可能通路?


也就最后想了下.还是让window做smb共享吧.然后centos通过cifs来mount.这样一个nat连接就可以满足所有的需要了;

暴露80给window所有ip
暴露22给127.0.0.1;
centos+window可以互相共享,文件权限各自系统控制;

所以有 了上面的尝试;


另外说明一下.我window是主机,virtualbox中跑的才是linux:centos;

centos使用的virtualbox的连接是nat,nat的配置是10.0.2.0/24,从centos中看到,网关应该是10.0.2.2,并不是1....

所以.我的window的wifi ip192.168.1.101是会变化的.,在centos中使用这个ip来mount是不好的,window重新连接wifi就可能发生ip改变了;

那mount肯定失败.所以,这里可以换成10.0.2.2centos的网关也是可以使用的;


这么考虑是因为有原因的: