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

前言

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

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

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

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

90fd3da6gw1f6oy4pg6doj20jq0e6juq.jpg

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

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

netstat -lnp

90fd3da6jw1f6oybet8w3j20rx0db10q.jpg

图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服务?

90fd3da6jw1f6oyunxsclj211g0gfn8p.jpg

图3 - 系统情况】

90fd3da6jw1f6oz745y3jj20k00zkq5k.jpg

图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

90fd3da6jw1f6ozlsu785j20bx06j75t.jpg

图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

90fd3da6jw1f6p146mf58j20i10anwi6.jpg

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

总结

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

转载于:https://www.cnblogs.com/sjqlwy/p/edison-ssh.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值