本帖最后由 loveha 于 2023-7-12 23:42 编辑
提醒: 因为教程涉及到先删除和停止supervisor相关服务的操作--ha的开发人员把这个supervisor的权限设计到顶级,非得卸载才可以用其他方式去替代停止它阻止我们进行其他得操作。这是有一点危险性得。自己衡量,我们也是b站有几个机油帮忙测试了,他们是顺利解决了supervisor升级不了的这个问题。但是因为大家安装得supervisor得机子环境差异蛮大,不晓得是否通用。
下一步的计划是解决homeassistant的本地更新。
正文:
解决在大陆网络环境下 HomeAssistant Supervisor 更新问题的教程
许多 HomeAssistant 的镜像都放在了 GitHub 上,在大陆网络环境下并未提供加速镜像,导致在网络环境严苛的情况下,我们无法正常更新 Supervisor。
本教程旨在帮助大陆的 HomeAssistant 用户解决这个问题,并顺利完成 Supervisor 的更新。
尽管我个人是使用 HomeAssistant Core 直接搭建的,但我了解到许多用户喜欢使用 Supervisor 这个架构。既然大家喜欢使用,就需要想办法让大家继续使用下去。在解决 Supervisor 更新问题方面,我提供以下几种思路:
1.搭建国内镜像服务器
可以在国内搭建一个服务器,用于跳转请求。当用户进行镜像下载时,实际上请求的是国内服务器上的镜像,从而加快下载速度。虽然这种方式需要具备服务器搭建和维护的技术能力,但可以为用户提供更稳定、高速的镜像下载体验。要花钱和精力维护,放弃。。
2.提供出国代理
这个思路在一些方面有些灰色,涉及使用代理来绕过某些,但也可以为用户提供一个出国的通道,让用户的设备通过代理进行镜像下载。然而,这种方式可能违反一些国家的法律法规,且使用代理可能会带来安全和隐私问题,因此我不考虑。
3.本地镜像下载与替换
这是一种相对笨拙但可行的解决方案。用户可以将相关镜像下载到本地,然后手动替换原有的镜像文件,以完成更新。这需要用户具备一定的技术能力,并且需要及时获取最新的镜像文件。
现在,我将为大家提供这种 "笨办法" 的解决方案。
请注意,这种方法可能需要一些技术知识和操作,因此建议只在有一定技术经验或愿意承担一定风险的情况下尝试使用。同时,建议在实施之前进行充分的备份,以便在出现问题时可以恢复到之前的状态。
以下是解决该问题的步骤:
步骤一:
1.下载最新版本的 Supervisor 镜像文件,因为我没有网盘,免费的阿里不给分析gz和zip文件,所有用qq文件中转战给大家分享。
QQ邮箱中转站文件
2..从我分享的qq中转站链接中下载最新版本的 Supervisor 镜像文件。
3. 记得要解压下载的文件,得到一个解压后的文件,例如 "hassio-supervisor20230701.tar.gz"。
步骤二:上传镜像文件并执行更新脚本
1. 使用 Samba 工具或 WinSCP 将解压后的镜像文件上传到 HomeAssistant 的 "share" 文件夹,或者上传到 "/home/update" 文件夹(如果没有该文件夹,则在 "/home" 目录下创建它)。请确保上传的是解压后的 tar.gz 文件。这部分论坛应该有不少教程,自己搜索一下。
2. 使用 SSH 进入您的 HomeAssistant 设备,输入以下命令以创建并编辑一个名为 "updatesu.sh" 的文件:
nano updatesu.sh
3. 进入文件编辑状态后,将下面的代码复制到文件中:
#!/bin/bash
# 提醒用户使用脚本具有一定危险性
echo "警告:使用本脚本可能会造成系统操作错误或数据丢失,请确保您理解脚本的功能和风险,并愿意自行承担责任。"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
# 1. 停止 Supervisor 服务
echo "步骤 1:停止 Supervisor 服务"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
systemctl stop hassio-supervisor.service
systemctl stop hassio-apparmor.service
echo "已停止 Supervisor 服务."
# 2. 禁止 Supervisor 自动启动
echo "步骤 2:禁止 Supervisor 自动启动"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
systemctl disable hassio-supervisor.service
systemctl disable hassio-apparmor.service
echo "已禁止 Supervisor 自动启动."
# 3. 检查并停止/删除 hassio_supervisor 容器
echo "步骤 3:检查并停止/删除 hassio_supervisor 容器"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
if docker ps -a --format "{{.Names}}" | grep -q "hassio_supervisor"; then
echo "停止 hassio_supervisor 容器..."
docker stop hassio_supervisor
echo "已停止 hassio_supervisor 容器."
echo "删除 hassio_supervisor 容器..."
docker rm hassio_supervisor
echo "已删除 hassio_supervisor 容器."
else
echo "hassio_supervisor 容器未找到,无需操作."
fi
# 4. 删除 ghcr.io/home-assistant/aarch64-hassio-supervisor 镜像
echo "步骤 4:删除 ghcr.io/home-assistant/aarch64-hassio-supervisor 镜像"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
if docker images --format "{{.Repository}}" | grep -q "ghcr.io/home-assistant/aarch64-hassio-supervisor"; then
echo "删除 ghcr.io/home-assistant/aarch64-hassio-supervisor 镜像..."
docker rmi ghcr.io/home-assistant/aarch64-hassio-supervisor
echo "已删除 ghcr.io/home-assistant/aarch64-hassio-supervisor 镜像."
else
echo "ghcr.io/home-assistant/aarch64-hassio-supervisor 镜像未找到,无需操作."
fi
# 5. 检查并输出文件信息
echo "步骤 5:检查并输出文件信息"
file_counter=0
file_numbers=()
file_paths=()
file_names=()
file_sizes=()
file_creation_times=()
check_directory() {
local directory=$1
local file_pattern=$2
for file_path in "$directory"/*"$file_pattern"*.tar.gz; do
if [ -f "$file_path" ]; then
file_counter=$((file_counter+1))
file_numbers+=($file_counter)
file_paths+=("$file_path")
file_names+=("$(basename "$file_path")")
file_sizes+=("$(du -h "$file_path" | awk '{print $1}')")
file_creation_times+=("$(stat -c "%y" "$file_path")")
echo "[$file_counter] 文件路径: $file_path"
echo " 文件名: ${file_names[$file_counter-1]}"
echo " 创建时间: ${file_creation_times[$file_counter-1]}"
echo " 文件大小: ${file_sizes[$file_counter-1]}"
fi
done
}
check_directory "/home/update" "hassio-supervisor"
check_directory "/usr/share/hassio/share" "hassio-supervisor"
if [ $file_counter -eq 0 ]; then
echo "未找到含有 'hassio-supervisor' 字样的 tar.gz 文件。"
exit 0
fi
echo "请输入文件编号以继续操作: "
read selected_file_number
if [[ "${file_numbers[*]}" =~ (^|[[:space:]])"$selected_file_number"($|[[:space:]]) ]]; then
selected_index=$((selected_file_number-1))
selected_file_path="${file_paths[$selected_index]}"
echo "已选择文件: ${file_paths[$selected_index]}"
echo "文件名: ${file_names[$selected_index]}"
echo "创建时间: ${file_creation_times[$selected_index]}"
echo "文件大小: ${file_sizes[$selected_index]}"
echo "开始加载镜像..."
docker load < "$selected_file_path"
echo "镜像加载完成."
else
echo "输入的文件编号不正确。"
exit 0
fi
# 6. 启动加载的镜像
echo "步骤 6:启动加载的镜像"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
systemctl start hassio-supervisor.service
systemctl start hassio-apparmor.service
echo "已启动加载的镜像."
# 7. 启用自动重启服务
echo "步骤 7:启用自动重启服务"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
systemctl enable hassio-supervisor.service
systemctl enable hassio-apparmor.service
echo "已启用自动重启服务."
# 8. 重启整个系统
echo "步骤 8:重启整个系统"
read -p "继续操作吗?(y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "已取消操作."
exit 0
fi
echo "重启整个系统..."
reboot
上面代码复制到文件夹之后,继续下面的操作。
4. 保存文件并退出编辑状态。按下 Ctrl + X,然后输入 "Y" 确认保存,并按下回车键。
5. 给 "updatesu.sh" 文件添加执行权限,输入以下命令:
chmod +x updatesu.sh
6. 运行脚本,输入以下命令:
./updatesu.sh
完成上述步骤后,根据更新脚本的指示,选择 "y" 进行操作,并按照提示进行确认。脚本将停止 Supervisor 服务、禁止自动启动、删除旧的 Supervisor 容器、删除旧的 Supervisor 镜像,然后加载并启动最新版本的 Supervisor 镜像。最后,脚本将启用自动重启服务并重启整个系统。
请注意,这些步骤需要一定的技术知识和操作,并且在运行脚本之前,请确保已经进行了适当的备份。同时,请谨慎操作,并理解脚本的功能和风险。如果遇到任何问题,请重新安装 HomeAssistant。
|