Linux
linux下的yum命令报错
【实用】精简Commands(更新)
SSH登录Linux系统提示信息"There were xxxx failed login attempts since the last successful login."
生信软件安装前配置
NewMechine-Linux
捡了一台垃圾-蜗牛星际单网口
群晖系统升级攻略
群晖的一些工具
群晖中玩脚本【实践可行才记录】
群晖套件迁移(从存储2到存储4)
移动吉比特光猫 SK-D746 获取动态超级管理员帐号与密码
linux使用crontab命令指定时间段内随机执行任务
【实用】局域网数据共享之王-gohttpserver
本文档使用 MrDoc 发布
-
+
up
down
首页
群晖套件迁移(从存储2到存储4)
# 背景 要知道,群晖所有的套件都是安装在 `/var/packages` 目录中。我们可以看看那我们在套件中心中设置安装套件所在位置时对套件有何影响:   其中,`etc、home、share、target、tmp、var` **6个目录**链接到了设置的对应存储空间的相应目录。 > 拉下来的脚本中没有share,可以自己添加上。 # 操作原理 操作前,先停用要迁移的套件。 ## 复制原存储空间的目录到新存储空间; ## 修改 `etc、home、share、target、tmp、var` 链接到新存储空间。 # 方法 ## 直接下脚本: `curl https://gitee.com/kangzeru/dsm_-transferpackage/raw/master/transferpackage.sh > transferpackage.sh` 具体脚本内容如下: ``` #!/bin/bash # v0.2 # 1、添加套件外部链接检测功能 # 提示:部分套件会链接到套件文件夹外部的文件(夹),迁移后一般还能正常运行,如果外部的文件(夹)在需要调整的存储空间上,你可能需要手动移动它们,同时修改对应的软链接 # 2、增加显示特定存储空间上安装的套件清单功能 # 3、增加对迁移目标存储空间的检测 operation=$1 dir=("conf" "home" "store" "temp" "data") link=("etc" "home" "target" "tmp" "var" "share") check_package () { echo 正在检测套件是否含有外部链接... check_result=0 for l in "${link[@]}"; do if [ -e /var/packages/$package/$l ] then for f in `find /var/packages/$package/$l/ -type l` do #ll=$(ls -l $f) #echo /${ll#*/} local k=0 for ((j=0;j<=4;j++)) do if [ -e /var/packages/$package/${link[$j]} ] then lk=$(ls -l /var/packages/$package/${link[$j]}) # echo realpath1: `realpath -e --relative-base=${lk##* } $f` # echo realpath2: `realpath -e $f` if [ `realpath -e --relative-base=${lk##* } $f` = `realpath -e $f` ] then # echo realpath1=realpath2 ((k=k+1)) else # echo $f在${lk##* }目录下 break fi if [ $k -eq 5 ] then check_result=1 ll=$(ls -l $f) echo 有外部链接:/${ll#*/} fi else echo /var/packages/$package/${link[$j]} 不存在. exit fi done done else echo /var/packages/$package/$l 不存在. exit fi done if [ $check_result -eq 0 ] then echo 没有外部链接 fi } check_answer () { local a=1 while [ $a -ne 0 ] do read -n1 -p "是否继续迁移套件$package?[y/n]" answer case $answer in Y|y) a=0 echo;; N|n) echo exit;; esac done } show_usage () { echo "使用方法: 显示套件清单: transferpackage.sh list [存储空间编号] 示例: transferpackage.sh list 显示所有安装的套件 transferpackage.sh list 2 显示所有安装在存储空间2上的套件 迁移套件: transferpackage.sh transfer 套件名 目标存储空间编号 检查套件外部链接: transferpackage.sh check 套件名 显示本帮助: transferpackage.sh help" } case $operation in list) if [ $2 ] then synostgvolume --enum-dep-pkgs /volume$2 else #package_list=$(ls /var/packages/ |tr -s " ") echo " 套件名 -- 套件中心显示的名称 -----------------------------" for a in `synopkg list --name` do if [ -e /var/packages/$a/INFO ] then package_name=$(cat /var/packages/$a/INFO | grep displayname_chs\= | grep -o '".*"' |sed 's/"//g') if [ -z "$package_name" ] then package_name=$(cat /var/packages/$a/INFO | grep displayname\= | grep -o '".*"' |sed 's/"//g') fi echo $a -- $package_name else echo $a -- /var/packages/$a/INFO 文件不存在.该套件可能已卸载. fi done fi ;; transfer) if [ ! $2 ];then show_usage;exit;fi if [ ! $3 ];then show_usage;exit;fi package=$2 new_volume=$3 # 检测目标存储空间 synostgvolume --is-writable /volume$new_volume 2>/dev/null if [ $? -eq 255 ];then echo 错误:目标存储空间不可用;exit;fi case `synopkg status $package | sed 's/^.*Status: \[//g' | sed 's/\].*//g'` in 0) echo "检测到套件$package未停用,为避免出现未知错误建议先停用该套件再进行迁移." check_answer ;; 255) echo 套件$package未安装 exit;; 263) #echo 套件$package已停用 ;; esac # 检测外部链接 check_package if [ $check_result -eq 1 ] then echo "套件$package存在以上外部链接,请根据需要手动迁移这些文件(夹)并修改相应链接." check_answer fi for ((i=0;i<=4;i++)) do if [ -e /var/packages/$package/${link[$i]} ] then lk=$(ls -l /var/packages/$package/${link[$i]}) original_lk=${lk##* } original_volume=${original_lk:7:1} if [ $new_volume -ne $original_volume ] then if [ ! -d /volume$new_volume/@app${dir[$i]} ] then mkdir /volume$new_volume/@app${dir[$i]} if [ $? -eq 0 ];then echo -e "添加文件夹 /volume$new_volume/@app${dir[$i]}...\e[0;32m完成\e[0m.";else echo -e "添加文件夹 /volume$new_volume/@app${dir[$i]}...\e[0;31m失败\e[0m.";exit;fi fi new_lk=$original_lk new_lk=${original_lk/$original_volume/$new_volume} cp -a $original_lk $new_lk if [ $? -eq 0 ];then echo -e "复制 $original_lk 到 $new_lk...\e[0;32m完成\e[0m.";else echo -e "复制 $original_lk 到 $new_lk...\e[0;31m失败\e[0m.";exit;fi ln -snf $new_lk /var/packages/$package/${link[$i]} if [ $? -eq 0 ];then echo -e "链接 $new_lk 到 /var/packages/$package/${link[$i]}...\e[0;32m完成\e[0m.";else echo -e "链接 $new_lk 到 /var/packages/$package/${link[$i]}...\e[0;31m失败\e[0m.";exit;fi else echo "目标存储空间与套件/var/packages/$package/${link[$i]}文件夹所在存储空间相同,无需迁移." fi else echo "/var/packages/$package/${link[$i]} 不存在." exit fi done ;; check) if [ ! $2 ];then show_usage;exit;fi package=$2 check_package ;; help|*) show_usage ;; esac ``` ## 脚本使用 ``` # 给脚本执行权限 chmod +x transferpackage.sh # 显示帮助文档 ./transferpackage.sh help # 显示所有安装的套件 ./transferpackage.sh list # 显示具体存储空间中所有安装的套件 sudo ./transferpackage.sh list 2 sudo ./transferpackage.sh list 4 ```  迁移套件,如迁移`Node.js_v18`:  ``` # 检查套件是否有外部链接 sudo ./transferpackage.sh check Node.js_v18 # 迁移套件 sudo ./transferpackage.sh transfer Node.js_v18 4 ```  可以看到,迁移成功了:  如,套件 `SynologyDrive`中有外部链接,我直接先忽略吧,看看会不会有问题。  ## 批量迁移 套一个循环,即可(先`sudo -i`拿下管理员权限): ``` for i in `./transferpackage.sh list 2`;do echo 进行套件${i}迁移; ./transferpackage.sh check $i && ./transferpackage.sh transfer $i 4;done ```  需要手动的有: - `SynologyDrive` 是最多的外部链接了,先不处理看看吧。 - `ContainerManager` 中是有一个`@docker`目录要手动迁移的。 `sudo cp -rf /volume2/\@docker /volume4/` - `AudioStation` 提示有一个,但是`/var/packages/AudioStation/etc/radio`链接的外部链接和volume2无关;  - `CodecPack` 中好多都提示没有链接,不处理就是; 所有都正常了,哈哈哈啊~~~ 突然看到其中一个目录share他并没有移动,也是教程里说漏了的,确实脚本里没有对这个目录进行移动。。。  不过好像不影响,大部分都是没有东西的,我一次性移动了 `mkdir /volume4/\@appshare/ && cp -rf /volume2/\@appshare/* /volume4/\@appshare/` 【脚本中修改,添加上share就好了】 # 最后的最后 (1)迅雷的共享文件夹,直接在共享文件夹里更改存储空间,如果目录很大,会比较久,我是直接删了,然后重启迅雷的时候,他自己就创建到volume4里了。  (2)共享文件夹迁移,如qinglong目录 我是因为要删除存储空间2了,发现好多还依赖在那儿,如NoteStation,我直接给卸载了。qinglong我就把共享目录改成存储空间4了,就200M+,拷贝好慢就是。  
laihui126
2024年6月15日 23:20
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅道文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅道文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅道文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
下载Markdown文件
分享
链接
类型
密码
更新密码