Intel Edision —— 从SSH无法连接到systemd

前言

原创文章,转载引用务必注明链接。如有疏漏,欢迎斧正。

最近在试用Wyliodrin,安装过程中出现了两个问题,一是无法使用SSH登录到Edison;二是EDISON磁盘的问题。分别涉及到systemd和linux文件系统之/dev/loop的理解。

测试环境:Windows 7 64 bit,Xshell 5,WIFI,Intel Edison 最新固件

配置完成后无法通过SSH连接到开发板

图1 - Intel Edison 配置向导】可以看到此时设置了SSH密码,并连接到了无线网,理论上可以正常连接,根据群里其他人的反馈确实如此

但是我自己测试发现,无法通过SSH连接,串口连接正常(注意,会显示两个串口,试两次就ok了),网络连接正常,为了找问题,我们看一看22端口被谁占用了:

netstat -lnp

图2 - 系统端口开放情况】可以看到22被PID为1的init初始进程占用,这里可以以及后面佐证可以看到,Edison使用的Yocto Project使用systemd进行管理。之前在树莓派上使用过Raspbian,基于Debian Jessie,也是使用systemd管理,但是Yocto比Debian Jessie 使用systemd更彻底,类似Arch Linux。

解决问题以及探讨可能机制

经群友提醒,重新刷了一边固件,这次可以正常使用SSH登录了,但是22端口仍然被init占用,所以这里我们分析一下。

注意:

systemd入门教程推荐看阮一峰的博客,简洁明了:12

系统有没有安装SSH服务?

图3 - 系统情况】

图4 - JuiceSSH连接Edison】这里发现系统安装了openssh这个SSH程序,包括服务端和客户端,此外也开启了sshd服务。其中192.168.1.104为Edison地址,108为本机地址,看起来似乎是使用配置向导时配置的,这里起初以为被设置为仅可以使用特定主机、特定网络、本块Edison开发板才可以连接SSH,用手机试了一下,并非如此,其他设备也可以连接。

  • static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖

我们查看一下sshd@0-192.168.1.104:22-192.168.1.108:52281.service 里面写的什么:

systemctl cat sshd@0-192.168.1.104:22-192.168.1.108:52281.service

图5 - sshd配置文件】可以看到配置文件本体是sshd@.service,启动时执行的命令为/usr/sbin/sshd -i,依赖并在sshdgenkeys.service之后启动。具体请参看阮一峰的博客(二)以及金步国先生翻译的sshd手册

sshd -i:ssh以inetd方式运行;

来自: http://man.linuxde.net/sshd

StandardInput=socket,通过socket传入参数

inetd、socket 与 systemd

一般的启动都是直接写好参数然后让sshd后台运行,这里我们发现了一个参数-i,以及得知一个关键词inetd。继续查找资料,看到OpneBSD手册关于inetd的部分

DESCRIPTION

inetd should be run at boot time by /etc/rc (see rc(8)). It then listens for connections on certain internet sockets. When a connection is found on one of its sockets, it decides what service the socket corresponds to, and invokes a program to service the request. After the program is finished, it continues to listen on the socket (except in some cases which will be described below). Essentially, inetd allows running one daemon to invoke several others, reducing load on the system.

大致可以这样理解,inetd相当于一个总管,它监听网络上的socket,并根据其特征来分发到对应的后台服务,通常情况下,处理完一个socket之后它会继续监听。这样的好处是仅通过一个守护进程(daemon)来调用多个服务,可以减少系统负载,但是随之可能会导致效率有所降低。

这里猜测init进程监听22端口,并将接收到的网络socket根据特征分发到制定后台服务,其中之一就是sshd(openssh服务器)。这里理解有误,希望大家指正。

观察一下Linux系统启动树:

systemd-cgls

【Linux系统启动树】systemd-cgls命令可以树形递归显示 Linux 控制组结构层次,这里看到init进程后会启动sshd服务。

总结

本文从探讨Edison开启SSH服务的方式入手,主要介绍了systemd机制以及systemctl的部分用法。openssh通过inetd方式开启服务,由init进程监听22端口,将SSH连接请求传递给sshd,与传统直接让sshd监听22端口的方式不同,可能是因为还有其他服务会用到22端口。

posted @ 2017-01-19 11:36  思兼  阅读(737)  评论(0编辑  收藏  举报