配置家用 NAS 服务器
服务器采用占美主机(N3150/4G RAM/64G SSD)外挂 USB 硬盘柜。该方案和普通 NAS 主机或 Gen8 服务器相比,具有功耗低、易扩展的优点。
本来想使用 ESXi 虚拟技术,但是 ESXi 不支持 N3150 的 Braswell 架构。此外,考虑到主机本身配置不高,承担虚拟机开销的损耗显得并不划算。
实现目标
- VPN
- 加速代理
- 视频点播
- 私有云
- 开发环境
安装系统
第一次安装 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.crt
和 ca.key
两个文件。其中 ca.key
文件需要妥善保存不能泄露。
创建服务器证书:
shell./build-key-server server
此处的脚本参数 server
就是之前设置的 KEY_NAME
。创建成功后会在 /etc/openvpn/easy-rsa/keys
路径下生成 server.crt
和 server.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.crt
和 client.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
(待续)