自己动手丰衣足食,用CentOS搭建NAS服务器

avatar
作者
猴君
阅读量:1

旧帖新发,所以操作系统版本有点老,不过操作完全没有过时,本人的NAS服务器已稳定运行5年。
NAS对于电脑性能要求很低,家庭环境如果要考虑噪音,则建议选用静音主板和电源。

本文面向Linux小白,所以高手请直接略过。

一、安装CentOS 7.6

电脑配置(仅供参考,不低于这个配置的电脑都可以)
-========================================-
主板: 七彩虹 Colorful C.Q1900M 全固态主板
CPU: 内建英特尔赛扬J1900(功耗TDP 15W)
内存: 4GB
SATA扩展卡: 魔羯(MOGE)MC2692 台式机PCIE转4口SATA3.0硬盘扩展卡 (为了接更多硬盘)
系统盘: 希捷 320GB (有条件的可以换成SSD,128GB就足够)
数据盘: 西数蓝盘 4TB x 2
电源: 长城 325W 智控0分贝宽幅节能电源 GW-B425ZN

  1. 下载DVD安装镜像
    http://mirrors.neusoft.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

  2. 在虚拟机中制作U盘安装介质(U盘设备id为 /dev/sdd)
    dd if=/mnt/hgfs/sharedfiles/CentOS-7-x86_64-DVD-1810.iso of=/dev/sdd

  3. 使用U盘启动,图形化安装
    3.1 选择时区,设置时间
    3.2 语言选“中文-简体中文(中国)”
    3.3 安装源为“本地介质”,软件选择为“最小安装” (均为默认)
    3.4 安装位置选320GB硬盘,一定选择“我要配置分区”,点击“完成”

    - 进入手动分区的界面,删除磁盘上所有旧分区, - 将“新挂载点使用以下分区方案”改为“标准分区”(旧系统盘不用考虑扩容,标准分区比LVM管理简单), - 点击“点这里自动创建它们”, - 删除自动创建的 /home 分区, - 修改 / 分区,将 /home 分区释放的空间增加到 / 分区上,文件系统最好是 xfs, - 点击“完成”。 

    3.5 禁用KDUMP(没什么用)
    3.6 开始安装
    3.7 设置root密码,创建新用户(如bob)。

  4. 等待安装完成并重启进入系统

二、基本环境配置

  1. 安装vim
$ yum install vim $ vim /etc/vimrc --添加以下内容(使用习惯)--------------------- set cindent         " ci  C语言语法缩进 set expandtab       " et  输入时用space替换tab set shiftwidth=4    " sw  缩进时使用4个字符宽度 set tabstop=4       " ts  显示tab字符时用4个字符宽度 set softtabstop=4   " sts 输入tab字符时用4个字符宽度 set ignorecase      " ic  查找时忽略大小写 set nowrap          "     显示时不折行 set number          " nu  显示行号 ----------------------------------------------------------- 
  1. 禁用selinux
$ vim /etc/selinux/config --修改以下参数--------------------- SELINUX=disabled ----------------------------------------- $ setenforce 0 
  1. 将用户bob设置为sudoer
$ vim /etc/sudoers --添加一行bob的设置------------------------------------ ## Allow root to run any commands anywhere  root    ALL=(ALL)   ALL bob    ALL=(ALL)   ALL ---------------------------------------------------------------- 
  1. 禁止root直接从ssh登录
$ vim /etc/ssh/sshd_config --修改以下参数--------------------- PermitRootLogin no ----------------------------------------- $ systemctl restart sshd 
  1. 修改硬件时间为本地时间(默认是UTC时间)
$ hwclock --systohc --localtime 查看 $ hwclock --debug 
  1. 设置开机时网卡自动激活(下面命令中的xxxx要看自己的网卡到底叫什么)
$ vim /etc/sysconfig/network-scripts/ifcfg-xxxx --修改以下参数---------------------- ONBOOT=yes ------------------------------------------ 
  1. 修改打开文件数限制,默认1024,最大可改成65535
$ vim /etc/security/limits.conf -- 在末尾添加以下两行------------ *  soft    nofile          2048 *  hard    nofile          2048 ------------------------------------------ 用户重新登录后有效。执行 ulimit -a 查看。 

三、安装ntfs-3g

$ wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz $ tar zxf ntfs-3g_ntfsprogs-2017.3.23.tgz $ cd ntfs-3g_ntfsprogs-2017.3.23 $ ./configure 会报错,没有编译器 $ yum install gcc $ ./configure $ make  $ make install  然后就可以用 mount -t ntfs-3g /dev/sdd1 /mnt/usb 加载ntfs盘的数据了。 

四、创建RAID1

  1. 确定两块4TB硬盘的设备号
$ fdisk -l 找到两块硬盘分别是 /dev/sdb、/dev/sdc 
  1. 给硬盘分区
    因为硬盘大于2TB,需要创建GPT分区,使用parted命令
[root@localhost]# parted /dev/sdb GNU Parted 3.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt (parted) mkpart primary 0% 100%     ——这里一定要用0%,否则会有一个性能警告 (parted) toggle 1 raid (parted) select /dev/sdc Using /dev/sdc (parted) mklabel gpt (parted) mkpart primary 0% 100% (parted) toggle 1 raid (parted) quit Information: You may need to update /etc/fstab. 
  1. 安装软RAID管理软件mdadm
$ yum install mdadm 
  1. 创建RAID1
$ mdadm --create /dev/md0 -ayes -l1 -n2 /dev/sd[b,c]1 mdadm: Note: this array has metadata at the start and     may not be suitable as a boot device.  If you plan to     store '/boot' on this device please ensure that     your boot-loader understands md/v1.x metadata, or use     --metadata=0.90 Continue creating array? yes mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. 
  1. 查看状态
$ cat /proc/mdstat $ mdadm -D /dev/md0 

可以看到还在 resyncing ,不影响后续操作。

  1. 格式化并mount RAID
$ mkfs.xfs /dev/md0 $ mkdir /mnt/data $ mount /dev/md0 /mnt/data $ df -h 

能看到这一行:

/dev/md0                           4.0T   33M  4.0T   1% /mnt/data 

测试写入:

$ cd /mnt/data $ echo test > test.txt $ cat test.txt 

添加到 fstab

$ vim /etc/fstab --增加一行---------------------------------- /dev/md0        /mnt/data       xfs     defaults        0 0 ------------------------------------------------ 
  1. 创建配置文件
$ echo DEVICE /dev/sd{b,c}1 >> /etc/mdadm.conf $ mdadm -Evs >> /etc/mdadm.conf 
  1. 解决CentOS关机时等待RAID的问题
    CentOS有个Availability of block devices服务,关机时会等待RAID,但超时时间只有1分30秒。
-- /usr/lib/systemd/system/blk-availability.service 文件中可以看到-------------------------- ExecStop=/usr/sbin/blkdeactivate -u -l wholevg -m disablequeueing -r wait ---------------------------------------------------------------------------------------------------------------- 
-- 查看 man blkdeactivate 可以看到-----------------------------------------------------------------        -r, --mdraidoptions mdraid_options               Comma-separated list of MD RAID specific options:                wait   Wait MD device's resync, recovery or reshape action to complete before deactivation. --------------------------------------------------------------------------------------------------------------- 

简单说,我们的数据盘很大,RAID要做完 resyncing 要很久,如果这个时候关机,系统貌似想等RAID完成工作,但1分30秒后系统等不及了,就直接杀进程关机了。(这个时候我们执行 mdadm --wait 也会发现命令不会返回)。下面是解决办法:

$ vim /usr/sbin/stopraid.sh  -- stopraid.sh ----------------------------------------------------------------------- #!/bin/bash /bin/umount /dev/md0 /usr/sbin/mdadm --stop /dev/md0 ----------------------------------------------------------------------------------------- $ chmod a+x /usr/sbin/stopraid.sh 

创建 /usr/lib/systemd/system/raid-availability.service 服务,在blk-availability.service停止之前先停止。

-- raid-availability.service ------------------------------------------------------- [Unit] Description=RAID Availability After=blk-availability.service Requires=blk-availability.service DefaultDependencies=no Conflicts=shutdown.target  [Service] Type=oneshot ExecStart=/usr/bin/true ExecStop=/usr/sbin/stopraid.sh RemainAfterExit=yes  [Install] WantedBy=sysinit.target ----------------------------------------------------------------------------------------- $ systemctl daemon-reload $ systemctl start raid-availability.service $ systemctl enable raid-availability.service  $ reboot  就不会看到 Availability of block devices 的等待信息了。 

五、启用RAID监控、模拟故障并恢复

  1. 设置监控报警邮箱
$ vim /etc/mdadm.conf -- 最后增加一行------------------------------------------------------------------- MAILADDR bob@somewhere.com ---------------------------------------------------------------------------------------- 

系统默认已经安装了邮件发送软件mailx,确认一下

$ yum list installed | grep mailx libreport-plugin-mailx.x86_64           2.1.11-40.el7.centos           @base     mailx.x86_64                            12.5-19.el7                    @base   

系统已经默认启动了mdmonitor.service,它的定义文件中有一行 ConditionPathExists=/etc/mdadm.conf

$ systemctl | grep mdmonitor ● mdmonitor.service                                                                                             loaded failed failed    Software RAID monitoring and management $ systemctl restart mdmonitor.service $ systemctl | grep mdmonitor   mdmonitor.service                                                                                             loaded active running   Software RAID monitoring and management 

发个邮件试试

$ mdadm --monitor --scan --test --oneshot 

正常的话bob@somewhere.com会收到一封测试消息的邮件

说明:有的帖子里说要在crontab里增加一行命令才能实现持续监控,但参数里又是 --oneshot。其实是不对的。
系统本来就有 mdmonitor.service 了,只要在/etc/mdadm.conf中添加了收件人邮箱地址,就会发送告警邮件,默认每60秒检查一次。看看 mdmonitor.service 的内容:

------------------------------------------------------------------ [Unit] Description=Software RAID monitoring and management After=syslog.target ConditionPathExists=/etc/mdadm.conf  [Service] Type=forking PIDFile=/var/run/mdadm/mdadm.pid Environment= MDADM_MONITOR_ARGS=--scan EnvironmentFile=-/etc/sysconfig/mdmonitor ExecStart=/sbin/mdadm --monitor $MDADM_MONITOR_ARGS -f --pid-file=/var/run/mdadm/mdadm.pid  [Install] WantedBy=multi-user.target ------------------------------------------------------------------ 

上面 -f 参数等价于 --daemonise,以守护进程方式运行。

  1. 模拟阵列中一块硬盘故障
$ mdadm /dev/md0 --fail /dev/sdc1 mdadm: set /dev/sdc1 faulty in /dev/md0 $ cat /proc/mdstat Personalities : [raid1]  md0 : active raid1 sdc1[1] sdb1[0](F)       4194169856 blocks super 1.2 [2/1] [U_]       bitmap: 27/32 pages [108KB], 65536KB chunk  unused devices: <none> 

可以看到 [U_],表示 sdc1 故障了,正常是 [UU]

$ mdadm -D /dev/md0 

可以看到更详细信息

这个时候,Bob又收到一封邮件。

  1. 模拟移出硬盘,更换后重新添加到阵列
$ mdadm /dev/md0 --remove /dev/sdc1 mdadm: hot removed /dev/sdc1 from /dev/md0 $ mdadm /dev/md0 --add /dev/sdc1 mdadm: re-added /dev/sdc1 $ mdadm -D /dev/md0 

可以看到RAID在自动重建数据

State : clean, degraded, recovering spare rebuilding   /dev/sdc1 
  1. 系统盘故障重组阵列
$ mdadm -A --scan 然后重新按之前的方法生成mdadm.conf,或者直接复制以前的mdadm.conf 

六、安装配置Samba服务

  1. 安装samba并启动服务
$ yum install samba $ systemctl start smb $ systemctl enable smb 
  1. 打开防火墙
$ firewall-cmd --zone=public --add-port=139/tcp --permanent $ firewall-cmd --zone=public --add-port=445/tcp --permanent $ systemctl restart firewalld.service 
  1. 添加用户组和用户
$ groupadd family $ useradd -g family alice  $ passwd alice 

建议将用户目录转移到RAID盘上,此处不再赘述。
说明:之前创建的用户bob并不属于family组,下面会把他作为一个特殊用户。

  1. 设置用户的Samba密码(密码文件位置:/var/lib/samba/private/passdb.tdb)
$ smbpasswd -a alice 
  1. 修改配置文件(关键)
    规划如下:
    • 所有人(包括Guest)都能读取目录PublicFiles
    • 只有用户bob和@family组所有用户都能读取目录SharedFiles
    • 只有用户bob对SharedFiles有写权限
    • 每个用户对自己的个人目录都有完全的读写权限
$ vim /etc/samba/smb.conf -- 以下不解释,可 man smb.conf 查看具体含义------------------------------- [global] #   workgroup = SAMBA     workgroup = WORKGROUP     security = user      passdb backend = tdbsam      printing = cups     printcap name = cups     load printers = yes     cups options = raw      # enable soft-link access     follow symlinks = yes     wide links = yes     unix extensions = no  # customized     server string = Home Samba Server %v     netbios name = HomeSamba     map to guest = Bad User     hosts allow = 192.168.1.0/255.255.255.0     max connections = 20     deadtime = 10  [homes]     comment = Home Directories     valid users = %S, %D%w%S     browseable = No     read only = No     inherit acls = Yes  [PublicFiles]     comment = PublicFiles     path = /data/PublicFiles     guest ok = yes     read only = yes  [SharedFiles]     comment = SharedFiles     path = /data/SharedFiles     guest ok = no     read only = yes     valid users = bob,@family     read list = @family     write list = bob -------------------------------------------------------------------------------------------------  $ systemctl restart smb 
  1. 启用NETBIOS名字解析(否则只能用IP访问)
$ systemctl enable nmb.service $ systemctl start nmb.service $ firewall-cmd --add-port=137/udp --zone=public --permanent $ firewall-cmd --add-port=138/udp --zone=public --permanent $ systemctl restart firewalld 
  1. 访问方法
    Win+e 打开文件资源管理器,在地址栏里输入 \xxx.xxx.xxx.xxx 即可
    或者 \HOMESAMBA

  2. 记录一个坑:在路由器中为服务器绑定IP地址
    如果用无线路由器 桥接 组网,要注意路由器桥接协议是否支持“4地址”格式。
    TP-LINK WDR7660/7661等路由器都是“3地址”格式,导致主路由无法识别从路由上连接的设备的真实MAC,因而无法为从路由上的设备绑定IP。

    目前我只知道WDR6500支持“4地址”格式,另外客服告知WDR7800也支持“4地址”。
    关于“3地址”与“4地址”,可参考 https://service.tp-link.com.cn/detail_article_3291.html

    update 20210621: 当前在售支持四地址格式的路由为AX5400和AX6000。

七、为用户目录设置限额

  1. 系统默认已经安装了quota
$ yum list installed | grep quota quota.x86_64                           1:4.01-17.el7                   @base quota-nls.noarch                       1:4.01-17.el7                   @base 
  1. 修改mount参数(这里只对用户做限额,不对用户组做限额)
$ vim /etc/fstab --增加 usrquota,grpquota---------------------------------- /dev/md0              /mnt/data          xfs     defaults,usrquota   0 0 ------------------------------------------------------------------- $ umount /data $ mount /data 
  1. 因为是xfs,不用做quotacheck

  2. 设置用户alice的配额为100GB

$ edquota -u alice -- 把blocks的soft与hard都改成100*1024*1024=104857600(单位为KB) ----------- Disk quotas for user alice (uid 1001):   Filesystem                   blocks       soft       hard     inodes     soft     hard   /dev/md0                          8  104857600  104857600          7        0        0 ------------------------------------------------------------------------------------------------------------- 
  1. 开启配额
$ quotaon -avu 
  1. 验证
$ mount -t cifs -o user=alice,password='password_of_alice' //192.168.1.123/alice /mnt/usb $ df -h Filesystem            Size  Used Avail Use% Mounted on //192.168.1.123/alice  100G  8.0K   100G   1% /mnt/usb 

[END]

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!