linux实现远程文件夹共享-samba

问题描述

我的代码需要访问存在于两个系统(win和linux)的文件夹,我不是文件夹的创建者,只需要对它们进行读取,不做写操作。

Samba

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。

所以要在win系统,装一个samba,linux已经有了(mount --version可查看版本)。

如何挂载

常用参数

-t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
-o rw:用可读写模式挂上
dir_mode和file_mode:指定文件夹和文件的权限,三位数字。如果修改了,会覆盖默认的755

mount参数参考:
https://blog.51cto.com/zkxfoo/1758529

临时挂载实例

mount -t cifs -o username=xxx,password=xxx,rw,dir_mode=0777,file_mode=0777  //ip/远程路径 /本地路径

这句命令表示将 ip/远程文件夹路径 挂载到 /本地路径,那么访问本地路径就可以看到远程文件夹下的内容。

这样只能临时挂载,每次开启xshell连接时都会找不到(目标文件夹,ls会卡死)

一种长期挂载方法(已失败,仅供参考)

  1. 修改 /etc/fstab
    格式:欲挂载位置\t本地位置\t文件系统种类(这里是cifs,是windows smb的)\t其他参数(如用户名、密码、挂载后的权限等)\t0(转储频率:0:从不备份 1:每日备份2:每隔一天备份)\t0(自检次序:0不自检,1首先自检,通常只能被/使用,2等数字为1的自检完成后,再进行自检)
    在这里插入图片描述
    最后三行是挂载命令,第一列是//ip/远程路径 ,第二列是/本地路径,第三列是cifs,第四列是defaults,username=用户名,password=密码,rw,dir_mode=0777,file_mode=0777,和前面一样;后两列可以留0

  2. 生效:重启服务器或者mount -a -t cifs
    -a 自动挂载所有(/etc/fstab文件中)支持自动挂载的设备。这里会挂载上之前没有挂载的东西。-t 指定类型

但是关闭xshell再次启动后,还是du会卡。很可能是因为某些原因挂载失败了。
可以用 strace 命令(如df\du\ls之类的)看是卡在哪一步了

这个方法不行,我这个服务器没有systemctl(替换为service XXX restart,提示找不到该服务)
service --status-all 可以查看本机所有服务,也确实没有proc*这个服务。

很可能是隔一段时间就失败了(没关xshell也卡了ls,cd,df等等),所以需要的时候,请临时挂载,不要改文件/etc/fstab!!!!

如果真的卡死了,先用root登录本机,然后kill掉卡住的进程,接着umount挂载位置(尤其是远程连接的,不确定的话先用trace诊断),可能需要-fl来强制去掉挂载,然后去改/etc/fstab(如果改动了,再用mount -a生效)。

查看进程号
ps -ef | grep 命令
第二列时pid,用kill -s 9 pid可以结束进程。需要root权限
在这里插入图片描述

最好临时挂载。

查看挂载

列出磁盘使用情况:df

取消挂载

umount 本地挂载路径

使用被挂载的路径也可以,但是如果用本地路径就必须是精确的,不能是父级文件夹

umount失败

那就等一下。
-f是强制卸载(在无响应的NFS系统的情况下),-l 隔离文件系统后,全部清除

umount -fl 本地挂载路径

在这里插入图片描述
上面这样提示的话,此时该文件夹可能会有问题,进文件夹后ls/ll等无反应,而且root也无法删除
fuser -k 是杀死访问指定文件的所有进程
在这里插入图片描述

此时需要等一会儿,再次umount这个文件夹。然后权限就正常了,可以删除了。

fuser用法
用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号,那些本地进程使用file,参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。
在这里插入图片描述

格式:fuser 选项 参数
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
-x 与 -c 或 -f 连用,报告除标准 fuser 输出以外的可执行的和可载入的对象。

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值