社会焦点

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

字号+ 作者: 来源: 2017-04-26

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

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

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

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

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

  containerd是Docker的低级容器技术。

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

  只需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怎么样?

    转载请注明出处。


    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章