当前位置:   article > 正文

DSM7下套件迁移_群晖套件安装位置更换

群晖套件安装位置更换

重要提示:数据无价,进行任何操作前请妥善备份好数据

2023.08.01 更新v0.2

  1. 添加套件外部链接检测功能。
  • 提示:部分套件会链接到套件文件夹外部的文件(夹),迁移后一般还能正常运行,如果外部的文件(夹)在需要调整的存储空间上,你可能需要手动移动它们,同时修改对应的软链接。
  1. 增加显示特定存储空间上安装的套件清单功能。
  2. 增加对迁移目标存储空间的检测。

一、介绍

用于在Synology DSM7 中将套件迁移到不同的存储空间。

二、测试平台

所有功能在DS3615xs DSM 7.1.1-42962 Update 2中测试通过。

经测试的套件

  1. 官方套件
套件名套件中心里的名称迁移结果备注
CloudSyncCloud Sync正常迁移后在设置中调整数据库位置
SynologyApplicationServiceSynology应用程序服务正常
StorageAnalyzer存储空间分析器正常
Node.js_v12Node.js v12正常
SynologyPhotosSynology Photos正常
LogCenter日志中心正常
  1. SynoCommunity套件
套件名套件中心里的名称迁移结果
transmissionTransmission正常
vimVim正常

三、原理

  1. 所有套件均安装在/var/packages目录,进入相应套件(以StorageAnalyzer为例)的目录可以看到,如图所示的结构:
    /var/packages目录结构

其中"etc" “home” “target” “tmp” “var"目录链接到了对应存储空间的相应目录
2. 操作步骤:
1)复制原存储空间的目录到新存储空间;
2)修改"etc” “home” “target” “tmp” "var"链接到新存储空间。

四、使用说明

  1. 为避免数据丢失,操作前建议先停用要迁移的套件
    停用套件
  2. 执行sudo -i获得root权限。
  3. 创建transferpackage.sh脚本文件,内容如下。也可以执行wget https://gitee.com/kangzeru/dsm_-transferpackage/raw/master/transferpackage.sh直接下载脚本。 2023.08.01 更新v0.2
#!/bin/bash

# v0.2
# 1、添加套件外部链接检测功能
#    提示:部分套件会链接到套件文件夹外部的文件(夹),迁移后一般还能正常运行,如果外部的文件(夹)在需要调整的存储空间上,你可能需要手动移动它们,同时修改对应的软链接
# 2、增加显示特定存储空间上安装的套件清单功能
# 3、增加对迁移目标存储空间的检测

operation=$1


dir=("conf" "home" "store" "temp" "data")
link=("etc" "home" "target" "tmp" "var")


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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  1. 执行chmod +x transferpackage.sh获得执行权限

  2. 执行./transferpackage.sh list
    显示所有套件目录,找到要迁移套件的目录名
    目录列表

  3. ./transferpackage.sh transfer [packagefolder_name] [targetvolume_num]
    例如:要把“存储空间分析器”套件迁移到存储空间2,则执行./transferpackage.sh transfer StorageAnalyzer 2
    迁移

  4. 查看迁移结果
    结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/158406?site
推荐阅读
相关标签
  

闽ICP备14008679号