红联Linux门户
Linux帮助

用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

发布时间:2015-04-02 10:27:29来源:linux网站作者:xinlu8439

标题本想使用关键词NAS,但考虑到并不打算建立Web管理页面,和一些其他复杂的功能,未避免造成误导,就把范围强调在“Windows文件共享”和“FTP服务器”上。更精确地说,就是使用Samba和vsftpd两个Linux程序。

安装和使用Samba和vsftpd都不是难点,本文也只是作为留给自己的笔记来发表。之所以放弃使用FreeNAS或NAS4Free等现成NAS服务器专注发行版,是因为与Hyper-V的兼容不够好。如果看过我之前文章的朋友,应该会记得,我的家庭服务器是一台(现在是两台了)配置还不错的旧机器,上面运行了微软Hyper-V服务器,而所有其他的Windows Server、Linux Server则以虚拟服务器的形式存在,并各自专注做少量的事情。

前不久我升级了主服务器,现在配置为双Xeon L5420 + 32GB内存,这足够折腾了。上面的虚拟服务器分别包括了:Windows Home Server 2011(备份和文件共享)、Windows Server 2012 R2 Core(域控制器和DNS)、Windows 2012 R2 (VPN和DFS)、Ubuntu Server 14.04 LTS(代理服务器)、Xubuntu 14.04 (Matlab服务器)。

所有虚拟服务器文件存放于SSD上,两块SSD组成RAID 1。所有需要大容量存储的服务器都外挂传统硬盘,4块1.5TB硬盘组成RAID 10,供Windows Home Server 2011和Ubuntu等用于存储数据。

这样的组合最大化保证了运行速度和数据安全。以下是大概的图示:
用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

这次的Ubuntu文件服务器+FTP服务器在功能上看似与Windows Home Server 2011存在重叠,但实则这是我考虑了很久的一个计划。

Windows Home Server 2011毕竟是微软停止推新的产品,尽管官方技术支持会一直持续到2017年之后,但终归是要考虑替换的。

另外就是最近iCloud闹出的明星***事件,再次证明了我对云存储的担忧是正确的。我觉得云可以方便我们协同工作,共享不敏感文件,但绝对不是所谓的一切资料的最终存储解决方案。就像你不可能把现金放在保险箱里,然后把保险箱放在别人的地方,即使这个人承诺你“他会随传随到,随时为你服务”。

没有人可以保证数据的存储会绝对安全。如果数据足够敏感,任何时候可以相信的人都还是自己。所以,请不要把敏感的东西放在别人的地方,多买些硬盘花不了几个钱。

抛开难用的iTunes后,在不考虑云备份的前提下,iPhone备份方案可以选择的就只有NAS和FTP,于是就有了我在Ubuntu上自建FTP的想法。当然,在Windows Home Server 2011加入FTP支持也并不难,但我的Windows Home Server是对外的,而且我始终觉得这最后是会被我淘汰的,因此并不希望太依赖这个系统。


本章内容大致包括Ubuntu Server的环境配置和新硬盘添加及设置。

1)Ubuntu Server的安装和配置

安装就不细说了,只提一点,在过程中可以选择服务器角色的时候,记得勾选OpenSSH Server和Samba File Server。实在忘记了,或者已经安装好但不记得是否装了这两项的,也没有关系,根据下面两行指令就可以安装。

sudo apt-get install openssh-server

sudo apt-get install samba

这里还不需要配置,具体配置在后边。SSH其实也非必要,只是没有这个东西操作起来很不方便(不能远程,不能在Windows下用Putty)。
用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

上面准备工作完成后,接下来是给服务器添加硬盘。

2)Mount新硬盘

我测试用的虚拟机配置为8GB系统硬盘+20GB存储硬盘。之所以把存储硬盘单独分出来,好处在于今后拆解、更换、拓展什么的都方便。个人强烈不建议用一块大硬盘把系统、存储都放在一起。

加入一块新硬盘后,我们要做的第一件事就是初始化、格式化它,然后mount到Ubuntu系统下(Linux下没有盘符的概念,所以就是创建一个文件夹,然后让这个文件夹和硬盘关联起来)。

具体操作:

a)执行以下指令

ls /dev/sd*

该指令会列出当前所有系统盘符和侦测到的硬盘,执行后结果如下:

/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb

其中,/dev/sdb是新添加硬盘,前面的都是一个硬盘情况下系统默认配置。这里我们记住“sdb”这个关键词。

b) 执行以下指令

sudo fdisk /dev/sdb

注意,上面的/dev/sdb就是前面对应的新硬盘。执行该指令后,会出现一段描述,最下面要求输入命令代码:

Command (m for help):

我们先输入p命令

Command (m for help):p

回车后会看到一些有关新硬盘的信息,如容量等等,并要求再次输入指令,这一次我们输入n:

Command (m for help):n

然后会询问分区类型和分区数量等,我这里都采用默认设置,即直接按回车就好,以下为截图:
用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

上面的参数是把整块新硬盘设置为一个大的分区,但这些设置尚未生效,我们还要在最后确认一次

Command (m for help):w

w指令是把内存中的参数设定写入到硬盘上。输入w后回车,会看到

The partition table has been altered!

然后系统命令行会返回到bash

c) 执行ls /dev/sd*检查一下:

/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5 /dev/sdb  /dev/sdb1

多出一个/dev/sdb1,分区成功!

d) 接下来要对新分区进行格式化

sudo mkfs.ext3 -L /storage /dev/sdb1

这里的/storage是可以更改的,就是对分区的一个命名而已,相当于Windows下盘符的命名。

/dev/sdb1对应的是新分区,前面我们检查时看过了。

根据硬盘大小不同,以上指令完成的时间会不同。大硬盘,尤其是TB级别会需要相当时间,请耐心等待。

完成后会看到:
用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

e) 再接着我们要把新格式化好的分区mount到Ubuntu系统下

sudo mkdir /storage

前面说了,Linux没有盘符的概念,分区对应的就是系统下一个文件夹,所以我在根目录下创建一个storage文件夹。

这个硬盘不是移动硬盘,是需要每次重启后自动mount的,所以我们需要修改/etc/fstab的内容

sudo nano /etc/fstab

在最下方加入

/dev/sdb1      /storage        auto    defaults        0      0

保存退出。重启后执行mount指令,应该会看到最后一段写着:

/dev/sdb1 on /storage type ext3 (rw)
用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器

注:以上图片上传到红联Linux系统教程频道中。

创建samba文件共享其实也不难,要点就是创建好Linux账户(要和samba账户对应),设置好共享文件夹权限。尤其是权限部分,比较没有Windows那么直观,理解以后并不难,但这里不打算复杂深入的讲解。

我的设置目的基本就一个要求,让ftp这个组的所有成员用户可以在storage这个共享文件夹里拥有读写权限,并且希望所有在storage下创建的新文件夹都继承storage的权限设定。

组:ftp

成员:xin、gong

系统安装时创建的用户为xin,gong用户还不存在,ftp组也还未创建,所以我们先进行成员添加及组的添加。

sudo useradd gong -m -s /bin/bash

sudo passwd gong

# 以上指令可以创建用户gong并设置密码,然后我们创建ftp组

sudo groupadd ftp

# 再将用户xin、gong加入到ftp组中

sudo usermod -a -G ftp xin

sudo usermod -a -G ftp gong

# 通过id xin这个指令可以查看是否添加组成功。

有了用户,有了组,现在要给/storage这个文件夹设置相应的权限,并为samba设置相应的用户

# 去根目录下执行ls -l,可以看到:

drwxr-xr-x    3    root    root    4096    Sep    4    12:20    storage

# 这说明storage这个文件夹当前所有人为root,所有组为root。

# 所有人不需要更改,把组改为ftp,并让所有ftp组的成员都具备读写权。

sudo chown :ftp /storage

sudo chmod 775 /storage    # 如果不想其他账户看到,用770的权限也可以

# 执行ls -l查看结果:

drwxrwxr-x    3    root    ftp    4096    Sep    4    12:20    storage

# 添加samba用户:

sudo smbpasswd -a xin

sudo smbpasswd -a gong

执行上述指令时,每添加一用户就会自动要求为该用户设置samba密码。这个密码与登录Ubuntu系统的密码可以不同,它是Windows访问共享文件夹时需要的账户和密码。为了方便,通常你可以设置一个匹配Windows账户的samba用户和密码,这样Windows打开共享文件夹时就不需要输入口令了。

另外,samba添加的用户一定要存在,就是必须先用useradd添加一个对应的Linux登录账户,否则会出错。

到这一步,其实还差点。之前说过了,要让storage共享文件夹下创建的新文件夹集成母文件夹权限,不然就会出现xin创建的文件gong不能访问(当然你需要这样的效果也可以)。要实现这个目的,需要再执行一行指令:

sudo chmod g+s /storage

到这一步就完成了权限的配置了。最后再照着下面的指令更改/etc/samba/smb.conf的内容:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak    #备份配置文件

sudo nano /etc/samba/smb.conf

# 用编辑器打开smb.conf后,默认设置什么都不用改,直接跳到最末端,新建以下内容:

[storage]

comment = Ubuntu File Server    # 对共享文件夹的描述

path = /storage    # 共享文件夹路径

available = yes    # 是否可用

valid users = @ftp    # @ftp指ftp这个组,如果是用户则不需@,多个用户用空格隔开

read only = no    # 是否只读

browsable = yes    # no的话打开共享路径时将看不到文件夹,只能通过输入路径访问

writable = yes    # 是否可写

hide unreadable = yes    # 此项为可选,如没有,将看到一个名为lost+found的文件夹

# 保存退出后,重启服务:

sudo restart smbd

现在去Windows下->运行->\\192.168.1.XX(Ubuntu的IP地址)

应该能看到storage的文件夹,进入后尝试创建新文件,如果一切正常,那么共享就完成了。


之前将storage文件夹(背后是挂载的整块新硬盘)通过samba服务与Windows共享。之所以先共享,是为了完成FTP后方便文件管理。

软件:vsftpd

目标:让用户登录FTP后可以上传文件(主要用于iPhone照片备份),不同用户备份在各自的文件夹下。Windows下打开共享的storage文件夹可以看到这些备份。高级一点的话,用户之间设置一下权限,不能相互读写(我个人不需要这个设定)。

第一步,安装vsftpd

sudo apt-get install vsftpd

第二步,在storage下为xin和gong两个用户各自创建一个文件夹

sudo mkdir /storage/xin

sudo mkdir /storage/gong

然后修改用户默认文件夹路径

sudo usermod -d /storage/xin xin

sudo usermod -d /storage/gong gong

第三步,编辑/etc/vsftpd.conf配置文件

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak    # 编辑前先备份

sudo nano /etc/vsftpd.conf

# 找到以下几行代码,把前面的注释符删除(井字键)

write_enable=YES

chroot_local_user=YES  

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

# 搜索umask,找到下面一行代码,将内容改为002

# 022将保留755权限,002保留775,默认是077的值,即上传文件只给700权限

local_umask=002

# 滚动到最末端,加入下面一行内容

allow_writeable_root=YES    # 注意,writeable这个词有字母e,不是我笔误

# 保存退出

第四步,编辑/etc/vsftpd.chroot_list文件(就是前一步定义的用户配置文件)

sudo nano /etc/vsftpd.chroot_list

# 正常情况下,这个文件里是没有内容的,是一个新文件。

# 将所有ftp用户的名字逐一写在该文件中,一行一个名字。最后保存退出。

第五步,重启服务

sudo service vsftpd restart