愚蠢的地球人

修改威联通NAS磁盘挂载点路径中CACHEDEV的数字编号

昨天给NAS换了一块硬盘,顺便把厚卷改成了静态卷。

过程很简单,先把新硬盘插到4号空盘位,新创建一个静态卷Volume4,然后用HBS把数据从Volume3同步到Volume4,完了之后取下3号硬盘。

本以为大功告成,结果后来却发现有些应用出了问题,经过一番排查发现在这些应用的设置中使用了绝对路径:

原来的/share/CACHEDEV3_DATA现在变成了/share/CACHEDEV4_DATA,导致应用无法找到文件。

这个简单,安全卸载Volume4,然后将这块4号盘位的硬盘换到3号盘位,恢复存储池。

More...


使用Ubuntu读取威联通NAS拆下来的硬盘

以下方法只适用于威联通NAS的静态卷(single static volume),厚卷和精简卷(薄卷)暂时无法在Ubuntu中读取。

先使用lsblk命令列出磁盘分区:

~# lsblk
sdb                   8:16   0   1.8T  0 disk  
├─sdb1                8:17   0 517.7M  0 part  
│ └─md9               9:9    0 517.6M  0 raid1
├─sdb2                8:18   0 517.7M  0 part  
│ └─md256             9:256  0 517.7M  0 raid1
├─sdb3                8:19   0   1.8T  0 part  
│ └─md127             9:127  0   1.8T  0 raid1
├─sdb4                8:20   0 517.7M  0 part  
│ └─md13              9:13   0 448.1M  0 raid1
└─sdb5                8:21   0     8G  0 part  
  └─md322             9:322  0   6.9G  0 raid1

sdb就是这块硬盘,sdb1-5代表这块硬盘的第1到5个分区,下面的md是磁盘阵列(Raid)。

More...


威联通(QNAP)NAS配置优化笔记

一、硬盘单独休眠
1.查看:

mdadm -D /dev/md9
mdadm -D /dev/md13
hdparm -C /dev/sdc
hdparm -C /dev/sda


2.建立脚本文件disconnect_internal_raid.sh:

#!/bin/sh
echo "Disconnecting md9"
mdadm /dev/md9 --fail /dev/sdc1
mdadm /dev/md9 --fail /dev/sda1
echo "Disconnecting md13"
mdadm /dev/md13 --fail /dev/sdc4
mdadm /dev/md13 --fail /dev/sda4


3.建立脚本文件rebuild_internal_raid.sh:

More...


家用NAS利用公网IPV6外网访问

通过IPV6从外网访问家里的NAS需要做两件事:一是解决IPV6的DDNS,二是配置路由器的防火墙。


先说DDNS,我用的是群晖的NAS,动态域名用的是Dnspod,但是群晖NAS自带的DDNS不支持Dnspod的IPV6更新。

只能自己写脚本来解决这个问题,直接上代码: 【以下代码在群晖DSM6系统下测试正常,其他设备可能需要做修改】

#!/bin/bash
#Dnspod DDNS6 with BashShell
#改编自Github:https://github.com/kkkgo/dnspod-ddns-with-bashshell
#CONF START
#API_ID和API_Token在dnspod的控制台 -> 用户中心 -> 安全设置 -> API Token 中获取
API_ID="12345"
API_Token="abcdef123456abcdef123456abcdef123456"
domain="yourdomain.com"
host="yourhost"
DEV="eth0"
#CONF END
date

IPREX="((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))"

DEVIP=$(ip -6 addr list scope global $DEV | grep -v " fd" | grep inet6 | awk '{print $2}' | head -n 1)
if (echo $DEVIP | grep -qEvo "$IPREX");then
  echo "Get $DEV inet6 IP Failed."
  exit
else DEVIP=$(echo $DEVIP | grep -Eo "$IPREX" | head -n 1)
fi
echo "[DEV IP]:$DEVIP"

DNSTEST=$(nslookup -q=AAAA $host.$domain)
if (echo $DNSTEST | grep -qEvo "$IPREX");then
  echo "Get $host.$domain DNS Failed."
  exit
else DNSIP=$(echo $DNSTEST | grep -Eo "$IPREX" | tail -n 1)
fi
echo "[DNS IP]:$DNSIP"

if [ "$DNSIP" == "$DEVIP" ];then
  echo "IP SAME IN DNS,SKIP UPDATE."
  exit
fi

token="login_token=${API_ID},${API_Token}&format=json&domain=${domain}&sub_domain=${host}"
Record=$(curl -s -k -X POST https://dnsapi.cn/Record.List -d "${token}")
iferr=$(echo ${Record#*code} | cut -d'"' -f3)
if [ "$iferr" == "1" ];then
  record_ip=$(echo ${Record#*value} | cut -d'"' -f3)
  echo "[API IP]:$record_ip"
  if [ "$record_ip" == "$DEVIP" ];then
    echo "IP SAME IN API,SKIP UPDATE."
    exit
  fi
  record_id=$(echo ${Record#*\"records\"\:\[\{\"id\"} | cut -d'"' -f2)
  record_line_id=$(echo ${Record#*line_id} | cut -d'"' -f3)
  echo Start DDNS update...
  ddns=$(curl -s -k -X POST https://dnsapi.cn/Record.Modify -d "${token}&record_id=${record_id}&record_line_id=${record_line_id}&value=${DEVIP}&record_type=AAAA")
  ddns_result="$(echo ${ddns#*message\"} | cut -d'"' -f2)"
  echo -n "DDNS upadte result:$ddns_result "
  echo $ddns | grep -Eo "$IPREX" | tail -n 1
else echo -n Get $host.$domain error :
  echo $(echo ${Record#*message\"}) | cut -d'"' -f2
fi

将以上代码保存为.sh文件,然后在NAS系统里添加一个计划任务:

More...