请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 57288|回复: 63

hassio 启动详解及群晖运行方法

  [复制链接]

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2018-1-26 19:17:33 | 显示全部楼层 |阅读模式
本帖最后由 neroxps 于 2018-5-7 10:09 编辑

############################2018年5月3日更新################################


更新群晖运行方法



1. 打开 run-hassio.sh

run_hassio_supervisor(){
        docker run -d --restart=always --name hassio_supervisor \
     -v /var/run/docker.sock:/var/run/docker.sock \
     -v /volume1/docker/hassio:/data \
     -v /volume1/docker/hassio/supervisor-log:/var/log \
     -e SUPERVISOR_SHARE=/volume1/docker/hassio \
     -e SUPERVISOR_NAME=hassio_supervisor \
     -e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \
     homeassistant/amd64-hassio-supervisor > /dev/null 2>&1 
}


将以上路径内容按照旧帖提到的方式修改成自己的路径。


2. 设置 run-hassio.sh 脚本至群晖计划任务开机启动,旧的  fix-dsm-hassio-netowrk.sh 脚本弃用

3. 脚本原理解析

由于群晖的docker问题,hassio 通过 docker 新建 hassio 网络的时候经常会失败,所以导致一些列的问题产生(例如hassio不停重启)。


这里还是不太建议用群晖来使用 hassio。

而我的脚本原理就是通过 route 检测 hassio 网络是否正常,如果不正常就直接 docker rm 掉 hassio_supervisor 再重启 hassio_supervisor,达到解决 hassio 更新后不停重启的问题。简单粗暴

run-hassio.sh (821 Bytes, 下载次数: 183)


##############################以下旧帖#################################



入坑智能家居三个月,学习了不少,发现很多人对 Hassio 存在一定的误解,所以这边先说明一下 hassio 到底是什么,和homeassistant 到底有什么的关系。


首先希望大家要清晰一点,Hassio 并不是一个操作系统,他仅仅是一个软件部署的架构,并不是一个系统,而官方文档上的 hassio 树莓派固件其实只是官方已经将 hassio 安装在 ResinOS 上面罢了,但是官方可能出于安全性和稳定性,不让用户拥有底层系统的 shell 权限,故此我并不推荐使用这个系统刷到树莓派来使用 hassio。



hassio 架构图

hassio.png

从架构图可以看出,hassio 是安装在操作系统层面上的一个软件,他本身是一个 Docker 容器,同时 hassio 也具有 Docker 的控制权限。
另系统层面上还有一个叫 hassio-hc 的脚本在运行,这个脚本会建立一个 sock 文件并建立 hassio 容器的时候用 -v 映射到 hassio 容器内部供容器使用。


Home-Assistant 则是跑在 Docker 下面的另一个容器,它享有与本机一样的网络状态,通过网络与 hassio 联系(应该是类似 Rest_api  的方式互通),而 Home-Assistant 则负责前端显示,hassio 角色像是作为 Home-Assistant 的一个插件那样存在。

Addons 是依赖于 Hassio 存在的,这些插件其实就是基于 Hassio 规范设计的 Docker 容器,发布到 Docker Hub、Github 方便 Hassio 调用。


hassio 启动分析

通过 hassio 启动分析,我们才能更好的了解 hassio 的角色和功能。
通过分析 hassio 一键安装脚本hassio_install,其实脚本就做了两件事。

1、检测本地系统内核类别,确定 hassio 的容器名称。

下面是代码片段:


case $ARCH in

    "i386" | "i686")

        MACHINE=${MACHINE:=qemux86}

        HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

        HASSIO_DOCKER="$DOCKER_REPO/i386-hassio-supervisor"

    ;;

    "x86_64")

        MACHINE=${MACHINE:=qemux86-64}

        HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

        HASSIO_DOCKER="$DOCKER_REPO/amd64-hassio-supervisor"

    ;;

    "arm" | "armv7l" | "armv6l")

        if [ -z $MACHINE ]; then

            echo "[ERROR] Please set machine for $ARCH"

            exit 1

        fi

        HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

        HASSIO_DOCKER="$DOCKER_REPO/armhf-hassio-supervisor"

    ;;

    "aarch64")

        if [ -z $MACHINE ]; then

            echo "[ERROR] Please set machine for $ARCH"

            exit 1

        fi

        HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

        HASSIO_DOCKER="$DOCKER_REPO/aarch64-hassio-supervisor"

    ;;

    *)

        echo "[ERROR] $ARCH unknown!"

        exit 1

    ;;

esac


这里就指明了什么平台下载什么 hassio 容器名称。

2、将 hassio-supervisor.servicehassio-hc.service 注册为服务。
那么这个 hassio-hc 是干什么的呢?我们可以到这里看看 hassio-hc 的代码。


上面的 hassio-hc.service 启动脚本之前会使用 socat 创建一个 hassio-hc.sock ,如果收到信息的话就执行 hassio-hc 脚本,见下面命令


/usr/bin/socat UNIX-LISTEN:/var/run/hassio-hc.sock,fork EXEC:%%BIN_DIR%%/hassio-hc


而 hassio-hc 则负责处理收到的信息,他有 info、reboot、shutdown、update 等参数控制,其实说白了就是 hassio 控制宿主用的一些命令,通过他们来控制系统的重启、更新、关机等操作。


接下来我们再看看 hassio-supervisor.service



ExecStartPre=-/usr/bin/docker stop hassio_supervisor 
ExecStart=%%BIN_DIR%%/hassio-start 
ExecStop=-/usr/bin/docker stop hassio_supervisor


懂 systemd 的人应该不难看出,hassio 注册为服务,启动的时候先用 docker 指令停掉 hassio_supervisor 再运行 hassio-start 脚本。接下来看下 hassio-start 脚本是做什么的。

学过 docker 的朋友一看就发现了这样一个东西。


runSupervisor() { 
 docker rm --force hassio_supervisor || true 
 docker run --name hassio_supervisor \ 
 -v /var/run/docker.sock:/var/run/docker.sock \ 
 -v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \ 
 -v /var/run/dbus:/var/run/dbus \ 
 -v %%DATA_SHARE%%:/data \ 
 -e SUPERVISOR_SHARE=%%DATA_SHARE%% \ 
 -e SUPERVISOR_NAME=hassio_supervisor \ 
 -e HOMEASSISTANT_REPOSITORY=%%HOMEASSISTANT_IMAGE%% \ 
 %%SUPERVISOR_IMAGE%% 
 } 


第一条 docker rm 就是删除 hassio_supervisor 容器

第二条 docker run 就是运行 hassio_supervisor 容器,而 %%SUPERVISOR_IMAGE%% 在一键安装脚本的时候就会根据平台的内核来命名。如果是x86_64的平台用一键脚本安装后应该是如下这样。



runSupervisor() {
    docker rm --force hassio_supervisor || true #删除 hassio_supervisor 容器
    docker run --name hassio_supervisor \ #运行 homeassistant/amd64-hassio-supervisor 容器命名为 hassio_supervisor
        -v /var/run/docker.sock:/var/run/docker.sock \ #将 docker.sock 映射到容器内部
        -v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \ #将 hassio-hc.sock 映射到容器内部
        -v /usr/share/hassio:/data \ #将 /usr/share/hassio 映射到容器内部,这就是 hassio 的所有配置目录
        -v /var/log/supervisor-log:/var/log \ #将日志文件夹映射到容器内部,为了持久化 hassio 日志
        -e SUPERVISOR_SHARE=/usr/share/hassio \ #定义 hassio 的配置文件路径
        -e SUPERVISOR_NAME=hassio_supervisor \ #定义 hassio docker 名称
        -e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \ #定义homeassistant容器名称,想自定义自己的 homeassistant,可以将容器发布到 hub.docker.com 然后修改这里的容器名就好了。
        homeassistant/amd64-hassio-supervisor
}


现在已经很清晰了,hassio 启动的时候,会获得 docker 的控制权,然后再向 hub.docker.com 拉取镜像,然后整个系统都是运行在 docker 里面。故此,hassio 仅仅需要 docker 就好了,其余官方脚本 install 中其余依赖,其实都是给 hassio-hc (也就是重启、更新、关闭操作系统)用的。故此,群晖运行 hassio,仅需以下步骤即可。

群晖运行 hassio 步骤


1. 创建 hassio 运行需要的文件夹

上文提到,运行 hassio 的容器的时候,需要两个路径,一个是 hassio 配置文件夹,一个是 hassio 日志文件夹。

我是这样设置的,大家可以按照自己的需求设置。


DSM-hassio-config-dir-01.jpg
DSM-hassio-config-dir-02.jpg

2. 在群晖 ssh 中使用 docker 命令运行 hassio

为什么一定要用 ssh 中的 docker 命令执行?

因为上面也说道,hassio 需要取得 docker 控制权,所以我们需要将系统内部的 docker.sock 映射到系统内部,而群晖的 docker 界面我没法找到映射 docker.sock 的方法,所以用命令执行是最方便的啦。


docker run -d --restart=always --name hassio_supervisor \
     -v /var/run/docker.sock:/var/run/docker.sock \
     -v /volume1/docker/hassio:/data \
     -v /volume1/docker/hassio/supervisor-log:/var/log \
     -e SUPERVISOR_SHARE=/volume1/docker/hassio \
     -e SUPERVISOR_NAME=hassio_supervisor \
     -e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \
     homeassistant/amd64-hassio-supervisor


运行命令后,我们会看到一个叫 homeassistant/qemux86-64-homeassistant:landingpage 的镜像在运行,这个其实就是那个 Preparing Hass.io 的页面而已,就是因为树莓派刷了 hassio 而没有修改 docker 的源,导致网络慢啦取镜像下来非常非常慢,而 qemux86-64-homeassistant 要300多兆,国内的网络状态,可想而知速度有多慢,我群晖更换了 docker 源,拉取下来也要几分钟时间,所以官方就做了一个 landingpage 的分支镜像,让刷了树莓派的人能够看到系统在干嘛,其实系统就是在 pull qemux86-64-homeassistant 镜像下来啦。

我们可以看 hassio_supervisor 的日志看到下面这一行。


18-01-24 12:47:01 INFO (SyncWorker_0) [hassio.docker.interface] Pull image homeassistant/qemux86-64-homeassistant tag 0.61.1.


这样就只有等了,等 pull 完,就会出现 homeassistant 的界面了。

值得注意的是,如果不小心写错路径,又执行了上面的 docker run 命令,那么需要将 hassio_supervisor 删掉再重新执行命令,否则会报名字已存在,导致 docker run 命令出错。


docker rm -f hassio_supervisor


3. 想在 hassio 中修复历史转圈的问题?(官方在 0.60版本已修复此问题无需再使用以下配置)

那么可以将上面的启动 hassio 命令改成下面的样子。

docker run -d --restart=always --name hassio_supervisor \
     -v /var/run/docker.sock:/var/run/docker.sock \
     -v /volume1/docker/hassio:/data \
     -v /volume1/docker/hassio/supervisor-log:/var/log \
     -e SUPERVISOR_SHARE=/volume1/docker/hassio \
     -e SUPERVISOR_NAME=hassio_supervisor \
     -e HOMEASSISTANT_REPOSITORY=neroxps/qemux86-64-homeassistant \
     homeassistant/amd64-hassio-supervisor


如果已经运行过 hassio 的话,那么可以先在群晖下删除原来的 hassio 镜像,再运行咯。
对比上面的命令会发现 neroxps/qemux86-64-homeassistant 这个容器其实是我根据 homeassistant/qemux86-64-homeassistant 容器修改的,详情可以看这个帖子发布 hassio 的 homeassistant 镜像(仅支持amd64)


4. 启动后没有 hassio 怎么办?

当 homeassistant 启动之后,进去发现没有 hassio 菜单,查日志发现是无法连通 hassio api,查了下 hassio.py 这个插件,发现建立 homeassistant 容器的时候传递了一个 $HASSIO 的变量给homeassistant,这个变量记录了 hassio 的ip地址,而这个ip地址就是 hassio bridge 里面的 ip。

原来当 hassio 运行时候,会初始化一个 hassio bridge,用于分配给所有 hassio addons 的容器,但是当这个 bridge  建立好后,route 里面却没有记录 hassio 网络接口的本地路由条目,导致网络无法连通,具体为什么连不通,可能是群晖的 docker 问题,也可能是群晖网络问题,对 ip bridge 不太熟悉,所以就不知其原因了。

最后我发现一个解决方案,可以通过重启 hassio 网络接口来修复这个问题。


ifconfig hassio down
ifconfig hassio up


运行后重启 homeassistant 即可。

我写了个脚本,将这个脚本放到群晖一个目录里面(什么目录都可以自己喜欢),然后利用群晖的计划任务来启动脚本,达到修复 hassio 网路不运作的问题。


如果重启后发现 homeassistant 依然无法找到 hassio,请使用 root 账号登陆群晖 ssh,找到 /var/log/hassio-network.log 贴出来回帖吧。


群晖 hassio 下已知问题

  • homebridge 有时候重启群晖会启动失败,建议使用 marcoraddatz/homebridge 代替,不是用 addons 的 homebridge 就没问题了。
  • FTP 重启后启动失败,具体为什么启动失败我还没查到,但是只要在 hassio 中启动 FTP 就修复了。


最后给新手的忠告

hassio 的确方便,但方便的代价是排错困难,当你不了解 homeassistant 的配置文档,不了解 homeassistant 的架构,先从 hassio 入手的话,出错了自己会一脸茫然,然后就出现各种 hassio
为何不稳定啊,hassio 封闭的说法。

其实 hassio 是集成了 docker 的所有优点,docker 是什么,就是一个集装箱,他将所有的环境都封装好,不需要你管环境的问题,开发者已经将所有的环境问题解决了。

我这里建议,先学 homeassistant 的尽量看看论坛置顶帖的手动部署文档,先让 homeassistant 跑起来,等坑填的差不多了,再学习下 docker 的基本使用方法,对要学习 docker,因为 hassio 的所有插件都是跑在 docker 下,如果学会 docker 你将受用终身。

我推荐的部署环境是 debian(ubuntu等) + docker + hassio。树莓派的用户也适用,homeassistant 这种开源系统,不要想他能有多简单,即使出了 UI 配置,也需要底层运维支持。千万不要刷官方的那个 hassio(即使开了 SSH) ,因为你不懂 linux 系统,而且还要从一个非常少资料查询的系统开始学起,无疑是开启了困难模式。




fix-dsm-hassio-netowrk.sh

4.14 KB, 下载次数: 103

评分

参与人数 7金钱 +75 收起 理由
cym9007 + 2 感谢楼主分享!
sconio + 8 谢谢楼主
咸味土豆 + 20 回头再看,学习学习。
flashsoft + 10 为了群辉,干一杯
charles0568 + 5 膜拜大神!
lidicn + 20 望尘莫及啊!
windgo + 10 膜拜大神!

查看全部评分

Nero
回复

使用道具 举报

11

主题

124

帖子

1015

积分

论坛积极会员

积分
1015
金钱
891
HASS币
0
发表于 2018-5-1 11:41:27 | 显示全部楼层
WX20180501-113328@2x.png
当HASS.IO版本更新时,docker里面就不断重启
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
 楼主| 发表于 2018-5-3 16:27:20 | 显示全部楼层
小来 发表于 2018-5-1 11:41
当HASS.IO版本更新时,docker里面就不断重启

此问题已在 2018年5月3日 更新解决。
Nero
回复

使用道具 举报

17

主题

418

帖子

2816

积分

金牌会员

Rank: 6Rank: 6

积分
2816
金钱
2398
HASS币
0

教程狂人

发表于 2018-1-26 20:19:13 | 显示全部楼层
本帖最后由 kay7758 于 2018-1-26 20:20 编辑

支持,我最初是用老高的教程hassbian,在香橙派(这东西便宜,不过性能实在不行,没用几天丢了)上跑,后来出了hass.io,很多人说好用,也有人说不稳定,开始不想用的,无奈说好话的多,心动了,那时候我还是树莓派,跟风也刷了,折腾两三天,各种问题,自己不懂,又找不到解决办法,又回到hassbian,这个是刚开始就用的,基本问题都可以自己解决了,后来树莓派总感觉卡了,换V5上esxi带lede,debian+docker+hassio,使用也有段时间了,感觉还不错,这还得感谢楼主帮助提供思路,不过目前对docker还是一知半解的,这个需要有时间系统行学习才行

目前想在V5上搞黑裙,还在犹豫,在现在的esxi上直接加个虚拟机跑黑裙好,还是直接在宿主机上黑裙,再在黑裙上跑LEDE+docker+hassio好
回复

使用道具 举报

74

主题

1942

帖子

7885

积分

元老级技术达人

积分
7885
金钱
5893
HASS币
430

活跃会员教程狂人

发表于 2018-1-26 20:34:25 | 显示全部楼层
本帖最后由 咸味土豆 于 2018-1-26 20:39 编辑

大神解释的很是透彻,多谢普及。我还以为homeassistant本身也是运行在docker环境下的了。
所有过往,皆为序章。
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
 楼主| 发表于 2018-1-26 21:17:02 | 显示全部楼层
本帖最后由 neroxps 于 2018-1-26 21:18 编辑
kay7758 发表于 2018-1-26 20:19
支持,我最初是用老高的教程hassbian,在香橙派(这东西便宜,不过性能实在不行,没用几天丢了)上跑,后来出 ...

我推荐 esxi 这样才是最多选择,群晖系统始终有局限性。
我现在就是 esxi 虚拟化,上门跑 爱块+debian(hassio)+群晖。

我本身不喜欢用群晖做太多东西,让他安安静静做一个nas就好了。
Nero
回复

使用道具 举报

17

主题

418

帖子

2816

积分

金牌会员

Rank: 6Rank: 6

积分
2816
金钱
2398
HASS币
0

教程狂人

发表于 2018-1-26 21:41:48 | 显示全部楼层
neroxps 发表于 2018-1-26 21:17
我推荐 esxi 这样才是最多选择,群晖系统始终有局限性。
我现在就是 esxi 虚拟化,上门跑 爱块+debian(ha ...

也是看到群里不少人说用群晖玩KVM才有想法的,以前从来没用过群晖,算了,还是ESXI吧,刚完定ESXI的皮毛,有换个群晖,不折腾了
回复

使用道具 举报

6

主题

556

帖子

3476

积分

论坛元老

Rank: 8Rank: 8

积分
3476
金钱
2920
HASS币
0
发表于 2018-3-12 18:38:49 | 显示全部楼层
楼主真棒!!!
回复

使用道具 举报

25

主题

441

帖子

2338

积分

论坛积极会员

积分
2338
金钱
1897
HASS币
0
发表于 2018-3-13 20:28:52 | 显示全部楼层
想不到还有这样一个帖子 给那个新人贴搞晕了 谢谢楼主
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
 楼主| 发表于 2018-3-13 20:32:44 | 显示全部楼层
13857781577 发表于 2018-3-13 20:28
想不到还有这样一个帖子 给那个新人贴搞晕了 谢谢楼主

就是啊,这么好的帖子没人收录,好郁闷呢,哼哼~~
Nero
回复

使用道具 举报

25

主题

441

帖子

2338

积分

论坛积极会员

积分
2338
金钱
1897
HASS币
0
发表于 2018-3-14 00:06:59 来自手机 | 显示全部楼层
群晖docker已经安装成功 但是appdaemon安装后无法运行!
5BFE4E12-38FA-46BA-9BF3-1AAE26FE37F3.jpeg
0E599CAB-31BD-465A-A79B-5289FDF00D03.png
回复

使用道具 举报

25

主题

441

帖子

2338

积分

论坛积极会员

积分
2338
金钱
1897
HASS币
0
发表于 2018-3-14 00:24:22 来自手机 | 显示全部楼层
求楼主帮忙
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-19 09:10 , Processed in 0.124826 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表