linux-NAS组建笔记 - 草稿

2020-01-16  本文已影响0人  绿箭ML

目的:记录不使用裙,unraid之类的nas系统,利用debian发行版软件包以及一些手机app结合,构建个人的NAS,当然已有基于debian的nas系统,openmediavault,简称OMV

如果是直接使用omv(它实际上是使用了一些debian维护的软件包的基础上开发,使用体验与其他的nas系统差别不大 ,可以把现有的debian系统添加OMV源安装软件后直接启用管理面板)

unas的系统也是基于debian开发的,相对于群晖又或者unraid那种,unas、omv显得集成度低一些,像一些包管理,都是套用现成的软件,使用起来,感觉是拼凑起来的一个NAS套件,当然自由度高一些。

一、概述

硬件组成

NAS拥有的能力

1.网络文件共享
2.通过docker扩展更多容易部署的软件
3.下载
4.视频,音频等媒体服务
7.通过Linux现有的软件包,可以不断扩充nas的功能,例如qemu虚拟机等等,我根据自己需要进行扩展

需要解决的问题

1.电源稳定性。
主机24小时运行,不间断供电,采用家用的后备式小功率UPS(需要支持USB实现UPS和系统联动,外电网断电后配置自动关机),UPS状态邮件通知(光猫、路由器、交换机的供电均经过UPS)

2.文件访问服务
包括:ftp,smb,nfs,Android对smb的支持比较差,使用ftp访问文件速度快一些(手机访问NAS上的文件使用ES文件浏览器),smb为win10提供网络共享访问,nfs为linux主机提供网络共享访问,外网访问使用sftp。

3.访问权限分配
个人nas对权限需求使用Linux上的用户即可满足权限分配,为家庭每个成员分配不同的账户,并且设置不同的访问权限,不同的成员的文件需要文件访问控制。

4.可靠的储存
软RAID采用mdadm管理,磁盘监控使用smartmontools,定期监控硬盘健康状况,并且通过邮件通知。

5.网络拓扑
家用网络采用千兆网络,家庭成员文件备份使用现成的app,暂定为UFile(UFile在自动备份和后台备份做的还是不够好)。个人PC高速访问使用10G光纤直连以获得较好的访问体验。

6.告警提醒
通过mutt+msmtp,实现smtp邮件发送到QQ邮箱及时提醒健康状况。

硬盘储存分配

目前拥有2块2T酷鱼,2块4Twd的紫盘,一块2T移动硬盘,一块16G傲腾M10。

2T酷鱼用于组RAID1,4T监控紫盘用于组RAID0,移动硬盘负责半年一次冷备份。

R0盘用于下载,组R0以提升读写速度,数据主要是媒体,对容错要求不高。
R1盘用于重要资料存储,容量需求不大,求稳为主。
冷备盘定期同步R1盘的内容


二、NAS组建

nas使用mdadm实现软RAID,对于下载,对IO性能有需求的,可以使用bcache让SSD作为机械硬盘的缓写盘,一定程度上提升写入速度。

因为16G的傲腾容量太小了,如果用于缓读意义不大,命中率很低,但是用于缓写可以应付突发性的写入,再缓缓从缓写盘回写到实际的RAID0阵列中去,降低它的IO压力,像下载软件它不一定都是顺序写入,如果下载速度稍微快一些,同一时刻都在写入,读取遇上了瓶颈。以内存->SSD缓存->机械硬盘两级缓存尽可能地减轻爆IO的情况。

但是实际上使用时,效果并没有那么理想,傲腾M10(16g)的顺序写入速度并不高(标称150mb/s),反而可能在顺序上成为瓶颈。


1.硬件管理

mdadm

mdadm是linux软RAID,目前使用软件方案实现RAID来代替RAID卡

mdadm使用教程wiki

 mdadm --create device options...
            创建阵列
       mdadm --assemble device options...
           组装一个阵列
       mdadm --build device options...
            创建或者组装一个阵列,没有元数据的
       mdadm --manage device options...
            管理一个阵列(包括添加硬盘,标记故障硬盘)
       mdadm --misc options... devices
           查看阵列信息
       mdadm --grow options device
           调整阵列的逻辑大小(逻辑大小最大不能超过物理大小)以及调整阵列的级别
       mdadm --incremental device
            add/remove a device to/from an array as appropriate
       mdadm --monitor options...
            监听信息
       mdadm device options...
            Shorthand for --manage.

RAID这里使用了RAID0和RAID1

对于一个磁盘阵列,我应先考虑以下的问题

文档中提示数据丢失更多是因为人为操作的问题,对于阵列的管理,所以我决定先仔细看阵列降级后的恢复操作。

开始创建

为了更容易创建一个阵列设备,我需要阅读以下文档
https://raid.wiki.kernel.org/index.php/A_guide_to_mdadm#Create

文档中提及到一些比较重要的设置
Blocks, chunks and stripes
blocks 目前大部分硬盘的物理扇区都是4K(4096个字节),而逻辑扇区是512,也就是1个物理扇区的大小等于8个逻辑扇区。(因为老硬盘的扇区大小是512字节,应该为了兼容吧,我猜的)
chunks 它是写入阵列的物理设备的连续块的数目,一般情况下是4k的整数倍,RAID5要求是2的幂(2 4 8 16...)
stripes 条带大小,条带是吧数据分割分布到每个盘上,

我先创建的是一个RAID0的阵列,根据文档,RAID0后续可以整形后转换成RAID4/5/6

我的磁盘

NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb           8:16   0   3.7T  0 disk
sdc           8:32   0 232.9G  0 disk
├─sdc1        8:33   0   300M  0 part  /boot/efi
├─sdc2        8:34   0   128M  0 part
├─sdc3        8:35   0    80G  0 part
└─sdc4        8:36   0 152.5G  0 part  /
sdd           8:48   0   1.8T  0 disk
└─md0         9:0    0   1.8T  0 raid1 /xxxxxxx
sde           8:64   0   1.8T  0 disk
└─md0         9:0    0   1.8T  0 raid1 /xxxxxxxx
sdf           8:80   1   3.7T  0 disk
nvme0n1     259:0    0  13.4G  0 disk
└─nvme0n1p1 259:3    0  13.4G  0 part
nvme1n1     259:1    0 238.5G  0 disk
└─nvme1n1p1 259:2    0 238.5G  0 part  /xxxxxxxxx

RAID1盘已经创建完毕,我需要创建一个RAID0盘

sudo mdadm -C /dev/md1 -l raid0 -n 2 /dev/sd[bf]

查看已经创建的RAID0盘

~$ sudo mdadm -D /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Tue Mar 10 15:27:26 2020
        Raid Level : raid0
        Array Size : 7813772288 (7451.79 GiB 8001.30 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Tue Mar 10 15:27:26 2020
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 512K

Consistency Policy : none

              Name :XXXX1  (local to host XXXX)
              UUID : 2d8362db:722fd746:98ca9334:eb8f7026
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       80        1      active sync   /dev/sdf

创建bcache缓存

bcache创建帮助文档:
https://evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt

bcache设备分两种类型(cache device和backing device),cache类型设备是作为缓存的,而backing类型设备则是被缓存的。
创建后需要cache<->backing端设备组合在一起才能缓存。

#不一定需要同时创建cache和backing,可以分开创建,
sudo make-bcache -C /dev/nvme0n1p1 -B /dev/md1 -w 4096 --writeback  --cache_replacement_policy=lru

-C是cache设备,-B是backing设备
-w是指定block size,这里指定的是4096
--writeback 是启用回写策略
--cache_replacement_policy=lru 使用lru算法(可选是fifo或者lru)

如果创建成功,使用bcache-super-show可以查看前后端的设备

#查看cache设备
~ $ bcache-super-show /dev/nvme0n1p1
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 50A68D5F35040EDC [match]
sb.version              3 [cache device]

dev.label               (empty)
dev.uuid                3895b9bf-4ff3-404c-bdc9-8938c5cd8194
dev.sectors_per_block   8
dev.sectors_per_bucket  1024
dev.cache.first_sector  1024
dev.cache.cache_sectors 28127232
dev.cache.total_sectors 28128256
dev.cache.ordered       yes
dev.cache.discard       no
dev.cache.pos           0
dev.cache.replacement   0 [lru]

cset.uuid               5ad1168d-c33f-4881-abaf-aaf9dbf3232d


#查看backing设备,这里是我的R0盘
~ #bcache-super-show /dev/md1
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 4B2E8615DA62EE44 [match]
sb.version              1 [backing device]

dev.label               (empty)
dev.uuid                12e7dd1e-b9d8-4026-b102-dc9dc74e40b8
dev.sectors_per_block   8
dev.sectors_per_bucket  1024
dev.data.first_sector   16
dev.data.cache_mode     1 [writeback]
dev.data.cache_state    1 [clean]

cset.uuid               5ad1168d-c33f-4881-abaf-aaf9dbf3232d

如果cache backing设备已经注册(开机以来只需要注册一次),dmesg查看内核日志,可以看到类似于一下的信息,它会提示cache或者bdev设备注册了。

...
[1377202.762288] bcache: register_cache() registered cache device nvme0n1p1
[1377342.036444] bcache: register_bdev() registered backing device md1

如果它没有注册,可以把块设备的路径回显到/sys/fs/bcache/register

echo /dev/md1 > /sys/fs/bcache/register
echo /dev/nvme0n1p1 > /sys/fs/bcache/register

再次dmesg查看,或者在/sys/fs/bcache/<UUID>生成缓存集的目录,
这里的UUID对应的是cache设备的cset.uuid,例如我的是

/sys/fs/bcache/5ad1168d-c33f-4881-abaf-aaf9dbf3232d

注册backing设备后,会创建/dev/bcacheN这样的块设备,
把cache设备的cset.uuid回显到attach即可把cache关联到bcacheN对应的backing设备。

echo 5ad1168d-c33f-4881-abaf-aaf9dbf3232d > /sys/block/bcache0/bcache/attach

dmesg可以看到以下日志

[1377485.824106] bcache: bch_cached_dev_attach() Caching md1 as bcache0 on set 5ad1168d-c33f-4881-abaf-aaf9dbf3232d

说明现在cache<->backing已经正确关联了,缓存集生效。默认bcache不会缓存顺序写,它会检测128个队列,如果写入大小超过阀值的顺序写入,就会绕开缓存直接写backing设备,这样缓存内并不能获得比较好的顺序写入性能。需要参考文档对bcache的策略进行调整,而且每次重启后需要重新设置(或者写个脚本让它自己设置)

bcache消除

对于缓存盘掉盘,或者别的原因不想再使用bcache,把bcache擦除掉的操作:

使用losetup映射,再确认ext4的头有没有在偏移量为8192的位置,例如sdd为bcache的后端设备,假设映射到/dev/loop0

sudo losetup -o 8192 -f /dev/sdd
sudo tune2fs -l /dev/loop0

如果能识别到文件系统,说明是对的,尝试下挂载到/media/xxoo

sudo mount -t ext4 -o rw,defaults,noatime,offset=8192 /dev/sdd /media/xxoo

如果能顺利挂载,正常,此时我们不需要bcache的头部了,我们要把8192字节的数据擦除

#停止bcache
sudo su
echo 1 > /sys/block/bcache0/bcache/stop
#先备份后端设备的前8192字节的数据
dd if=/dev/sdd of=./bcache.bak bs=8192 count=1 iflag=nocache
# 擦除物理盘上的数据
dd if=/dev/zero of=/dev/sdd bs=8192 count=1 oflag=sync
sync
sync
sync

文件系统

文件系统确定nas上的文件如何组织储存,我使用linux下最常用的ext4文件系统作为nas的数据储存的文件系统

文件系统的管理也包括

ext4

#格式化ext4文件系统
用法:mkfs.ext4 [-c|-l 文件名] [-b 块大小] [-C 簇大小]
        [-i 每inode的字节数] [-I inode大小] [-J 日志选项]
        [-G 弹性组大小] [-N inode数] [-d 根目录]
        [-m 保留块所占百分比] [-o 创始系统名]
        [-g 每组的块数] [-L 卷标] [-M 上一次挂载点]
        [-O 特性[,...]] [-r 文件系统版本] [-E 扩展选项[,...]]
        [-t 文件系统类型] [-T 用法类型] [-U UUID] [-e 错误行为][-z 撤销文件]
        [-jnqvDFKSV] 设备 [块数]


#检查文件系统错误
fsck.ext4 [-panyrcdfktvDFV] [-b 超级块] [-B 块大小]
               [-l|-L 坏块文件] [-C fd] [-j 外部日志]
               [-E 扩展选项]  [-z 撤销文件] 设备



#调整文件系统大小
resize2fs [-d 调试标志] [-f] [-F] [-M] [-P] [-p] 设备 [-b|-s|新大小] [-z 撤销文件]

然后我要对被缓存的媒体盘进行格式化ext4分区

mkfs.ext4 -b 4096 -E stride=512k -E stripe_width=1024k  /dev/bcache0

这里涉及到两个参数
1.stride 要设置成RAID中的chunk_size
2.stripe_width设置成chunk_size * N 其中N是阵列中数据硬盘的数量(不包括校检盘,这里我是2块组RAID0,也就是2)512K * 2 =1024K

stripe相关的参数会对条带类型的RAID读写性能产生影响,RAID0/5等,这里参考mkfs.ext4的manpage里的说明配置。


文件管理

文件管理包括对已备份的文件进行,查找,去重,备份等等,其中涉及到以下命令

文件查找:find
文件查重:fdupes
文件备份:rsync
基于命令行图形化的文件管理器:mc



文件服务

作为一台nas,重点是网络储存服务,应该包含一些常规的文件共享协议,例如smbftpsftp、以及提供一个web UI的文件分享的功能,我利用以下软件满足需求,对应的包名如下

# ftp: vsftp
# sftp:openssh-sftp-server
# smb: samba
# nfs:nfs-kernel-server

我们可以通过docker来快速部署一些比较有趣的服务,例如文件服务相关的,例如私人的网盘,例如有道云、sftp,也可以用来部署各种奇奇怪怪的服务,docker的好处在于方便、干净、快速、一定程度上的隔离。

docker的安装:中文文档

docker存在一些比较优秀的项目,只需要稍微配置就可以使用,非常方便, 例如jellyfin,使得NAS兼职家里的媒体服务器

如果不使用镜像加速,拉起镜像的时候回比较慢,所以安装后需要设置下国内的镜像加速,修改docker镜像加速的源,文件位于/etc/docker/daemon.json

 {
  "registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"]
}

例如拉取filebrowser的镜像

sudo docker pull filebrowser/filebrowser

docker hub 上有大量的镜像,以及可以查看容器启动的配置说明,我们需要通过docker hub上去查询别人打包好的镜像的用法,才能顺利去启动容器。

请不要在公网上开放filebrowser的端口,请勿在公网未备案开方web服务,被扫到可能会封宽带,貌似能打开网页的都算,近年来对于web打击越来越严重,避免被误伤,公网访问nas的方案可以采用sftp,需要注意的是,公网上不要使用默认的ssh或者是ftp的端口,如果密码强度不够,被人家经常扫也是很困扰呢。


下载

同时作为一个nas,它也要具备下载的功能,可以通过transmission实现,但是目前大部分的资源只能通过[P]t来下载,所使用到的客户端就包括tr(transmission)

tr是包括2个部分的,一部分是服务端,一部分是客户端,tr服务端拥有web接口,提供一个WebUI供管理。

安装tr服务端

sudo aptitude install  transmission-daemon

它其实分很多个包
transmission-daemon是服务相关的包,transmission-common包括了webUI所需要的网页文件等(daemon包依赖common包,装daemon包会安装上common包)

TR的汉化和增强

如果只需要一个网页管理页面,就不需要额外装别的软件包了,但是需要做一下webUI的汉化,以及一些功能上的增强,先放上该软件的github地址(TWC)

https://github.com/ronggang/transmission-web-control/blob/master/README.md

可以理解为它给tr的webUI换个皮,但是实际上功能还是tr本身,它并不是TR的 替代品,他只是TR的webUI增强以及汉化。

安装帮助:
https://github.com/ronggang/transmission-web-control/wiki/Linux-Installation-CN

更新完TWC后,需要对TR进行一些个人的配置让TR更适合自己的使用习惯

TR的配置

默认的TR配置目录位于/etc/transmission-daemon/,我并不想使用root用户或者tr默认的用户启动服务,所以在配置文件方面进行改动

1.把服务以xxx用户启动
2.把tr的配置目录放在该用户的~/.config/transmission-daemon 文件夹下
3.改动TR的日志级别为debug

debian10使用systemd作为init程序,TR的systemd启动配置文件位于/usr/lib/systemd/system/transmission-daemon.service,它大概长这样的。默认它使用debian-transmission用户启动,我改成xxx用户,如图。而且需要针对性更改一些选项

更新:不修改service文件,在/etc/default/ transmission-daemon下,可以通过修改OPTIONSCONFIG_DIR也行,效果是一样的。但是如果需要使得特定用户的权限启动tr,则需要设定service的User字段

[Unit]
Description=Transmission BitTorrent Daemon
After=network.target

[Service]
#User=debian-transmission
User=xxx
Group=xxx
Type=notify
ExecStart=/usr/bin/transmission-daemon -f -t --log-debug -g /home/xxx/.config/transmission-daemon
ExecStop=/bin/kill -s STOP $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

注意,修改完毕后,使用sudo systemctl daemon-reload命令重新载入服务配置。然后使用sudo systemc tl restart transmission-daemon重启服务后生效

TR的服务端配置文件在transmission-deamon/settings.json,我需要在/etc/transmission-daemon下复制一份到~/.config/transmission-daemon下进行调整修改。

#创建新的tr配置文件目录
mkdir ~/.config/transmission-daemon

#复制原来的配置文件到新的配置目录
cp  /etc/transmission-daemon.json ~/.config/transmission-daemon

关于settings.json,我需要一份较为详细的帮助手册,我在TR的项目中找到设置帮助文档

settings.json它大概长酱紫的,下面小节根据文档的分类做一些配置上的解释,但是请注意,settings.json所有的条目,都在同一级!!!

{
    "alt-speed-down": 300000,
    "alt-speed-enabled": false,
    ......(中间省略很多)
    "blocklist-enabled": false,
    "blocklist-url": "http://www.example.com/blocklist",
    "cache-size-mb": 512,
    "dht-enabled": true
}

配置文件大体分成以下几个部分,不是所有东西都需要通过改动配置文件来设置,大部分其实默认就可以了,通过查阅手册再根据其他情况去调优。

1.Bandwidth(带宽设置)

这部分包括tr的限速设置(上行,下行限速),例如speed-limit-up-enabled是使用上传限速,同时它对应有个speed-limit-up,关于网速限制的,先不用管,后期可以在webUI的设置里直接设置。

2.blocklist(黑名单)

这部分的也可以不用管,毕竟没用上禁止别人连自己的

3.Files and Locations(文件和路径)

这部分是个配置的重点,他是针对下载存放的目录进行设置,TR允许你临时下载目录和下载完成后的存放目录分开放,TR也可以监视特定的目录中是否有.torrent文件,自动添加任务(酱紫你只要把种子下到这目录它就自己开始下载了),大概有以下选项

重要的三个目录
download-dir: 下载的默认目录

incomplete-dir: 临时下载的目录(启用后,未完成下载的任务在此文件夹,下载完毕后移动到dowload-dir设定的文件夹)(需要启用incomplete-dir-enabled)

watch-dir: 监视种子的目录(如果把.torrent文件扔到这个目录,它会自动监视新文件,并且把该种子添加下载,需要启用watch-dir-enabled)

rename-partial-files: 让还没下载完整的文件添加.part后缀(这个我一般都启用了,方便看到底哪些是还没下完的)

start-added-torrents: 添加种子后自动开始任务,这个默认就是开启的

trash-original-torrent-files: 这个选项是针对watch配置的,如果启用的话,添加到watch文件夹的种子会被自动删除,我一般是启用的。

这类选项主要针对是否自动添加种子以及下载的默认目录的相关配置

#json配置事例,启用临时下载目录,让TR监控种子
#tr下载完成后存放的目录~/download/complete
#tr未下载完成的存放目录~/download/incomplete
#tr监视种子的目录~/download/watch


{  
    ....
    "download-dir": "~/download/complete"
    "incomplete-dir":"~/download/incomplete"
    "incomplete-dir-enabled":true,
    "watch-dir":"~/download/watch",
    "watch-dir-enabled":true,
    "rename-partial-files":true,
    "trash-original-torrent-files":true,
     .....
}

4.Misc(这个能算其他设置么?2333)
5.Peers 和 Peer Port

这个小节的内容也可以在webUI里再设置,启动前可以保持默认
tr有2个重要的端口,一个是webUI(以及rpc)共用的9091端口,主要用于对tr的管理
还有一个端口用于p2p用户之间连接的peer端口,默认是51413,主要用于上传数据,这个端口是需要被外部主机访问到的(公网或者是大内网,公网共容易被访问到),设置该端口后,要在路由器上设置端口映射(或者路由器上开启uPnP服务进行动态映射),把该端口暴露出去

{
"peer-port":51413,    //peer连接的端口
"port-forwarding-enabled":true,    //如果路由器开启了uPnP服务,则设置为true,如果直接设置静态的端口映射,则设置为false
}

tr除了使用静态的peer端口,也可以让peer端口在某个端口范围内随机选择一个(应该是防止部分yunyingshang封杀P2p),有三个相关设置选项

{
peer-port-random-high: 65535,  //随机端口最高只能是65535
peer-port-random-low: 1024,      //随机端口最低从1024开始
peer-port-random-on-start: true   //启用随机端口
}

如果启用了随机端口,应该把这些范围的端口映射出去,或者是路由开启uPnP服务。

{
"bind-address-ipv4":"0.0.0.0",    //peers监听的ip,也就是别人可以从哪个网卡连接叫你,默认是全部,这个是针对ipv4的设置,以下是ipv6,都可以保持默认
"bind-address-ipv6":"::",

}

6.Queuing(下载队列相关设置)

这个小节也可以在webUI里再设置,主要是针对下载上传队列大小的设置,这个小节的设置会影响下载上传的连接性,建议在webUI里设置

7.RPC(远程调用,提供个web接口,这个很重要)

{
"rpc-authentication-required":true,    //用户认证,这个需要开启,对应的rpc-username和rpc-password是用户名和密码
"rpc-username":"xxoo",                  //用户名xxoo
"rpc-password":"xxooxxoo",          //需要修改新密码的时候,直接填入密码,例如xxooxxoo,重新启动服务后,密码会被加密
"rpc-bind-address":"0.0.0.0",      //监听的地址,0.0.0.0代表监听所有所有网卡
"rpc-port":9091,    //rpc监听的端口,也是我们webUI访问的端口
"rpc-url":" /transmission/",    //rpc请求的网址路由,保留默认就行了
"rpc-enabled":true,    //启用rpc,这个是需要开启的
"rpc-host-whitelist":"localhost",    //rpc主机地址的白名单,我们需要把对应的rpc-host-whitelist-enabled关了,不启用白名单
"rpc-host-whitelist-enabled":false,    //关闭rpc主机白名单
"rpc-whitelist":"127.0.0.*,192.168.1.* "    //rpc的IP地址白名单,指定那些主机或者网段的人才能访问tr,如果不需要指定,请把rpc-whitelist-enabled设置为false,多个主机或者网段设置用,隔开
"rpc-whitelist-enabled":true    //默认是启用IP地址白名单的,如果不是在rpc-whitelist内的ip或者网段访问tr是被拦截的
}

8.Scheduling(分享相关配置,例如达到多少分享率就停止分享)

这个小节的内容可以保持默认,在管理界面的设置里设置更加容易。


未完成...··

上一篇 下一篇

猜你喜欢

热点阅读