配置家用 NAS 服务器

服务器采用占美主机(N3150/4G RAM/64G SSD)外挂 USB 硬盘柜。该方案和普通 NAS 主机或 Gen8 服务器相比,具有功耗低、易扩展的优点。

本来想使用 ESXi 虚拟技术,但是 ESXi 不支持 N3150 的 Braswell 架构。此外,考虑到主机本身配置不高,承担虚拟机开销的损耗显得并不划算。

实现目标

安装系统

第一次安装 Ubuntu 失败,创建分区时提示错误:『尝试将SCSI(0, 0, 0) , 第一分区(sda)设备上的一个vfat文件系统挂载到/boot/efi上失败,您可以返回分区菜单重新进行分区。』,原因不明。而后改为安装 CentOS 成功。

下载镜像

下载最新版 CentOS 安装镜像文件。这里选择 Minimal ISO

创建安装盘

Windows 下使用 Rufus 制作 USB 启动盘。

安装

插入 U 盘后启动系统,按照提示完成系统安装。

基础配置

安装基础软件

shellyum install -y wget telnet net-tools nano lm_sensors smartmontools httpd yum-utils python-pip unzip

添加第三方软件库

shellyum install -y epel-release
yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

升级内核

默认安装的 Centos 7 的内核版本是 3.x,实在太低了。从 elrepo 源安装最新的稳定版内核:

shellyum --enablerepo=elrepo-kernel install kernel-ml

也可以安装 kernel-lt。其中的 “ml” 代表 “mainline stable”,“lt” 代表 “long term support”。“lt” 的版本比较低,现在只有4.4,很多新特性无法使用,所以安装 “ml” 版本。最新的 “ml” 版本是 4.19。

默认启动新内核:

shellgrub2-set-default 0
reboot

删除旧内核:

shellyum -y remove kernel kernel-tools

网络优化

开启 bbr 拥塞算法(内核版本4.9及以上):

shelltee -a /etc/sysctl.conf <<-EOF
  net.core.default_qdisc=fq
  net.ipv4.tcp_congestion_control=bbr
  EOF
sysctl -p

SSD 优化

禁用文件最后访问时间

编辑配置文件 /etc/fstab,为其中所有 xfs 的分区添加挂载参数。 将类似以下的配置

......    xfs   defaults   0 0

改为

......    xfs   defaults,noatime,nodiratime   0 0    

启用 Trim

开启 fstrim 服务:

shellsystemctl enable --now fstrim.timer

或者定期执行任务:

shellfstrim /
fstrim /home
fstrim /boot

不推荐使用 Online Discard,即在 /etc/fstab 中添加 discard 选项。

限制交换分区的使用

添加系统参数:

shelltee -a /etc/sysctl.conf <<-EOF
  vm.swappiness=1
  vm.vfs_cache_pressure=50
  EOF
sysctl -p

优化 I/O 调度器

在启动脚本中运行:

shellecho deadline > /sys/block/sda/queue/scheduler

或者,创建文件 /etc/udev/rules.d/60-ssd-scheduler.rules,包含内容:

ini# set deadline scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sda", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"

使用 tmpfs 保存临时文件

shellsystemctl enable --now tmp.mount

启动脚本

系统启动脚本 rc.local 默认不可执行。运行命令开启:

shellchmod +x /etc/rc.local

挂载外接硬盘

假设外置磁盘设备路径为 /dev/sdb。编辑配置文件 /etc/fstab,添加如下行:

/dev/sdb    /data    ext4    defaults,nofail    0  0

安装软件

Webmin

下载最新版 rpm 安装包。

shellrpm --import http://www.webmin.com/jcameron-key.asc
rpm -ivh webmin-*.rpm

如果提示缺少 Perl(Net::SSLeay) 则用以下命令安装:

shellyum install -y perl-Net-SSLeay

添加防火墙规则:

shellfirewall-cmd --zone=public --add-port=1000/tcp --permanent
firewall-cmd --reload

防火墙规则亦可以通过 Webmin 的 FirewallD 模块进行添加。

Cockpit

shellyum install cockpit
systemctl enable --now cockpit.socket
sudo firewall-cmd --permanent --zone=public --add-service=cockpit
sudo firewall-cmd --reload

Samba Server

安装:

shellyum install -y samba

开启服务:

shellsystemctl enable --now smb.service
systemctl enable --now nmb.service

添加防火墙规则:

shellfirewall-cmd --zone=public --add-service=samba --permanent
firewall-cmd --reload

修改配置文件:

shellsudo nano /etc/samba/smb.conf

内容为:

ini[global]
        workgroup = WORKGROUP
        security = user

        passdb backend = tdbsam

[data]
        comment = Shared Directories
        path = /data
        public = yes
        browseable = yes
        writable = no
        #create mask = 0777
        #directory mask = 0777
        #force directory mode = 0777
        #force create mode = 0777

添加 Samba 用户:

shellpdbedit -a samba_user

另外,在默认情况下,SELinux会阻止通过Samba访问本地文件系统。方法一是用命令setenforce 0关闭SELinux,或者执行命令:

shellchcon --reference=/etc/samba/smb.conf -R /data

Aria2 & YAAW

shellyum install -y aria2

Plex Media Server

下载最新版的 rpm 安装包。

# rpm -ivh plexmediaserver-*.rpm
# systemctl start plexmediaserver.service

添加防火墙规则:

shellfirewall-cmd --zone=public --add-port=32400/tcp --permanent
firewall-cmd --reload

访问 http://<服务器地址>:32400/web 进行设置。

其他媒体中心服务有:Kodi, Emby

iSCSI Target

shellyum install -y scsi-target-utils
systemctl enable --now tgtd.service

MiniDLNA

shellyum install -y minidlna

编辑配置文件 /etc/minidlna.conf

iniport=8200
media_dir=/data/media   # 设置媒体文件路径
db_dir=/var/cache/minidlna
inotify=yes

启动服务:

shellsystemctl enable --now minidlna.service

添加防火墙规则:

shellfirewall-cmd --zone=public --add-port=1900/udp --permanent
firewall-cmd --zone=public --add-port=8200/tcp --permanent
firewall-cmd --reload

访问 http://<服务器地址>:8200/ 返回信息则表示服务成功运行。

如果服务没有正常启动,可能是软件缺少相关的依赖库。尝试运行如下命令来获取错误信息:

shellminidlnad -f /etc/minidlna.conf

此处报错信息为:error while loading shared libraries: libva.so.1。安装依赖库:

yum install -y libva

ownCloud

下载最新版的 rpm 安装包。

Xfce

shellyum groupinstall -y "X Window System"
yum groupinstall -y xfce

安装中文字体:

shellyum install -y wqy-*

切换开机进入图形模式:

shellsystemctl set-default graphical.target

或切换开机进入命令行模式:

shellsystemctl set-default multi-user.target

命令行模式下,手动进入图形模式:

shellstartx
init 5

shell# systemctl isolate graphical.target

安装中文输入法:

shellyum install im-chooser
yum install ibus-libpinyin

VNC Server

安装:

shellyum install -y tigervnc-server

启动:

shellvncserver

由于使用 Xfce 桌面,还需要修改启动脚本 ~/.vnc/xstartup

bash#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc
exec /bin/sh /etc/xdg/xfce4/xinitrc

重启服务后能正常登录。

添加防火墙规则:

shellfirewall-cmd --zone=public --add-service=vnc-server --permanent
firewall-cmd --reload

PHP

由于默认安装的版本只有 5.4,非常陈旧。建议安装 PHP 5.6 或者 PHP 7。此处安装 PHP 7:

shellyum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php73
yum install -y php

MySQL(MariaDB)

安装 MariaDB:

shellyum install -y mariadb

默认安装的版本只有 5.5,比较陈旧。建议从官网下载最新版本。此处以安装 MariaDB 10.1 Stable 为例,创建文件 /etc/yum.repos.d/mariadb.repo,内容如下:

ini# MariaDB 10.1 CentOS repository list
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

安装:

shellyum install -y MariaDB-server MariaDB-client

或者下载 rpm 安装包手动安装。

运行:

shellsystemctl start mariadb.service

如果无法启动服务,运行 journalctl -xe 查看错误。此处显示错误为:error while loading shared libraries: libjemalloc.so.1: cannot open shared object file: No such file or directory

安装依赖库:

shellyum install -y jemalloc

重新安装 MaraiDB:

shellyum remove -y MariaDB-server
rm -rf /var/lib/mysql
yum install -y MariaDB-server

添加防火墙规则:

shellfirewall-cmd --zone=public --add-service=mysql --permanent
firewall-cmd --reload

OpenVPN

先安装 OpenVPN 和 EasyRSA:

shellyum install -y openvpn easy-rsa

第一步,生成证书

将 EasyRSA 脚本复制到 OpenVPN 的配置目录下:

shellmkdir -p /etc/openvpn/easy-rsa/keys
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

编辑文件 /etc/openvpn/easy-rsa/vars,修改或新增如下配置:

bashexport EASY_RSA="/etc/openvpn/easy-rsa"
export KEY_SIZE=2048
export KEY_NAME="server"

此处 KEY_NAME 也可以取其他的名字。另外可酌情修改如下的配置信息:

bashexport KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="[email protected]"
export KEY_OU="MyOrganizationalUnit"
export KEY_CN="CommonName"

在创建证书前,先导入变量:

shellcd /etc/openvpn/easy-rsa
source ./vars

执行清理工作:

shell./clean-all

创建 CA 证书:

shell./build-ca

如果创建成功,会在 /etc/openvpn/easy-rsa/keys 路径下生成 ca.crtca.key 两个文件。其中 ca.key 文件需要妥善保存不能泄露。

创建服务器证书:

shell./build-key-server server

此处的脚本参数 server 就是之前设置的 KEY_NAME。创建成功后会在 /etc/openvpn/easy-rsa/keys 路径下生成 server.crtserver.key 两个文件。

创建 Diffie-Hellman key exchange:

shell./build-dh

这步操作耗时比较久,耐心等待几分钟。执行完毕后,会在 /etc/openvpn/easy-rsa/keys 路径下生成 dh2048.pem 文件。

创建客户端证书:

shell./build-key client

创建成功后会在 /etc/openvpn/easy-rsa/keys 路径下生成 client.crtclient.key 两个文件。

将刚才生成的证书和服务器私钥文件复制到 /etc/openvpn 目录下:

shellcd keys/
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

第二步,配置 OpenVPN 服务器:

复制配置文件样本:

shellcp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

默认配置文件样本无须做任何修改便可使用。为了确保配置的正确性,打开配置文件 /etc/openvpn/server.conf,确认存在如下配置:

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

第三步,配置 Dnsmasq

编辑配置文件 /etc/dnsmasq.conf,编辑或添加如下配置:

inilisten-address=0.0.0.0
bind-interfaces

重启服务:

shellsystemctl restart dnsmasq.service

第四步,开启路由功能

运行命令检查路由功能是否已开启:

shellcat /proc/sys/net/ipv4/ip_forward

如果命令显示 1,说明路由功能已被开启,否则手动开启:

shellecho 1 > /proc/sys/net/ipv4/ip_forward

或编辑配置文件 /etc/sysctl.conf,修改或添加如下配置:

ininet.ipv4.ip_forward=1

运行命令使更改生效:

inisysctl -p

添加防火墙规则:

shellfirewall-cmd --zone=external --add-masquerade

第五步,启动服务

运行命令:

shellsystemctl enable --now [email protected]

第六步,配置客户端

最后,添加防火墙规则:

shellfirewall-cmd --zone=public --add-service=openvpn --permanent
firewall-cmd --reload

Docker

安装必要的组件:

shellyum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2

设置软件仓库:

shellyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker:

shellyum install -y docker-ce

添加系统参数:

shelltee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p

开启服务:

shellsystemctl enable --now docker

检查安装是否正确:

shelldocker info

运行测试:

shelldocker run hello-world

无线上网

shellnmtui

(待续)