Linux操作系统下的文件资源共享
2010-03-06 15:47:13 阿炯

Linux系统间下常用的文件传输方式介绍与比较

这里盘点了Linux系统间可用的文件交换方式,是我多年运维工作的总结,希望能对大家有用。

1. scp

scp是secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,主要用于linux服务器之间复制文件和目录。scp使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而可以实现安全的远程拷贝文件。下面介绍SCP三种不同用法的效率。实际上已经有人开发了第三方补丁来提高传输效率:提高ssh文件传输性能补丁-hpn-ssh

1.1 scp 不使用压缩

将本地文件拷贝到远程服务器:
scp -P port freeoa.tar user@host:~/freeoa.tar

将远程服务器中的文件拷贝到本地的用法:
scp -P port user@host:~/freeoa.tar freeoa.tar

1.2 压缩后传输

SCP传输ib_logfile0文件之所以需要那么多时间,是因为它没有对传输的数据进行压缩,可以先 将文件压缩,然后再进行远程拷贝。如下所示:
tar -zcf freeoa.tar.tar.gz freeoa.tar
scp -P port freeoa.tar.tar.gz user@host:~/freeoa.tar.tar.gz
ssh -p port user@host 'tar -zxf freeoa.tar.tar.gz'

1.3 scp启用压缩

相对于第一种方法,第二种方法极大地减少了传输时间,但是需要执行三条语句,较为麻烦。更简单的方法如下所示:
scp -P port -C freeoa.tar user@host:~/freeoa.tar

-C选项启用了SSH的压缩功能,通过man ssh可以看到,在-C选项的解释部分有这么一句话:”the compression algorithm is the same used by gzip”。SSH与gzip使用的是同一种压缩算法,即第二种方法与第三种方法几乎一样,但第三种方法更为简单方便,所以推荐使用第三种方法传输数据。

第三种方法传输比第二种方法多花了10秒,这10秒主要用于数据的压缩和解压。

值得注意的是,修改压缩算法的压缩比对总的数据传输时间影响不大,这是因为更高的压缩比例,需要的压缩时间也更多。

2. sftp

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议,可以为传输文件提供一种安全的加密方法。sftp与ftp有着几乎一样的语法和功能,不过SFTP是SSH的一部分,它使用加密传输认证信息和传输的数据,因此使用SFTP是非常安全的。但由于这种传输方式使用了加密、解密技术,所以传输效率比普通的FTP要低一些。与ftp的比较可以参考:使用SFTP替代FTP来传输文件

上传数据到服务器上:
echo progress; echo "put freeoa.tar"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b

从服务器上下载数据:
echo progress; echo "get freeoa.tar"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b

使用sftp传输文件比SCP略慢。具体的配置方式参考:在Linux系统上使用SFTP文件传输

3. 直接使用ssh

将本地的数据传输到远程服务器的用法:
gzip -c freeoa.tar | ssh -p port user@host 'gunzip >freeoa.tar'

将远程服务器传输到本地的用法
ssh -p port user@host "gzip -c freeoa.tar" | gunzip -c > freeoa.tar

使用这种方式传输ib_logfile0需要00:55s,相对于scp -C慢了几秒,不过相差不大。但是,scp用法更简单一些,只需要加一个-C参数,而不用手动调用gzip压缩程序。

4. nc

netcat(简称nc)是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成相当多的事情。

netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。我们这里只讨论nc的用于数据传输的情况。

在服务器端:
sudo nc -l -p port | tar -zxf - #l 参数用于监听
sudo nc -l -p port > freeoa.tar

在客户端:
tar -zcf - freeoa.tar | sudo nc host port
sudo nc host port < freeoa.tar

使用nc传输文件比SCP -C略快,这是因为SCP需要对数据进行加密,而nc只是简单的传输数据。

可以看到,nc不需要任何配置操作,使用也非常简单,不过nc需要root权限。具体的使用方法可能参考:netcat 命令行使用

5. rsync

rsync(remote sync)是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来,它主要用于数据的同步备份。rsync有两种用法,一种是通过SSH通道传输数据,另一种是通过与服务器的rsync守护者(daemon)进程建立连接来传输数据。这个工具应该是平时工作中使用最为广泛的文件同步工具了,同时它也是可跨平台运行的:跨平台用Rsync来同步文件cwRsync设置及使用

5.1 rsync with ssh

rsync使用SSH通道传输数据时,配置比较简单,只要配置好了SSH,就直接可用,不需要额外的操作,正是这个原因,很多人更喜欢使用这种方式来使用rsync。

使用方法如下:
rsync -zav --rsh='ssh -p port' freeoa.tar user@host:path

rsync 使用SSH 通道传输与直接使用SSH传输数据时间一样。

5.1 rsync with daemon

不同于SCP和SFTP,rsync是一套独立的软件,除了通过SSH通道传输数据以外,还可以通过rsync的守护者进程进行数据传输。

rsync 的使用方法如下:
rsync -avz freeoa.tar user@host::module_name

rsync传输与scp -C差不多。另外值得注意的是,rsync使用zlib压缩算法压缩数据,ssh与gzip使用的是LZ77算法。

rsync的参数特别多,详细的使用方法可以参考这里。

6. ftp

FTP命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输。

ftp的使用方法就不再介绍了,FTP没有数据压缩的功能。数据压缩能够显著减少传输的数据量,数据不能压缩,再好的传输工具也会受限于网络传输速率。

7. 结论

以上几种数据传输方式也有各自的应用场景,其中nc使用最简单,配置也最方便,但是需要root权限,在有root权限没有配置SSH的情况下,推荐使用nc。

单纯从数据传输来看,比较喜欢SCP,也强烈推荐SCP,不过使用SCP时一定要使用-C选项,即启用压缩功能。从前面的实验中也可以看到,启用压缩与不启用压缩传输的数据量相差很多。

rsync配置相对比较复杂,它的主要功能是进行增量备份而不是数据传输,在需要增量备份的情况下,毫不犹豫地选择rsync。

FTP配置也比较麻烦,传输速度也很一般,而且,FTP没有自带压缩功能,需要手动压缩,但是,FTP是最常用的一种数据传输方式,大多数普通用户都使用过FTP,对于用户来说,学习成本较低,在需要将文件传送给多个用户时,推荐使用FTP。

SFTP是建立在SSH上的FTP,传输速度也很快,与SCP不分伯仲,但是SFTP可以交互式的使用,在某些情况下可能会比较有用,如果已经配置好了SSH,SFTP的配置成本为零,即无需配置,直接可用。

总的来说,每种传输方式都各有千秋,应当根据自己的实际需要,选择适合的文件传输方法。



Linux下挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享

linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着linux系统的日渐成熟和稳定以及它开放源代码特有的优越性,linux在全世界得到了越来越广泛的应用。现在许多企业的计算机系统都是由UNIX系统、Linux系统和 Windows系统组成的混合系统,不同系统之间经常需要进行数据交换。下面我根据自己的实际工作经验介绍一下如何在linux系统下挂接(mount) 光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX NFS网络共享。

挂接命令(mount)
首先介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的。
命令格式:
mount [-t vfstype] [-o options] device dir

其中:
1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660。
DOS fat16文件系统:msdos。
Windows 9x fat32文件系统:vfat。
Windows NT ntfs文件系统:ntfs。
Mount Windows文件网络共享:smbfs。
UNIX(LINUX) 文件网络共享:nfs。

2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统。
ro:采用只读方式挂接设备。
rw:采用读写方式挂接设备。
iocharset:指定访问文件系统所用字符集。

3.device 要挂接(mount)的设备。

4.dir设备在系统上的挂接点(mount point)。

挂接光盘镜像文件
由于近年来磁盘技术的巨大进步,新的电脑系统都配备了大容量的磁盘系统,在Windows下许多人都习惯把软件和资料做成光盘镜像文件通过虚拟光驱来使用。这样做有许多好处:一、减轻了光驱的磨损;二、现在硬盘容量巨大存放几十个光盘镜像文件不成问题,随用随调十分方便;三、硬盘的读取速度要远远高于光盘的读取速度,CPU占用率大大降低。其实linux系统下制作和使用光盘镜像比Windows系统更方便,不必借用任何第三方软件包。

1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。
#cp /dev/cdrom /home/freeoa/mydisk.iso 或
#dd if=/dev/cdrom of=/home/freeoa/mydisk.iso
注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/freeoa/mydisk.iso

2、将文件和目录制作成光盘镜像文件,执行下面的命令。
#mkisofs -r -J -V mydisk -o /home/freeoa/mydisk.iso /home/freeoa/ mydir
注:这条命令将/home/freeoa/mydir目录下所有的目录和文件制作成光盘镜像文件/home/freeoa/mydisk.iso,光盘卷标为:mydisk

3、光盘镜像文件的挂接(mount)
#mkdir /mnt/vcdrom
注:建立一个目录用来作挂接点(mount point)
#mount -o loop -t iso9660 /home/freeoa/mydisk.iso /mnt/vcdrom
注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。

挂接移动硬盘
对linux系统而言,USB接口的移动硬盘是当作SCSI设备对待的。插入移动硬盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root@pldyrouter /]# fdisk -l
Disk /dev/sda: 73.4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 4 32098+ de Dell Utility
/dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
/dev/sda3 2555 7904 42973875 83 Linux
/dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
/dev/sda5 7905 8924 8193118+ 82 Linux swap

在这里可以清楚地看到系统有一块SCSI硬盘/dev/sda和它的四个磁盘分区/dev/sda1 -- /dev/sda4, /dev/sda5是分区/dev/sda4的逻辑分区。接好移动硬盘后,再用fdisk –l 或more /proc/partitions查看系统的硬盘和硬盘分区情况:
[root@pldyrouter /]# fdisk -l
Disk /dev/sda: 73.4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 4 32098+ de Dell Utility
/dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
/dev/sda3 2555 7904 42973875 83 Linux
/dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
/dev/sda5 7905 8924 8193118+ 82 Linux swap
Disk /dev/sdc: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 510 4096543+ 7 HPFS/NTFS
/dev/sdc2 511 4864 34973505 f Win95 Ext'd (LBA)
/dev/sdc5 511 4864 34973473+ b Win95 FAT32

大家应该可以发现多了一个SCSI硬盘/dev/sdc和它的两个磁盘分区/dev/sdc1?、/dev/sdc2,其中/dev/sdc5是/dev/sdc2分区的逻辑分区。我们可以使用下面的命令挂接/dev/sdc1和/dev/sdc5。
#mkdir -p /mnt/usbhd1
#mkdir -p /mnt/usbhd2

注:建立目录用来作挂接点(mount point)
#mount -t ntfs /dev/sdc1 /mnt/usbhd1
#mount -t vfat /dev/sdc5 /mnt/usbhd2

注:对ntfs格式的磁盘分区应使用-t ntfs 参数,对fat32格式的磁盘分区应使用-t vfat参数。若汉字文件名显示为乱码或不显示,可以使用下面的命令格式。
#mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1
#mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2

linux系统下使用fdisk分区命令和mkfs文件系统创建命令可以将移动硬盘的分区制作成linux系统所特有的ext2、ext3格式。这样在linux下使用就更方便了。使用下面的命令直接挂接即可。
#mount /dev/sdc1 /mnt/usbhd1

挂接U盘
和USB接口的移动硬盘一样对linux系统而言U盘也是当作SCSI设备对待的。使用方法和移动硬盘完全一样。插入U盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root@pldyrouter root]# fdisk -l
Disk /dev/sda: 73.4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 4 32098+ de Dell Utility
/dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
/dev/sda3 2555 7904 42973875 83 Linux
/dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
/dev/sda5 7905 8924 8193118+ 82 Linux swap

插入U盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root@pldyrouter root]# fdisk -l
Disk /dev/sda: 73.4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 4 32098+ de Dell Utility
/dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
/dev/sda3 2555 7904 42973875 83 Linux
/dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
/dev/sda5 7905 8924 8193118+ 82 Linux swap
Disk /dev/sdd: 131 MB, 131072000 bytes
9 heads, 32 sectors/track, 888 cylinders

Units = cylinders of 288 * 512 = 147456 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 * 1 889 127983+ b Win95 FAT32
Partition 1 has different physical/logical endings:
phys=(1000, 8, 32) logical=(888, 7, 31)

系统多了一个SCSI硬盘/dev/sdd和一个磁盘分区/dev/sdd1,/dev/sdd1就是我们要挂接的U盘。
#mkdir -p /mnt/usb

注:建立一个目录用来作挂接点(mount point)
#mount -t vfat /dev/sdd1 /mnt/usb

注:现在可以通过/mnt/usb来访问U盘了, 若汉字文件名显示为乱码或不显示,可以使用下面的命令。
#mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb

挂接Windows文件共享
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba软件包。现在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到www.samba.org网站下载samba软件包。

当windows系统共享设置好以后,就可以在linux客户端挂接(mount)了,具体操作如下:
# mkdir –p /mnt/samba

注:建立一个目录用来作挂接点(mount point)
# mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba
注:administrator 和 pldy123 是ip地址为10.140.133.23 windows计算机的一个用户名和密码,c$是这台计算机的一个磁盘共享
如此就可以在linux系统上通过/mnt/samba来访问windows系统磁盘上的文件了。以上操作在redhat as server 3、redflag server 4.1、suse server 9以及windows NT 4.0、windows 2000、windows xp、windows 2003环境下测试通过。

挂接UNIX系统NFS文件共享
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍一下在linux下如何mount nfs网络共享。

在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。具体还可以参考:nfs使用设置入门

1、Solaris系统NFS服务端配置方法如下:
(1)修改 /etc/dfs/dfstab, 增加共享目录
share -F nfs -o rw /export/home/freeoa

(2)启动nfs服务
# /etc/init.d/nfs.server start

(3)NFS服务启动以后,也可以使用下面的命令增加新的共享
# share /export/home/freeoa1
# share /export/home/freeoa2
注:/export/home/freeoa和/export/home/freeoa1是准备共享的目录

2、linux系统NFS服务端配置方法如下:
(1)修改 /etc/exports,增加共享目录
/export/home/freeoa 10.140.133.23(rw)
/export/home/freeoa1 *(rw)
/export/home/freeoa2 linux-client(rw)
注:/export/home/目录下的freeoa、freeoa1、freeoa2是准备共享的目录,10.140.133.23、*、 linux-client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机/etc /hosts文件里增加linux-client主机ip定义。格式如下:
10.140.133.23 linux-client

(2)启动与停止NFS服务
/etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)
/etc/rc.d/init.d/nfs start 启动NFS服务
/etc/rc.d/init.d/nfs stop 停止NFS服务
注:若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令exportfs -rv也可以达到同样的效果。

3、linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享
# mkdir –p /mnt/nfs

注:建立一个目录用来作挂接点(mount point)
#mount -t nfs -o rw 10.140.133.9:/export/home/freeoa /mnt/nfs

注:这里我们假设10.140.133.9是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里增加服务端ip定义。/export/home/freeoa为服务端共享的目录。如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以NFS方式共享出来的文件了。以上操作在 redhat as server 3、redflag server4.1、suse server 9以及Solaris 7、Solaris 8、Solaris 9 for x86&sparc环境下测试通过。


该文章最后由 阿炯 于 2017-01-09 11:29:06 更新,目前是第 3 版。