标题本想使用关键词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文件服务器+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)。
上面准备工作完成后,接下来是给服务器添加硬盘。
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
然后会询问分区类型和分区数量等,我这里都采用默认设置,即直接按回车就好,以下为截图:
上面的参数是把整块新硬盘设置为一个大的分区,但这些设置尚未生效,我们还要在最后确认一次
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级别会需要相当时间,请耐心等待。
完成后会看到:
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)
注:以上图片上传到红联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