# truenas(ZFS)

hyper-v运行truenas记录。 (opens new window)

固态硬盘的外置缓存

可以一力降十会,FTL表,Bitmap表会更宽裕,GC触发更少,GC算法效率好得多,理论寿命更长。带外置缓存的固态最重要的是更低的售后期望。

副厂固态硬盘

正片颗粒暴毙概率很小。白片颗粒有较小概率暴毙,而拆机片,黑片,暴毙概率很大。

只要不是颗粒暴毙,即使出现掉盘,健康度下降,一般只要不误操作,并如后文所述做好擦洗,数据完全损失概率较小。

如梵想,移速,海康,七彩虹,朗科,达墨,金士顿,acer宏碁等贴牌,代工厂自有品牌如阿斯加特,光威,金百达,江波龙雷克沙。

除了白片,还会混有拆机片,黑片。存在送测或前几批用好一点的颗粒,之后图穷匕见的现象。这几个牌子我估计就阿斯加特跟雷克沙因为定位相对高一点,可能会好一点。

截止23年8月,说自己是长江颗粒的好赖是白片。

副厂盘除了文件静默损坏概率大,还有可能读冷数据需要纠错,导致速度变慢,系统盘会导致系统响应很慢。

# 固态硬盘必将取代机械硬盘

23年8月长江白片(既第三方封装厂封装的自封片)TLC颗粒消费者能买到的价格约200/TB,假如是QLC白片,价格打8折,那就是160/TB。消费者常买的hc550等机械硬盘,基本在100~130/TB左右。

电子产品价格本质是有多少人摊销,随着机械硬盘不断减产,此消彼长之下,NAS全面换装固态硬盘的时代应该不远了,固态硬盘静音,体积小,优点相当多。

中国将依托闪存弯道超车替代机械硬盘,中国人就应该买长江存储颗粒的固态硬盘。

# 文件静默损坏

固态硬盘出现坏块的概率远高于机械硬盘,从健康度(有多少坏块被备用块替换)就可见一斑。

  • 机械硬盘在其寿命周期内,健康度很少下降,一旦下降,较大概率将“传染”。
  • 固态硬盘的健康度下降贯穿其整个寿命周期,主控也需要强劲的ECC纠错能力。

健康度下降是坏块被备用块替换的正常现象,直觉上只要备用块没用光就没事,但是主控要读取才知道好坏,而纠错能力有上限,超出就会有所谓“文件静默损坏”。用于存储会有大量冷数据处于如好状态,出现静默损坏的概率大增。

# 解决静默损坏:定期数据擦洗(scrub)

定期擦洗校验可以避免文件静默损坏,只要读取过,主控就会替换坏块。

ReFS(win),BTRFS,ZFS,XFS(Linux 5.19+),Bcachefs等文件系统支持数据擦洗。软raid1下,只有磁盘主控报错,才能确定哪份文件是坏的,极端情况下没有校验无法确认哪份镜像是好文件,甚至write hole,而定期擦洗可以保证文件一致性。

ext4或ntfs可以全盘计算CRC32来预热冷数据。

ReFS叫完整性流是可选功能,需要自行开启 (opens new window)

  • btrfs更灵活,但名声不佳,作为单盘文件系统的稳定性还可以。目前btrfs的部分前开发者转进到xfs。

  • Bcachefs发布时间不长,可靠性有待验证。

  • xfs(Linux 5.19+)导入擦洗特性时间较短。

  • zfs灵活性差,一旦出现错误并导致无法挂载的时候,没有方便实用的工具尝试修复,往往只能尝试强制挂载,不排除导致彻底损毁的可能。zfs推荐至少3分之一的校验盘,既2+1;4+2;6+3;

  • 9盘以上,ceph。

必须要定期擦洗,才会发挥功能,**不用就是摆设!**还不如ext4,NTFS稳定!

# 破除机械硬盘可靠性更高的幻境

固态硬盘ECC纠错性能强得多,只要如后文所述定期擦洗数据,基本不会有数据损失。而机械硬盘的健康度“下降预警”几乎一定伴随着数据损失。

常用的12T及以上大小机械硬盘通常是加密的,所谓的可恢复性往往是海市哲楼,即使是能恢复的硬盘也要价不菲。

# 离线移动固态硬盘不适合用于备份

从固态硬盘的特性来看,更适合作为大号u盘,进行临时性的文件转移,不适合用于备份。更不要说固态硬盘需要进行GC,TRIM等操作。

因此有一个算一个,所有的移动固态硬盘,移动固态硬盘盒产品都是对用户数据极端不负责任。三星,WD闪迪,铠侠热衷于推出此类产品,巴不得用户遇到数据丢失的灾难。

已经爆发血的教训:WD闪迪Extreme移动固态硬盘大面积故障 (opens new window),更令人震惊的是,借着解决问题为由,推送新固件扩大战果,WD闪迪牢记使命——以破坏用户数据为己任。

# ZFS,ReFS不是万能的

ZFS与ReFS等新文件系统更多的只是提供了新特性,并不是说他们的安全性有多么强大,不使用他们提供的擦洗功能,其安全性相对ext4,NTFS并没有显著的提升。

ZFS要勤建快照,极端情况下掉电,有可能导致文件全部损毁,有快照至少能回退到快照。

# zfs与ecc内存

zfs开发者Matt Ahrens表示,zfs由内存位翻转引起文件损坏的风险与其他任何文件系统无异。根据网友实测分享 (opens new window),内存位翻转的概率非常低,往往需要重负载。

Matt Ahrens回答 (opens new window): There's nothing special about ZFS that requires/encourages the use of ECC RAM more so than any other filesystem. If you use UFS, EXT, NTFS, btrfs, etc without ECC RAM, you are just as much at risk as if you used ZFS without ECC RAM. Actually, ZFS can mitigate this risk to some degree if you enable the unsupported ZFS_DEBUG_MODIFY flag (zfs_flags=0x10). This will checksum the data while at rest in memory, and verify it before writing to disk, thus reducing the window of vulnerability from a memory error. I would simply say: if you love your data, use ECC RAM. Additionally, use a filesystem that checksums your data, such as ZFS.

极端情况下,正在写入的文件,遇到位翻转并错误写入,文件系统是无法校验发现的。在写入时我会使用rsync或fastcopy/teracopy写入后校验,归档rar内嵌恢复记录。

100mb的压缩文件,10%恢复记录一般最多修复5mb的文件损坏,实际往往更小。

# NAS厂货

用到中转服务

如果需要厂家的中转服务以实现外网访问,推荐华为NAS,好像默认是格式化成ext4,功能也很羸弱。

但目前只有华为的中转服务老用户满速,极空间绿联给新用户更高优先级,老用户高峰期慢的跟蜗牛爬一样。而群晖和威联通不清楚是带宽有限还是什么原因,速度实在算不上理想。

擦洗特性

群晖提供lvm+简化版单盘btrfs,拆下来要用老版本的linux才能挂载。

威联通能装quts hero用ZFS,一般都是能用ecc内存的x86方案才能装,但是不标配ecc内存。

绿联,极空间本质上还是攒电脑。你要说zfs复杂度高不灵活,btrfs,Bcachefs可能不稳定,但至少可以适配xfs提供擦洗。

# 群晖用ZFS

# truenas安装与配置

truenas与freenas合并,分为两个版本,core基于freebsd,SCALE则基于debian,有docker,虚拟机。

truenas官网下载系统镜像后rufus (opens new window)写入u盘,u盘启动安装。默认情况下系统盘的剩余空间是无法被利用的。

修改网页端语言时区:System→General→Localization Settings

  • Language:Simplified Chinese
  • Timezone:Asia/Shanghai

存储-创建池,把左边列表的空闲硬盘选中,按向右箭头即设置为准备建池的硬盘。

  • 条带类似于RAID-0,速度快,但是坏一块硬盘数据全掉。
  • 镜像类似于RAID-1,镜像备份,支持多块硬盘。
  • RAID-Zx,数字x即为冗余校验盘的数量,zfs推荐至少三分之一。

本例新建镜像-起名为jingxiang1。

之后切换到数据集。

  • Zvol类似于虚拟磁盘,可以挂载到虚拟机格式化为ext4等文件系统
  • 数据集类似于新建文件夹。

新建名叫zdsm的数据集,ACL类型:SMB/NFSv4,压缩等级:ZSTD,其余默认。

zstd压缩性能不俗,速度也快。不加数字后缀则压缩等级为3,fast为1,根据现有测试来看,增大压缩等级对读取影响较小,但是写入速度影响较大,对cpu占用非常大。所以一般默认的3比较折中,和1速度差不多,但是压缩性能强一些。如果cpu性能很弱,可以考虑改为zstd-fast。

证书-本地用户-添加,新建用于读写smb共享的用户,只需要填全名,用户名,密码,uid和组会自动生成。本例用户名为ceshi。

对zdsm数据集的权限修改,用户和用户组改为ceshi,修改需要勾选应用于用户/组。

切换到共享-添加SMB共享,路径为上文建立的数据集,/mnt/jingxiang1/zdsm。名称可自定义,本例为zdsm,既smb访问路径为\192.168.3.31\zdsm。windows下资源管理器输入该地址既可直接访问测试。

192.168.3.31是我的truenas的地址,请根据实际修改。

# 虚拟机安装黑群晖

GXNAS编译的引导文件下载 (opens new window),也可以参考其编译教程1 (opens new window)2 (opens new window)

本例为其编译的DS3622_7.2-64570(引导文件).img,在群晖官网 (opens new window)下载引导对应版本的DSM系统文件。本例为DSM_DS3622xs+_64570.pat。

  • truenas虚拟机

将DS3622_7.2-64570.img拷贝到truenas中的/mnt/jingxiang1/zdsm,通过上文的smb共享。

数据集新建Zvol,起名dsmboot,容量2GiB,新建DSM1,容量21GiB。将引导写入虚拟磁盘dsmboot:

21gb是安装群晖的最小容量,群晖系统占用10g左右,新建存储池至少10g。

在truenas的系统设置-命令行运行,网页端shell粘贴按shift+insert(delete上方的键)

sudo dd if=/mnt/jingxiang1/zdsm/DS3622_7.2-64570.img of=/dev/jingxiang1/dsmboot

cpu和内存看着给,之后跳转到修改网络配置,truenas下默认桥接不用修改。

  • windows宿主机VirtualBox虚拟机

windows需要cmd定位到DS3622_7.2-64570.img所在目录,转换.img为虚拟磁盘.vdi。vmwork可以用starwind v2v converter工具转换。

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" convertfromraw DS3622_7.2-64570.img dsmboot.vdi --format VDI

新建虚拟机linux2.6,3.x,4.x,5.x(64bit),cpu和内存看着给。先不添加虚拟硬盘。创建后右键虚拟机,设置,存储,sata下新增磁盘,注册转换得到的dsmboot.vdi。再创建新的虚拟磁盘,磁盘容量至少21g。

21gb是安装群晖的最小容量,群晖系统占用10g左右,新建存储池至少10g。

  • 修改网络配置

网络改为桥接网卡,修改mac地址:

001132123456
00:11:32:12:34:56

mac地址匹配.img中的配置,此为GXNAS分享的预设。

桥接网卡列表没有物理网卡,win+q搜索网络连接,查看网络连接(控制面板)-右键物理网卡, 属性中启用VirtualBox NDIS6 Bridged Networking Driver服务,如果没有则安装-服务-从磁盘安装,定位到C:\Program Files\Oracle\VirtualBox\drivers\network\netlwf文件夹。

启动后在路由器后台查看是否上线,或群晖助手搜索。网页打开其内网ip,安装前文下载的.pat文件。

显示上线,但是无法连接,检查引导参数配置是否匹配,如网卡mac地址等。

# 黑群晖挂载ZFS

本例群晖中用户名为ceshi2

方法0:黑群晖自由发挥,hyper backup套件备份到TrueNAS,还能备份相册数据。

方法1:truenas安装虚拟机zvol虚拟磁盘挂载到群晖。

方法2:通过smb(cifs)挂载,只有手机同步jpeg能工作,其他方法或格式无法建立缩略图卡住转圈。

dsm7.2 群晖photos 1.5 truenas 22.12.3.3。

群晖开启家目录后,管理员用户能看到/volume1/homes/ceshi2既为登录ceshi2用户后的/home。而Synology Photos照片同步在/volume1/homes/ceshi2/Photos/MobileBackup。

运行file station,工具-装载远程文件夹-CIFS,文件夹为//192.168.3.31/zdsm,账号密码既truenas创建的用户密码。挂载为/volume1/homes/ceshi2/Photos。

群晖的挂载只让挂载二级目录,/volume1/homes/ceshi2由于是ceshi2的/home也不行。

方法2.1:在终端机开启ssh,ssh登录到群晖,本例使用MobaXterm (opens new window)软件。

这样挂载打开filestation会提示错误,缩略图故障依旧。

#smb
sudo mount -t cifs -o vers=3.0,username=ceshi,password=ceshiceshi //192.168.3.31/zdsm /volume1/homes/ceshi2
#nfs
sudo mount -t nfs 192.168.3.31:/mnt/jingxiang1/zdsm /volume1/homes/ceshi2

#卸载
umount /volume1/homes/ceshi2

不开启家目录则相册套件会生成/volume1/photo目录,同步在/volume1/photo/MobileBackup。可以用群晖挂载MobileBackup,或mount挂载photo目录。

网友@dmx (opens new window)分享解决略缩图生成解决方法:

关于通过CIFS挂载smb目录不能生成缩略图的问题,可以参考一下我的方案,我今天通过这个方案解决了:

  1. 挂载smb到home/Photos
  2. 想办法激活ame(网上要求需要半洗白,不清楚不洗白是否可以,未尝试用)
  3. 开启 SYNOFSIsRemoteFS

DMS7:

sudo -i

wget code.imnks.com/face/Pat (opens new window)

chmod +x PatchELFSharp

./PatchELFSharp "/usr/lib/libsynosdk.so.7" "SYNOFSIsRemoteFS" "B8 00 00 00 00 C3"

DSM7恢复:

cp -f /usr/lib/libsynosdk.so.7.bak /usr/lib/libsynosdk.so.7

rm -f /usr/lib/libsynosdk.so.7.bak

DMS6:

sudo -i

wget code.imnks.com/face/Pat (opens new window)

chmod +x PatchELFSharp

./PatchELFSharp "/usr/lib/libsynosdk.so.6" "SYNOFSIsRemoteFS" "B8 00 00 00 00 C3"

DSM6恢复:

cp -f /usr/lib/libsynosdk.so.6.bak /usr/lib/libsynosdk.so.6

rm -f /usr/lib/libsynosdk.so.6.bak

开启 SYNOFSIsRemoteFS的这个参考矿神的方案 开启群晖套件访问NFS/CIFS远程目录(SMB/NFS挂载)功能 (opens new window),这一步是必须的。

  1. 如果还不行的话,尝试安装ffmpeg,并替换原来的ffmpeg。

第二步和第三步是必须的,第四步不知道是不是必须的,没有尝试过。完成以后,删除@eaDir目录。然后重建索引,应该就可以生成缩略图了。

# truenas使用docker

# truenas24.10变回docker

网页端安装应用跨栏或用docker镜像,请参考虚拟机openwrt客串加速盒。 (opens new window)

truenas网页端-应用-选择池,会自动部署docker。

只有在网页端安装的才会在网页端显示,用docker命令行或portainer-ce创建的不会在TrueNas的webui显示。

22.10的时候truenas网页端安装应用要将用于部署的数据集的用户和组设置为apps,docker命令部署则无所谓。不清楚24.10要不要。

  • 修改docker镜像服务器

truenas系统设置-服务启用ssh服务,MobaXterm (opens new window)软件登录。

给docker添加镜像源:

sudo vim /etc/docker/daemon.json
按INS键切换成insert,最下面一行会有模式提示。
添加:
,"registry-mirrors":[XXX]
现在镜像源失效的很快,自己搜最新的镜像源,注意前面加个逗号。
之后按esc退出编辑模式,打:wq!回车,保存并退出。
重启docker:
sudo systemctl restart docker

truenas 23.10

没必要搞这么复杂,直接更新24.10。

该版本没有内置docker-cli,jailmaker (opens new window)脚本将安装systemd-nspawn运行一个debian容器,在这个容器中安装docker。

新建一个数据集,以/mnt/jingxiang1/docker为例。在truenas的webui中选中docker数据集,再新建数据集,就会成为docker的子集。本例新建了jailmaker,myjail,config,data。

jailmaker集用于放置**jailmaker (opens new window)脚本与容器文件。**myjail将挂载为容器内/home。

cd /mnt/jingxiang1/docker/jailmaker
curl --location --remote-name https://raw.githubusercontent.com/Jip-Hop/jailmaker/main/jlmkr.py
# 也可以自己下载该文件后拷贝进去。
chmod +x jlmkr.py
./jlmkr.py install #后来更新好像把install改成creat了。

之后在webui的系统设置-高级-开关机脚本-添加,类型命令,初始化后期(Post Init

/mnt/jingxiang1/docker/jailmaker/jlmkr.py startup

之后运行jlmkr,一路y,直到

Would you like to add additional systemd-nspawn flags?
设置挂载:
--bind='/mnt/jingxiang1/docker/myjail:/home' \
--bind='/mnt/jingxiang1/docker/config:/mnt/config' \
--bind='/mnt/jingxiang1/docker/data:/mnt/data'

建立myjail后,进入容器控制台并安装docker

sudo jlmkr shell myjail
curl -fsSL https://get.docker.com -o install-docker.sh
sh install-docker.sh

# 部署portainer-ce

管理docker的webui。

sudo docker run -d  \
    --name portainer  \
    --network=host   \
    -v /var/run/docker.sock:/var/run/docker.sock   \
    -v /mnt/config/portainer_data:/data    \
    --restart=always \
    portainer/portainer-ce:latest

#/mnt/jingxiang1/docker/portainer_data自行修改。
#/var/run/docker.sock不要改。
#不用host网络需要设置端口转发,9000用于http,9443用于https。
#-p 8000:8000  -p 9000:9000 -p 9443:9443
#--privileged 遇到问题可以试试,赋予主机root权限。一般不需要。

docker部分指令:

sudo docker ps 列出运行中容器,列出的第一列id用于后续操作。
sudo docker stop id 停止容器
sudo docker restart id 重启容器
sudo docker rm id 删除容器

# 部署qbittorrent-ee:

qbittorrent加强版,有一些优化。

sudo docker run -d  \
    --name=qbittorrentee  \
    --network=host  \
    -e WEBUIPORT=8080  \
    -e PUID=3000 \
    -e PGID=3000 \
    -e TZ=Asia/Shanghai \
    -v /mnt/config/qbittorrent:/config  \
    -v /mnt/data/qbittorrent:/downloads  \
    --restart unless-stopped  \
    superng6/qbittorrentee:latest

#puid,pgid在证书-本地用户查看,smb分享的时候能够用该账户登录处理文件。
#/mnt/jingxiang1/docker/qbittorrent自行修改。
#不用host网络需要设置端口转发,8080用于webui,6881用于bt监听,可以在qbittorrent设置里修改。
#   -p 6881:6881  \
#   -p 6881:6881/udp  \
#   -p 8080:8080  \ 

# 部署smartdns:

优选速度最快的dns结果,屏蔽广告dns。

sudo docker run -d --name smartdns \
            --restart=always \
            --network=host  \
            -v /mnt/config/smartdns:/etc/smartdns \
            pymumu/smartdns:latest

#不用host网络需要设置端口转发:
-p 53:53/udp \
-p 53:53/tcp \

23.10jail的如果53端口被占用,要停用myjail容器内systemd-resolved服务。

systemctl disable systemd-resolved.service
systemctl stop systemd-resolved.service

需要新建smartdns.conf,具体配置请参考smartdns文档 (opens new window)

# 懒得折腾就在文件末加上阿里dns和dnspod的doh地址。
# smartdns不能解决dns投毒。
server-https https://223.5.5.5/dns-query
server-https https://1.12.12.12/dns-query

# 部署syncthing

sudo docker run -d  \
    --name=syncthing  \
    --hostname=truenas-syncthing  \
    --network=host  \
    -e PUID=3000 \
    -e PGID=3000 \
    -v /mnt/config/syncthing:/var/syncthing  \
    -v /mnt/tongbu:/var/syncthing/sync  \
    syncthing/syncthing:latest


#不用host网络需要设置端口转发
#-p 8384:8384 -p 22000:22000/tcp -p 22000:22000/udp -p 21027:21027/udp

# 部署cf-ddns

在前文--bind='/mnt/jingxiang1/docker/myjail:/home' ,挂载为运行docker的容器内的/home目录下新建cfddns文件夹,

新建docker-compose.yml文件:

version: '3.9'
services:
  cloudflare-ddns:
    image: timothyjmiller/cloudflare-ddns:latest
    container_name: cloudflare-ddns
    security_opt:
      - no-new-privileges:true
    network_mode: 'host'
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - /home/cfddns/config.json:/config.json
    restart: unless-stopped

新建config.json文件,通常只需要配置:

api_token,在cf控制台,右上角的账户,我的个人资料,API令牌,创建令牌,编辑区域DNS模板。

既:权限-区域-DNS-编辑,区域资源既包括ddns的域名。

配置api_token后不需要配置api_key。

zone_id,cf控制台-网站,点击要配置ddns的域名,右下角的区域ID既zone_id。

name既配置二级域名。如果要配置二级域名,先要在cf控制台建立该条目。

{
  "cloudflare": [
    {
      "authentication": {
        "api_token": "api_token_here", // Either api_token or api_key
        "api_key": {
          "api_key": "",
          "account_email": ""
        }
      },
      "zone_id": "your_zone_id_here",
      "subdomains": [
        {
          "name": "", // Root domain (example.com)
          "proxied": false
        },
        {
          "name": "foo", // (foo.example.com)
          "proxied": false
        },
        {
          "name": "bar", // (bar.example.com)
          "proxied": false
        }
      ]
    }
  ],
  "a": true, // true既更新ipv4
  "aaaa": true, // true既更新ipv6
  "purgeUnknownRecords": false,
  "ttl": 300
}

# 部署wiregard-easy

能拉到公网IP可以不部署headscale或zerotier,都用的wireguard协议。只需要配置好ddns域名,并在路由器设置端口转发,然后docker运行wg-easy即可连接内网。其运行逻辑类似于部署服务端,被动等待被连接,可以生成二维码或配置文件在客户端一键导入。

openwrt打开ipv6端口,或openwrt下wireguard组网请参考 (opens new window)

wireguard每个节点都要设置其他节点的公钥,如果不填对方的节点地址(ip或动态域名)就类似于服务端,被动等待连接,填了可以主动发起连接也可以等着被连接。

需要mesh组网,可以考虑headscale或zerotier自建moon,最好有公网服务器,也可以考虑netmaker。会自动配置各节点。

如果打算直接用wireguard配置mesh网络,可以考虑用wg-meshconf (opens new window)。一键生成各个节点的配置文件,但是一个个节点改还是挺麻烦的。

如果遇到高峰期丢包,可以考虑增加一层phantun或udp2raw,混淆UDP数据包。

docker运行wg-easy需要宿主机内核支持wireguard。

修改-e WG_PORT=51820端口是修改wg-easy生成给客户端的配置文件的端口号,其脚本写死51820端口,修改wg服务端口不能用host网络,只能用bridge网络修改转发的物理机端口号。

sudo docker run -d \
  --name=wg-easy \
  -e LANG=chs \
  -e WG_HOST=IP或ddns域名 \
  -e PASSWORD=控制台密码 \
  -v /mnt/config/wg-easy:/etc/wireguard \
  --network=host  \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy
  
不用host,需要配置端口转发:51820用于虚拟组网,51821用于web控制台。
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \


  -e WG_PORT=51820 \ 可以修改wg服务端口
  -e PORT=51821 \ 可以修改web控制台端口

# 相册对比

immich是作为一个相册备份软件所设计。上传文件目录按时间放置,保持原文件名,交互性易用性我觉得是最好的,支持jxl,长图虽然没有适配,不过好赖滚轮能放大。

immich挂载本地目录需要在administration-users当中设置允许用户访问的外部目录,再到登录的用户设置-libraries中设置外部库的目录,才能索引,immich对外部库不会写入只会读取。

immich手机端软件删除则服务端和本地一起删,手机相册删除只删本地。其他设备或网页端删除则只在服务端删除,手机端会再次上传。

photoview没有上传,同步等功能,有深度学习分类。不支持jxl,没有适配长图,但还是可以查看原图放大了看。视频文件点两下才开始播放。对内嵌预览的dng文件正常显示。

librephoto像是更重的photoview,有深度学习分类,兼容jxl,长图显示预览图糊成一片,dng文件不读取内嵌预览,瞎生成,没有适配视频。

photoprism作为一个相册功能算是齐全的,本地挂载正常索引,上传文件位置按相册放置,会按时间重命名。视频兼容性不错,没有长图适配,想放大了看都看不了。只有上传的dng算dng,本地挂载的dng索引后只有内嵌的jpg预览。

lychee会把文件重命名成md5码,目录也会打乱,更像是图床。有点呆。

piwigo的移动端没有同步功能,要批量选中后上传。只兼容jpg,gif,png。非常呆。

可道云,本地挂载要修改目录权限为775。适配长图。不兼容dng,jxl。app相册同步无视dng。缩略图只会生成小图。

id nginx
chown -R 101:101 /mnt/dcim && chmod -R 775  /mnt/dcim