明确需求

  1. 无公网IPv4,仅公网IPv6,需求外网拜访
  2. 现在存储需求不强,且预算有限,硬盘组合是10t 4t 4t 2t,需求在确保冗余的同时供给灵活的扩展性
  3. 缓存加快,首要针对机械硬盘的小文件读写优化
  4. 手机文件同步,首要针对手机体系备份和录音
  5. 相册同步
  6. 需求具备根本的网络安全保障
  7. 按需扩展影音功用

解决方案

每条对应于上一节的需求:

  1. 运用DDNS,外网运用域名拜访即可
  2. 存储上拆分10t的硬盘,4t 6t组合作为校验盘,考虑到snapraid14,可暂时先只用6t做校验盘,4t校验盘当数据盘运用,此时的数据盘为4t 4t 4t 2t,其中一个4t10t分出来的,本人情况是2t的盘检测有错误,随时挂掉。这个分出来的4t虽然有冗余可是和校验盘是同一个物理盘,冗余功用是无法确保的,禁止存放重要数据
  3. 缓存加快运用bcache,随意加了一块120G的固态作为缓存盘
  4. 手机文件同步运用nextcloud,不必seafile是由于后者免费版没有查找功用至于阉割这种功用吗?这么抠搜
  5. 相册同步运用immich,现在运用开发活泼,更新较快,主张锁死版别运用
  6. 运用拜访层面运用防火墙过滤拜访源,体系的ssh运用key登录
  7. 影音功用首要为jellyfin或许挑选emby
    上述除了bcachesnapraid是体系层面的运用需求直接装置,其他运用悉数运用docker装置

存储装备

  1. 磁盘装备

    • LVM拆分10t硬盘(sdh)

      # 创立 pv,必须在创立 vg 前
      sudo pvcreate /dev/sdh
      # 运用已有的 pv 创立 vg
      sudo vgcreate nas-vg /dev/sdh
      # 在 vg 中 创立 lv,巨细为 40%,即 4t
      sudo lvcreate -n sp1 -l 40%FREE nas-vg
      # 在 vg 中 创立 lv,运用悉数的剩余空间,即 6t
      sudo lvcreate -n sp2 -l 100%FREE nas-vg
      

      操作完成后磁盘存储便是6t 4t 4t 4t 2t

  2. bcache

    • 装备bcache

      # 装置 bcache
      sudo apt install bcache-tools
      # 铲除原有磁盘,包含缓存盘和后端
      sudo wipefs -a /dev/sdb # 缓存盘
      sudo wipefs -a /dev/sdc # 后端盘 4t
      sudo wipefs -a /dev/sdd # 后端盘 4t
      sudo wipefs -a /dev/sde # 后端盘 2t
      sudo wipefs -a /dev/mapper/nas--vg-sp1 # 后端盘 4t
      # 创立关联
      sudo make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd /dev/sde /dev/mapper/nas-vg--sp1
      

      上述操作履行完成后能够运用sudo bcache-super-show /dev/sdc查看各个盘,每个后端盘的cset.uuid项都是/dev/sdbcset.uuid即表明成功

    • 磁盘分区
      fdisk无法对大于2t的磁盘分区,因而一致运用parted分区

      sudo parted /dev/mapper/nas--vg-sp2
      # print 查看分区
      mklabel gpt
      mkpart
      # start? 1M,  end?  100%
      

      分区后树立文件体系

      sudo mkfs.xfs /dev/mapper/nas--vg-sp2
      

      其他做了缓存加快的盘直接对/dev/bcache{0}树立文件体系即可

    • 优化bcache
      bcache{0} 替换为实践的设备,能够运用 lsblk 查看,cset.uuid 运用 sudo bcache-super-show /dev/sdb 得到

      # 回写战略
      sudo bash -c 'echo writeback > /sys/block/bcache{0}/bcache/cache_mode'
      # Let bcache completely sync with the hard drive,同步战略
      sudo bash -c "echo 0 > /sys/block/bcache{0}/bcache/writeback_percent"
      # Don't let sequential IO bypass the cache,即所有读写都过缓存盘
      # 能够更改为其他数值,默许4M,留意,只能传数字,单位是Byte,4M便是4194304
      sudo bash -c "echo 0 > /sys/block/bcache{0}/bcache/sequential_cutoff"
      # 封闭拥塞控制,指定缓存盘的 cset.uuid,这个是检测读写推迟,大于该值就旁路缓存盘直写
      sudo bash -c "echo 0 > /sys/fs/bcache/{cset.uuid}/congested_read_threshold_us"
      sudo bash -c "echo 0 > /sys/fs/bcache/{cset.uuid}/congested_write_threshold_us"
      
    • 验证bcache

      # 先装置 fio
      sudo apt install fio
      # 随机读写
      # 第一次履行时没有区别,由于没有缓存,第一次今后的成果才是有缓存加快后的速率
      # 机械盘的4k随机读写大概在 300KB/s 左右,4k次序读写大概 1MB/s 左右
      # bcache 加快后,读写依据固态功用不同有差异,
      # 在废物固态上 4k 随机将近 5MB/s,4k 次序大概 6MB/s
      # 4k 随机读写
      sudo fio -filename=/dev/bcache3 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4k -size=5G -numjobs=30 -runtime=8 -group_reporting -allow_mounted_write=1 -name=mytest
      # 4k 次序读写
      sudo fio -filename=/dev/bcache3 -direct=1 -iodepth 1 -thread -rw=rw -ioengine=psync -bs=4k -size=5G -numjobs=30 -runtime=8 -group_reporting -allow_mounted_write=1 -name=mytest
      # 4M 随机读写,参阅含义不大,默许的bcache在这个巨细就旁路了,除非封闭了 sequential_cutoff
      sudo fio -filename=/dev/bcache3 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4m -size=5G -numjobs=30 -runtime=8 -group_reporting -allow_mounted_write=1 -name=mytest
      # 4k 次序读写,参阅含义不大,默许的bcache在这个巨细就旁路了,除非封闭了 sequential_cutoff
      sudo fio -filename=/dev/bcache3 -direct=1 -iodepth 1 -thread -rw=rw -ioengine=psync -bs=4m -size=5G -numjobs=30 -runtime=8 -group_reporting -allow_mounted_write=1 -name=mytest
      
  3. snapraid
    由于bcache的装备需求铲除分区,假如snapraidbcache的基层,则每次增加磁盘后都需求铲除分区,与预期不符,因而snapraid只能在bcache上层装备。

    • 装置
      # ubuntu 20.04 apt 没法直接装置,ppa 源又连不上,只能手动装置
      sudo apt install -y g   make
      wget https://mirror.ghproxy.com/github.com/amadvance/snapraid/releases/download/v12.2/snapraid-12.2.tar.gz
      tar xf snapraid-12.2.tar.gz
      cd snapraid-12.2
      ./configure
      make
      make check
      sudo make install
      
    • snapraid装备

      # 修改装备文件
      # sudo touch /etc/snapraid.conf
      # sync过程主动保存Parity,单位是GB,感觉没什么必要
      autosave 0
      exclude *.unrecoverable
      exclude lost found/
      exclude aquota.user
      exclude aquota.group
      exclude /tmp/
      exclude .content
      exclude *.bak
      exclude /snapraid.conf*
      exclude thumbs/
      # 以实践挂载途径为准,这儿运用DISK{A,B,C,D,E}指代
      parity DISKA/snapraid.parity
      content DISKB/snapraid.content
      content DISKC/snapraid.content
      content DISKD/snapraid.content
      content DISKE/snapraid.content
      data d1 DISKB
      data d2 DISKC
      data d3 DISKD
      data d4 DISKE
      

      装备完成后履行sudo snapraid sync即可开端第一次同步校验

  4. mergerfs
    装备完成后一致挂载途径,方便文件和途径的管理。

    # 装置 mergerfs
    sudo apt install mergerfs
    # 磁盘挂载点,现已挂载的磁盘可不做处理,但主张途径有规则性
    sudo mkdir /ponit2mountpoint/bcache{0,1,2,3}
    sudo mkdir /MFS
    # 修改挂载装备文件,实现开机主动挂载
    # sudo nano /etc/fstab
    # 留意:以下内容要在 /swap.img 所在的行之后
    # ---fstab--start---
    # <file systems> <dir>   <type>  <options>   <dump>   <pass>
    # 要挂载设备      方位    类型     默许即可     备份     fsk查看
    /dev/bcache0   /srv/bcache0      xfs    defaults
    /dev/bcache1   /srv/bcache1      xfs    defaults
    /dev/bcache2   /srv/bcache2      xfs    defaults
    /dev/bcache3   /srv/bcache3      xfs    defaults
    # 分开挂载无效
    /srv/bcache*  /data  fuse.mergerfs defaults,allow_other,minfreespace=10G,fsname=mergerfs,ignorepponrename=true 0 0
    # ---fstab--end---
    sudo mount -a   # 更新挂载
    df -TH  # 查看成果
    # defaults:敞开以下 FUSE 参数以提升功用:atomic_o_trunc, auto_cache, big_writes, default_permissions, splice_move, splice_read, splice_write
    # allow_other:答应挂载者以外的用户拜访 FUSE。你可能需求修改 /etc/fuse.conf来答应这一选项
    # use_ino:运用 mergerfs 而不是 libfuse 供给的 inode,使硬链接的文件 inode 一致
    # minfreespace=10G:挑选往哪个基层文件体系写文件时,越过剩余空间低于 10G 的文件体系
    # fsname=mergerfs:设置文件体系的名称为 mergerfs,也能够自定义其他名字如mount,df等
    # ignorepponrename=true:重命名文件时,不再遵守途径保存准则,保持本来的存储途径
    

    snapraid 一起运用时,多个盘有同名文件 snapraid.content,测试发现同名文件的战略为:

    • mergerfs 途径的文件以磁盘加载次序为准,显现的是第一个加载磁盘的文件,修改其他盘的同名文件,不会产生影响
    • mergerfs 显现第一个加载磁盘的文件,在原始盘上删去该文件后,mergergs 中的文件列表不会更新,依然为删去的文件内容
    • 经过上面的删去文件操作,打开 mergerfs 途径下的文件,修改并保存,内容会覆盖到位于次序加载的下一个磁盘上的同名文件上

运用装备

运用悉数运用docker,主打一个方便省心

  • docker装置

    curl -fsSL https://get.docker.com -o install.sh
    sed -i 's|download.docker.com|mirrors.ustc.edu.cn/docker-ce|g' install.sh
    sudo bash install.sh
    

    root装备

    sudo chown root:docker /var/run/docker.sock
    sudo groupadd docker     # 增加docker用户组,装置docker后一般都现已存在
    sudo gpasswd -a $USER docker     # 将登陆用户加入到docker用户组中
    newgrp docker     # 更新用户组
    docker ps    # 测试docker指令是否能够正常运用
    
  • docker-compose装置
    版别不能太旧,否则后续假如需求nvidia硬解环境时会无法启动

    sudo curl -L "https://mirror.ghproxy.com/github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
    sudo chmod  x /usr/bin/docker-compose
    
  • docker装备
    修改/etc/docker/daemon.json文件,没有则新建

    {
        "experimental": true,
        "ip6tables": true,
        "log-opts": {
            "max-size": "2m"
        },
        "registry-mirrors": [
            "https://docker.nju.edu.cn/"
        ]
    }
    

    日志约束2M巨细,敞开IPv6,镜像拉取运用南京大学镜像站加快,装备完后sudo systemctl restart docker重启服务。敞开IPv6,首要是后期假如运用磁力相关的镜像下载东西时能够运用。

  • DDNS实现外网域名拜访
    镜像:newfuture/ddns
    docker-compose装备:

    version: "3.7"
    services:
      ddns:
        image: newfuture/ddns@sha256:ac3a3942023ccc4f0d16df89ca945161caeec10ab3fd0291481119170ac7a6ea
        container_name: ddns
        restart: always
        volumes:
        - ${DDNS_CONFIG}:/config.json
        environment:
        Ali_Key: ${Ali_Key}
        Ali_Secret: ${Ali_Secret}
        network_mode: host
    

    docker-compose.yml目录下新建.env文件,增加变量

    # 指向一个装备文件,该装备文件被newfuture/ddns镜像需求
    DDNS_CONFIG=path/to/config.json
    

    config.json装备概况:

    {
        "$schema": "https://ddns.newfuture.cc/schema/v2.8.json",
        "id": "********",
        "token": "********",
        "dns": "alidns",
        "ipv4": [],
        "ipv6": ["www.example.com","example.com"],
        "index4": 0,
        "index6": "default",
        "ttl": null,
        "proxy": null,
        "debug": false
    }
    

    上述文件依据实践情况填写,且idtoken较敏感,需求当心保存。更多装备概况能够参阅官方说明
    准备完成后在docker-compose.yml目录下履行docker-compose up -d即可。
    拜访验证

    • 首要docker logs ddns查看日志,查看是否现已成功完成dns解析,同时查看域名供给商比方阿里云dns是否现已有对应的dns记载
    • 服务器不由ping的前提下,在外网ping域名,ping通即可,由于各个dns服务器之间数据改写有推迟,dns解析记载不是当即生效,需求稍等片刻。

安全装备

每个人对安全的需求不同,这儿安全装备仅供参阅。

  • ssh安全

    touch ~/.ssh/authorized_keys
    # 修改ssh装备
    # sudo vi /etc/ssh/sshd_config	
    PubKeyAuthentication yes // 撤销注释,假如没有则新加
    AuthorizedKeysFile .ssh/authorized_keys	// 撤销注释,假如没有则新加
    PasswordAuthentication no // 撤销注释,假如没有则新加
    # 修改文件权限,重要
    chmod 700 -R ~/.ssh/
    chmod 600 ~/.ssh/authorized_keys
    # 重启ssh
    systemctl restart sshd 
    

    将需求连接的主机公钥增加至authorized_keys即可

  • 运用安全
    由于是纯IPv6环境,约束拜访源即可,IPv6的拜访源有必定规则,这儿供给部分地址特征

    电信大众宽带  240e:300::/24、240e:b00::/24
    电信LTE网络   240e:400::/24
    联通大众宽带  2408:8200::/23
    联通LTE网络   2408:8400::/24
    移动大众宽带  2409:8a00::/24
    移动LTE网络  2409:8900::/24
    

    在防火墙上仅放行上述iptcp协议即可,icmp按需放行。
    假如是ip6tables,以下指令仅供参阅:

    sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
    sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    sudo ip6tables -A INPUT -s 240e:300::/24,240e:b00::/24 -j ACCEPT -m comment --comment "电信宽带"
    sudo ip6tables -A INPUT -s 240e:400::/24 -j ACCEPT -m comment --comment "电信LTE"
    sudo ip6tables -A INPUT -s 2408:8200::/24 -j ACCEPT -m comment --comment "联通宽带"
    sudo ip6tables -A INPUT -s 2408:8400::/24 -j ACCEPT -m comment --comment "联通LTE"
    sudo ip6tables -A INPUT -s 2409:8a00::/24 -j ACCEPT -m comment --comment "移动宽带"
    sudo ip6tables -A INPUT -s 2409:8900::/24 -j ACCEPT -m comment --comment "移动LTE"
    sudo ip6tables -A INPUT -j DROP
    

完工

第1期装备到此结束,磁盘装备、缓存装备、挂载装备、运用装备和安全装备都在本期完成装备。NAS的根底现已搭建完成,后续会持续添砖加瓦,将NAS该有的功用都增加进去。本期的内容后续假如发现有遗失,会持续补充。下一期开端根本便是运用的装备了,包含需求的4.5.7点。本期由于需求先将根底功用做好,因而这几点需求的装备分到下一期。