10分钟内借助LinuxKit引导OpenSSH服务器

-回复 -浏览
楼主 2019-01-10 14:56:13
举报 只看此人 收藏本贴 楼主

我们在本文中将逐步介绍使用Docker的LinuxKit,构建、运行和使用连接至内置OpenSSH的可引导Linux系统映像。就本文中的例子而言,你需要Docker for Mac,但LinuxKit可以创建在许多类型的系统上引导的映像。


Dockercon大会期间,在奥斯汀的一家星巴克首次运行LinuxKit。


LinuxKit是个激动人心的新项目,它从Docker的内部派生出来。它旨在构建可引导的Linux系统,而这种系统可以在裸机、云端或Docker容器中运行,也可以通过HyperKit(用于Docker for Mac的虚拟机管理程序)来运行。一个很小的init进程启动系统,然后其余一切经由containerd,通过容器来运行。


containerd是Docker的低级容器技术。

只需10分钟即可入手


  • 从https://golang.org/dl/安装和配置go。

  • 安装并启动Docker for Mac,选择边缘版本(我用的是17.05.0-ce-rc1-mac8)。


我想为大家演示如何在大约10分钟内构建和运行一台SSHD服务器。我们将使用由罗尔夫·纽格鲍尔(Rolf Neugebauer)在Dockercon的全体大会上演示的一个例子。


开始入手


先获取LinuxKit的代码,然后编译构建代码。


# git clone https://github.com/linuxkit/linuxkit

现在进入到目录,开始执行make:

# cd $GOPATH/src/github.com/linuxkit/linuxkit

# make


你会看到类似这样的输出结果:


tar cf - vendor src/initrd src/pad4 -C src/cmd/moby . | docker run

 --rm --net=none --log-driver=none -i -e GOOS=darwin -e GOARCH=amd64 

linuxkit/go-

compile:4513068d9a7e919e4ec42e2d7ee879ff5b95b7f5@sha256:bdfadbe3e4e

c699ca45b67453662321ec270f2d1a1dbdbf09625776d3ebd68c5 --package 

github.com/linuxkit/linuxkit --ldflags "-X 

main.GitCommit=90d459a82eac9111a08795d6e2a89f32c270e41e -X 

main.Version="0.0" " -o bin/moby > tmp_moby_bin.tar  

gofmt...  

govet...  

golint...  

ineffassign...  

go build...  

tar xf tmp_moby_bin.tar > bin/moby  

rm tmp_moby_bin.tar  

touch bin/moby  

tar cf - vendor -C src/cmd/infrakit-instance-hyperkit . | docker 

run --rm --net=none --log-driver=none -i -e GOOS=darwin –e

GOARCH=amd64 linuxkit/go-

compile:4513068d9a7e919e4ec42e2d7ee879ff5b95b7f5@sha256:bdfadbe3e4e

c699ca45b67453662321ec270f2d1a1dbdbf09625776d3ebd68c5 --package 

github.com/linuxkit/linuxkit -o bin/infrakit-instance-hyperkit > 

tmp_infrakit_instance_hyperkit_bin.tar  

gofmt...  

govet...  

golint...  

ineffassign...  

go build...  

tar xf tmp_infrakit_instance_hyperkit_bin.tar > bin/infrakit-

instance-hyperkit  

rm tmp_infrakit_instance_hyperkit_bin.tar  

touch bin/infrakit-instance-hyperkit  


这构建了两个新的CLI,名为moby和linuxkit,它们可以用来构建和启动可引导的系统。


安装新的moby和linuxkit CLI:


sudo cp ./bin/moby /usr/local/bin  

sudo cp ./bin/linuxkit /usr/local/bin  


构建SSHD例子


我使用一些实用脚本组建了一个sshdkit Github代码库(https://github.com/alexellis/sshdkit),我们将把该代码库复制到当前文件夹,文章后面要用到它。


# git clone https://github.com/alexellis/sshdkit

# cd sshdkit

把你的公共SSH密钥放入到YAML文件中:

# cp sshd.example.yml sshd.yml


首先编辑sshd.yml示例文件,把你的ssh密钥放入到显示root/.ssh/authorized_keys的slot中:


 - path: root/.ssh/authorized_keys

    contents: "ssh-rsa ...."


ssh密钥将放在$HOME/.ssh/id_rsa.pub中,如果没有该文件,那么输入ssh-keygen,对于所有问题一律按回车键。


现在构建一个可引导的系统:


# moby build ./sshd.yml


你会看到moby CLI工具会将各个映像下拉出来,然后构建一个最终的软件包(包括最近的Linux内核)。


Extract kernel image: linuxkit/kernel:4.9.x  

Add init containers:  

Process init image: linuxkit/init:63eed9ca7a09d2ce4c0c5e7238ac005fa44f564b  

Process init image: linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9  

Process init image: linuxkit/containerd:18eaf72f3f4f9a9f29ca1951f66df701f873060b  

Process init image: linuxkit/ca-certificates:eabc5a6e59f05aa91529d80e9a595b85b046f935  

Add onboot containers:  

  Create OCI config for linuxkit/sysctl:2cf2f9d5b4d314ba1bfc22b2fe931924af666d8c

Add service containers:  

  Create OCI config for linuxkit/rngd:3dad6dd43270fa632ac031e99d1947f20b22eec9

  Create OCI config for linuxkit/dhcpcd:48e249ebef6a521eed886b3bce032db69fbb4afa

  Create OCI config for linuxkit/sshd:e108d208adf692c8a0954f602743e0eec445364e

Add files:  

  root/.ssh/authorized_keys

Create outputs:  

  sshd-bzImage sshd-initrd.img sshd-cmdline

  sshd.iso

  sshd-efi.iso

你会看到当前文件夹中已构建了几个系统映像:

Create outputs:  

  sshd-bzImage sshd-initrd.img sshd-cmdline

  sshd.iso

  sshd-efi.iso


引导系统


现在只管输入下列内容,看看一个完整的Linux系统在终端中引导。一旦准备就绪,你将连接至BusyBox外壳,可以输入命令。


这会利用HyperKit项目作为虚拟机管理程序。若要关闭虚拟机,如果你已准备好,只需输入halt。


# linuxkit run -ip 192.168.65.100 sshd

 

Welcome to LinuxKit  

/ # INFO[0000] starting containerd boot...                   module=containerd

...

INFO[0000] containerd successfully booted in 0.022888s   module=containerd  

 - 000-sysctl

 - dhcpcd

 - rngd

 - sshd

/ # 


我们还分配了一个静态的IP地址,那样以后就能访问它。


要访问我们在HyperKit中启动的SSHD虚拟机,最容易的方法就是运行内置SSH客户软件和SSH密钥的Docker容器。


使用随附的实用脚本来构建该Docker映像:


# ./build.sh


现在运行Docker容器,这其实是Alpine Linux映像,已添加了SSHD,并已挂载了你的SSH密钥:


# ./run-client.sh

/ #


通过该Docker容器,我们就可以使用ssh客户软件连入至SSH虚拟机:


/ # ssh root@192.168.65.100

 

Welcome to LinuxKit  

moby-025000000002:~# cat /etc/os-release  

NAME="Alpine Linux"  

ID=alpine  

VERSION_ID=3.5.0  

PRETTY_NAME="Alpine Linux v3.5"  

HOME_URL="http://alpinelinux.org"  

BUG_REPORT_URL="http://bugs.alpinelinux.org"

 

moby-025000000002:~# uname -a  

Linux moby-025000000002 4.9.22-moby #1 SMP Fri Apr 14 12:32:33 UTC 2017 x86_64 Linux  

正如你所见,该系统运行containerd和runc:

moby-025000000002:~# ps |grep containerd  

  356 root       0:00 /usr/bin/containerd

 

...

 

moby-025000000002:~# ps |grep runc  

  392 root       0:00 /usr/bin/runc run --bundle 

/containers/services/dhcpcd --pid-file /run/dhcpcd.pid dhcpcd

  408 root       0:00 /usr/bin/runc run –bundle

/containers/services/rngd --pid-file /run/rngd.pid rngd

  420 root       0:00 /usr/bin/runc run --bundle 

/containers/services/sshd --pid-file /run/sshd.pid sshd


引导多个SSDH虚拟机:


你可以引导额外的系统,只需要为它们分配单独的IP地址。这是boot.sh文件(linuxkit run -ip 192.168.65.100 sshd)的内容:


用独特的IP地址来引导:


# linuxkit run -ip 192.168.65.101 sshd


在我的台2016入门级Macbook 12英寸电脑上,这个过程只有约4至5秒,感觉相当快。


现在,你可以连接至那些SSHD服务器中的一台,也可以同时连接两台。


/ # ssh root@192.168.65.100 uptime

 10:45:39 up 29 min,  load average: 0.00, 0.02, 0.00

 

/ # ssh root@192.168.65.101 uptime

 10:45:40 up 1 min,  load average: 0.00, 0.00, 0.00

/ # 


结束语


这个很简单的例子表明了如何借助一项实用的系统服务构建可引导的映像,然后连接至它。让人觉得这个项目带来了无尽的机会。我很想看看别人会如何灵活地使用这个工具。


如果你是谷歌云用户,可以在谷歌云端同样轻松地引导映像。PacketHost甚至支持引导我们就在裸机服务器上构建的映像。


·Raspberry Pi怎么样?


我认为,从概念上来说,LinuxKit最终有望为32位的Raspberry Pi架构构建映像,但这需要对用来构建系统的内核和映像进行一番调整和移植。眼下,想开始入手Raspberry Pi,最容易的方法就是借助Raspbian映像和我撰写的教程系列。


RancherOS是一种操作系统,使用Docker作为起点,通过Docker容器来运行所有系统服务。LinuxKit以一种非常相似的方式来运行,但是直接使用containerd,而不是使用Docker。


相关阅读:

Docker 改名 Moby 目的 :商业化

Docker 重磅发布:LinuxKit 和 Moby 开源项目


我要推荐
转发到