Sut i ddechrau defnyddio Modd Defnyddiwr yn Linux

Cyflwyniad gan y cyfieithydd: Yn erbyn cefndir y mynediad enfawr i'n bywydau o wahanol fathau o gynwysyddion, gall fod yn eithaf diddorol a defnyddiol i ddarganfod gyda pha dechnolegau y dechreuodd y cyfan unwaith. Gellir defnyddio rhai ohonynt yn ddefnyddiol hyd heddiw, ond nid yw pawb yn cofio dulliau o'r fath (neu'n gwybod os na chawsant eu dal yn ystod eu datblygiad cyflym). Un dechnoleg o'r fath yw User Mode Linux. Gwnaeth awdur y gwreiddiol lawer o gloddio, gan ddarganfod pa rai o'r hen ddatblygiadau sy'n dal i weithio a pha rai nad ydynt, a lluniodd rywbeth fel cyfarwyddyd cam wrth gam ar sut i gael UML cartref yn 2k19 i chi'ch hun. A do, fe wahoddon ni awdur y post gwreiddiol i Habr Cadey, felly os oes gennych unrhyw gwestiynau - gofynnwch yn Saesneg yn y sylwadau.

Sut i ddechrau defnyddio Modd Defnyddiwr yn Linux

Mae Modd Defnyddiwr yn Linux, mewn gwirionedd, yn borthladd o'r cnewyllyn Linux iddo'i hun. Mae'r modd hwn yn caniatáu ichi redeg cnewyllyn Linux llawn fel proses defnyddiwr ac fe'i defnyddir yn gyffredin gan ddatblygwyr i brofi gyrwyr. Ond mae'r modd hwn hefyd yn ddefnyddiol fel offeryn ynysu cyffredinol, y mae ei egwyddor yn debyg i weithrediad peiriannau rhithwir. Mae'r modd hwn yn darparu mwy o ynysu na Docker, ond yn llai na pheiriant rhithwir llawn fel KVM neu Virtual Box.

Yn gyffredinol, gall Modd Defnyddiwr ymddangos fel offeryn rhyfedd ac anodd ei ddefnyddio, ond mae ganddo ddefnyddiau o hyd. Wedi'r cyfan, mae hwn yn gnewyllyn Linux llawn sy'n rhedeg o ddefnyddiwr di-freintiedig. Mae'r nodwedd hon yn caniatáu i god a allai fod yn ddiymddiried redeg heb unrhyw fygythiad i'r peiriant gwesteiwr. A chan fod hwn yn gnewyllyn llawn, mae ei brosesau wedi'u hynysu oddi wrth y peiriant gwesteiwr, hynny yw ni fydd prosesau sy'n rhedeg y tu mewn i Modd Defnyddiwr yn weladwy i'r gwesteiwr. Nid yw hyn yn debyg i gynhwysydd Dociwr traddodiadol, lle mae'r peiriant cynnal bob amser yn gweld y prosesau y tu mewn i'r storfa. Edrychwch ar y darn hwn o pstree gan un o'm gweinyddwyr:

containerd─┬─containerd-shim─┬─tini─┬─dnsd───19*[{dnsd}]
           │                 │      └─s6-svscan───s6-supervise
           │                 └─10*[{containerd-shim}]
           ├─containerd-shim─┬─tini─┬─aerial───21*[{aerial}]
           │                 │      └─s6-svscan───s6-supervise
           │                 └─10*[{containerd-shim}]
           ├─containerd-shim─┬─tini─┬─s6-svscan───s6-supervise
           │                 │      └─surl
           │                 └─9*[{containerd-shim}]
           ├─containerd-shim─┬─tini─┬─h───13*[{h}]
           │                 │      └─s6-svscan───s6-supervise
           │                 └─10*[{containerd-shim}]
           ├─containerd-shim─┬─goproxy───14*[{goproxy}]
           │                 └─9*[{containerd-shim}]
           └─32*[{containerd}]

A chymharwch hyn â pstree y cnewyllyn Linux yn y Modd Defnyddiwr:

linux─┬─5*[linux]
      └─slirp

Wrth weithio gyda chynwysyddion Docker, gallaf weld gan y gwesteiwr enwau'r prosesau sy'n rhedeg yn y gwestai. Nid yw hyn yn bosibl gyda Modd Defnyddiwr Linux. Beth mae'n ei olygu? Mae hyn yn golygu bod offer monitro sy'n rhedeg trwy is-system archwilio Linux peidiwch â gweld prosesau sy'n rhedeg yn y system westeion. Ond mewn rhai sefyllfaoedd, gall y nodwedd hon ddod yn gleddyf dau ymyl.

Yn gyffredinol, mae'r swydd gyfan isod yn gasgliad o ymchwil ac ymdrechion bras i gyflawni'r canlyniad a ddymunir. I wneud hyn, roedd yn rhaid i mi ddefnyddio gwahanol offer hynafol, darllen y ffynonellau cnewyllyn, dadfygio cod a ysgrifennwyd yn y dyddiau pan oeddwn yn dal yn yr ysgol elfennol, a hefyd tincer gydag adeiladau Heroku gan ddefnyddio deuaidd arbennig i ddod o hyd i'r offer yr oeddwn eu hangen . Arweiniodd yr holl waith hwn i'r dynion ar fy IRC fy ngalw'n hud. Rwy'n gobeithio bod y swydd hon yn ddogfennaeth ddibynadwy i rywun roi cynnig ar yr un peth gyda chnewyllyn mwy newydd a fersiynau OS.

addasiad

Mae sefydlu Modd Defnyddiwr Linux yn cael ei wneud mewn sawl cam:

  • gosod dibyniaethau ar y gwesteiwr;
  • llwytho i lawr y cnewyllyn Linux;
  • cyfluniad adeiladu cnewyllyn;
  • cynulliad cnewyllyn;
  • gosodiad deuaidd;
  • ffurfweddu'r system ffeiliau gwestai;
  • dewis paramedrau lansio cnewyllyn;
  • sefydlu rhwydwaith gwesteion;
  • cychwyn y cnewyllyn gwadd.

Rwy'n cymryd, os penderfynwch ei wneud eich hun, y byddwch yn fwyaf tebygol o wneud popeth a ddisgrifir mewn rhyw system tebyg i Ubuntu neu Debian. Ceisiais weithredu pob un o'r uchod yn fy hoff ddosbarthiad - Alpaidd, ond ni ddaeth dim ohono, mae'n debyg oherwydd bod gan y cnewyllyn Linux glibc-isms rhwymol caled ar gyfer gyrwyr yn Modd Defnyddiwr. Rwy'n bwriadu adrodd hyn i fyny'r afon ar ôl i mi ddeall y broblem o'r diwedd.

Gosod dibyniaethau ar y gwesteiwr

Mae angen o leiaf y pecynnau canlynol ar Ubuntu i adeiladu'r cnewyllyn Linux (gan dybio gosodiad glân):

- 'build-essential'
- 'flex'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certificates'
- 'bc'
- 'linux-headers'

Gallwch eu gosod gan ddefnyddio'r gorchymyn canlynol (fel gwraidd neu ddefnyddio sudo):

apt-get -y install build-essential flex bison xz-utils wget ca-certificates bc 
                   linux-headers-$(uname -r)

Sylwch y bydd angen gosod rhaglen gosod dewislen cnewyllyn Linux i redeg libncurses-dev. Gwnewch yn siŵr ei fod wedi'i osod gyda'r gorchymyn canlynol (fel gwraidd neu gyda sudo):

apt-get -y install libncurses-dev

Cnewyllyn llwytho i lawr

Penderfynwch ble i lawrlwytho ac yna adeiladu'r cnewyllyn. Ar gyfer y llawdriniaeth hon, bydd angen i chi neilltuo tua 1,3 GB o ofod disg caled, felly gwnewch yn siŵr ei fod gennych.

Ar ôl mynd i cnewyllyn.org a chael yr URL i lawrlwytho'r cnewyllyn sefydlog diweddaraf. Ar adeg ysgrifennu'r swydd hon: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Lawrlwythwch y ffeil hon gan ddefnyddio 'wget':

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Ac echdynnu gyda 'tar':

tar xJf linux-5.1.16.tar.xz

Nawr rydyn ni'n mynd i mewn i'r cyfeiriadur a grëwyd wrth ddadbacio'r tarball:

cd linux-5.1.16

Gosodiad adeiladu cnewyllyn

Mae'r system adeiladu cnewyllyn yn set Makefiles с llawer offer a sgriptiau arfer i awtomeiddio'r broses. I ddechrau, agorwch y rhaglen gosod ar-lein:

make ARCH=um menuconfig

Bydd yn rhannol adeiladu ac arddangos blwch deialog i chi. Pryd '[Select]', byddwch yn gallu ffurfweddu gan ddefnyddio'r bysellau Gofod neu Enter. Llywiwch y ffenestr, yn ôl yr arfer, gyda'r saethau bysellfwrdd "i fyny" ac "i lawr", a dewis elfennau - "chwith" neu "dde".

Mae'r pwyntydd gweld —> yn golygu eich bod mewn is-ddewislen, y gellir ei gyrchu gan yr allwedd Enter. Mae'r ffordd allan ohono yn amlwg trwy'[Exit]'.

Cynhwyswch yr opsiynau canlynol yn '[Select]' a gwnewch yn siŵr bod ganddyn nhw '[*]' wrth eu hymyl:

UML-specific Options:
  - Host filesystem
Networking support (enable this to get the submenu to show up):
  - Networking options:
    - TCP/IP Networking
UML Network devices:
  - Virtual network device
  - SLiRP transport

Dyna ni, gallwch chi adael y ffenestr hon trwy ddewis yn olynol '[Exit]'. Gwnewch yn siŵr eich bod yn cael eich annog i gadw'r ffurfweddiad ar y diwedd a dewis '[Yes]'.

Rwy'n argymell eich bod chi'n chwarae o gwmpas gyda'r opsiynau adeiladu cnewyllyn ar ôl darllen y post hwn. O'r arbrofion hyn gallwch ddysgu llawer am sut mae mecaneg cnewyllyn lefel isel yn gweithio a sut mae baneri gwahanol yn effeithio ar sut mae'r cnewyllyn yn cael ei adeiladu.

Adeiladu'r cnewyllyn

Mae'r cnewyllyn Linux yn rhaglen fawr sy'n gwneud llawer o bethau. Hyd yn oed gyda chyfluniad mor fach ar hen galedwedd, gall gymryd cryn dipyn o amser i'w adeiladu. Felly adeiladwch y cnewyllyn gyda'r gorchymyn canlynol:

make ARCH=um -j$(nproc)

Am beth? Bydd y gorchymyn hwn yn dweud wrth ein hadeiladwr i ddefnyddio'r holl greiddiau ac edafedd CPU sydd ar gael yn ystod y broses adeiladu. Tîm $(nproc) ar ddiwedd Build yn amnewid allbwn y gorchymyn nproc, sy'n rhan o coreutils yn adeilad safonol Ubuntu.

Ar ôl peth amser, bydd ein cnewyllyn yn cael ei lunio yn ffeil gweithredadwy ./linux.

Gosod y deuaidd

Gan fod Modd Defnyddiwr yn Linux yn creu deuaidd rheolaidd, gallwch ei osod fel unrhyw gyfleustodau eraill. Dyma sut wnes i e:

mkdir -p ~/bin
cp linux ~/bin/linux

Mae hefyd yn werth gwneud yn siŵr hynny ~/bin yn eich $PATH:

export PATH=$PATH:$HOME/bin

Sefydlu'r system ffeiliau gwestai

Creu cyfeiriadur ar gyfer y system ffeiliau gwestai:

mkdir -p $HOME/prefix/uml-demo
cd $HOME/prefix

Agorwch alpinelinux.org ac i mewn adran lawrlwytho dod o hyd i'r ddolen lawrlwytho go iawn MINI ROOT FILESYSTEM. Ar adeg ysgrifennu hwn oedd:

http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gz

Dadlwythwch y tarball hwn gan ddefnyddio wget:

wget -O alpine-rootfs.tgz http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gz

Nawr nodwch gyfeiriadur y system ffeiliau gwestai a thynnwch yr archif:

cd uml-demo
tar xf ../alpine-rootfs.tgz

Bydd y camau gweithredu a ddisgrifir yn creu templed system ffeiliau bach. Oherwydd natur y system, bydd yn hynod o anodd gosod pecynnau trwy'r rheolwr apk Alpaidd. Ond bydd yr FS hwn yn ddigon i werthuso'r syniad cyffredinol.

Mae angen teclyn arnom hefyd tini i atal defnydd cof prosesau zombie ein cnewyllyn gwadd.

wget -O tini https://github.com/krallin/tini/releases/download/v0.18.0/tini-static
chmod +x tini

Creu llinell orchymyn cnewyllyn

Mae gan y cnewyllyn Linux, fel y mwyafrif o raglenni eraill, ddadleuon llinell orchymyn y gellir eu cyrchu trwy nodi'r allwedd --help.

Ei Hun—help

linux --help
User Mode Linux v5.1.16
        available at http://user-mode-linux.sourceforge.net/

--showconfig
    Prints the config file that this UML binary was generated from.

iomem=<name>,<file>
    Configure <file> as an IO memory region named <name>.

mem=<Amount of desired ram>
    This controls how much "physical" memory the kernel allocates
    for the system. The size is specified as a number followed by
    one of 'k', 'K', 'm', 'M', which have the obvious meanings.
    This is not related to the amount of memory in the host.  It can
    be more, and the excess, if it's ever used, will just be swapped out.
        Example: mem=64M

--help
    Prints this message.

debug
    this flag is not needed to run gdb on UML in skas mode

root=<file containing the root fs>
    This is actually used by the generic kernel in exactly the same
    way as in any other kernel. If you configure a number of block
    devices and want to boot off something other than ubd0, you
    would use something like:
        root=/dev/ubd5

--version
    Prints the version number of the kernel.

umid=<name>
    This is used to assign a unique identity to this UML machine and
    is used for naming the pid file and management console socket.

con[0-9]*=<channel description>
    Attach a console or serial line to a host channel.  See
    http://user-mode-linux.sourceforge.net/old/input.html for a complete
    description of this switch.

eth[0-9]+=<transport>,<options>
    Configure a network device.
    
aio=2.4
    This is used to force UML to use 2.4-style AIO even when 2.6 AIO is
    available.  2.4 AIO is a single thread that handles one request at a
    time, synchronously.  2.6 AIO is a thread which uses the 2.6 AIO
    interface to handle an arbitrary number of pending requests.  2.6 AIO
    is not available in tt mode, on 2.4 hosts, or when UML is built with
    /usr/include/linux/aio_abi.h not available.  Many distributions don't
    include aio_abi.h, so you will need to copy it from a kernel tree to
    your /usr/include/linux in order to build an AIO-capable UML

nosysemu
    Turns off syscall emulation patch for ptrace (SYSEMU).
    SYSEMU is a performance-patch introduced by Laurent Vivier. It changes
    behaviour of ptrace() and helps reduce host context switch rates.
    To make it work, you need a kernel patch for your host, too.
    See http://perso.wanadoo.fr/laurent.vivier/UML/ for further
    information.

uml_dir=<directory>
    The location to place the pid and umid files.

quiet
    Turns off information messages during boot.

hostfs=<root dir>,<flags>,...
    This is used to set hostfs parameters.  The root directory argument
    is used to confine all hostfs mounts to within the specified directory
    tree on the host.  If this isn't specified, then a user inside UML can
    mount anything on the host that's accessible to the user that's running
    it.
    The only flag currently supported is 'append', which specifies that all
    files opened by hostfs will be opened in append mode.

Mae'r panel hwn yn amlygu prif baramedrau'r lansiad. Gadewch i ni redeg y cnewyllyn gyda'r set lleiaf posibl o opsiynau:

linux 
  root=/dev/root 
  rootfstype=hostfs 
  rootflags=$HOME/prefix/uml-demo 
  rw 
  mem=64M 
  init=/bin/sh

Mae'r llinellau uchod yn dweud y canlynol i'n cnewyllyn:

  • Tybiwch fod y system ffeiliau gwraidd yn ddyfais ffug /dev/root.
  • Dewiswch hostfs fel gyrrwr system ffeiliau gwraidd.
  • Gosodwch y system ffeiliau gwadd a grëwyd gennym ar y ddyfais gwraidd.
  • Ac ie, yn y modd darllen-ysgrifennu.
  • Defnyddiwch 64 MB o RAM yn unig (gallwch ddefnyddio llawer llai yn dibynnu ar yr hyn rydych chi'n bwriadu ei wneud, ond mae 64 MB yn ymddangos fel y swm gorau posibl).
  • Mae'r cnewyllyn yn cychwyn yn awtomatig /bin/sh как init-proses.

Rhedeg y gorchymyn hwn a dylech gael rhywbeth fel y canlynol:

Un ddalen arall

Core dump limits :
        soft - 0
        hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking environment variables for a tempdir...none found
Checking if /dev/shm is on tmpfs...OK
Checking PROT_EXEC mmap in /dev/shm...OK
Adding 32137216 bytes to physical memory to account for exec-shield gap
Linux version 5.1.16 (cadey@kahless) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 Sun Jul 7 18:57:19 UTC 2019
Built 1 zonelists, mobility grouping on.  Total pages: 23898
Kernel command line: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)
Inode-cache hash table entries: 8192 (order: 4, 65536 bytes)
Memory: 59584K/96920K available (2692K kernel code, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K reserved, 0K cma-reserved)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS: 15
clocksource: timer: mask: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns
Calibrating delay loop... 7479.29 BogoMIPS (lpj=37396480)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes)
Checking that host ptys support output SIGIO...Yes
Checking that host ptys support SIGIO on close...No, enabling workaround
devtmpfs: initialized
random: get_random_bytes called from setup_net+0x48/0x1e0 with crng_init=0
Using 2.6 host AIO
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 256 (order: 0, 6144 bytes)
NET: Registered protocol family 16
clocksource: Switched to clocksource timer
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
console [stderr0] disabled
mconsole (version 2) initialized on /home/cadey/.uml/tEwIjm/mconsole
Checking host MADV_REMOVE support...OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
io scheduler noop registered (default)
io scheduler bfq registered
loop: module loaded
NET: Registered protocol family 17
Initialized stdio console driver
Using a channel type which is configured out of UML
setup_one_line failed for device 1 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 2 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 3 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 4 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 5 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 6 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 7 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 8 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 9 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 10 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 11 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 12 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 13 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 14 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 15 : Configuration failed
Console initialized on /dev/tty0
console [tty0] enabled
console [mc-1] enabled
Failed to initialize ubd device 0 :Couldn't determine size of device's file
VFS: Mounted root (hostfs filesystem) on device 0:11.
devtmpfs: mounted
This architecture does not have kernel memory protection.
Run /bin/sh as init process
/bin/sh: can't access tty; job control turned off
random: fast init done
/ # 

Bydd y manipulations uchod yn rhoi i ni system westai o leiaf, heb bethau fel /proc neu enw gwesteiwr a neilltuwyd. Er enghraifft, rhowch gynnig ar y gorchmynion canlynol:

- uname -av
- cat /proc/self/pid
- hostname

I allgofnodi o'r gwestai, teipiwch exit neu reolaeth y wasg-d. Bydd hyn yn lladd y gragen ac yna panig cnewyllyn:

/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: “./linux root=/dev/root rootflag…” terminated by signal SIGABRT (Abort)

Cawsom y panig cnewyllyn hwn oherwydd bod cnewyllyn Linux yn meddwl bod y broses gychwyn bob amser yn rhedeg. Hebddo, ni all y system weithredu mwyach a bydd damweiniau. Ond gan mai proses modd defnyddiwr yw hon, mae'r allbwn canlyniadol yn anfon ei hun ati SIGABRT, sy'n arwain at allbwn.

Gosod rhwydwaith gwesteion

A dyma lle mae pethau'n dechrau mynd o chwith. Rhwydweithio yn Modd Defnyddiwr Linux yw lle mae'r cysyniad cyfan o "modd defnyddiwr" cyfyngedig yn dechrau cwympo. Wedi'r cyfan, fel arfer ar lefel y system, mae'r rhwydwaith yn gyfyngedig breintiedig dulliau dienyddio am bob un ohonom resymau dealladwy.

Nodyn. per.: gallwch ddarllen mwy am y gwahanol opsiynau ar gyfer gweithio gyda rhwydwaith yn UML yma.

Taith i Slirp

Fodd bynnag, mae teclyn hynafol a bron heb ei gefnogi o'r enw Slip, y gall Defnyddiwr Modd Linux ryngweithio â'r rhwydwaith ag ef. Mae'n gweithio'n debyg iawn i stac TCP/IP ar lefel defnyddiwr ac nid oes angen unrhyw ganiatâd system i redeg. Roedd yr offeryn hwn a ryddhawyd yn 1995, ac mae'r diweddariad diweddaraf wedi'i ddyddio 2006 mlynedd. Mae slirp yn hen iawn. Yn ystod yr amser heb gefnogaeth a diweddariadau, mae casglwyr wedi mynd mor bell fel mai dim ond fel hyn y gellir disgrifio'r offeryn hwn pydredd cod.

Felly gadewch i ni lawrlwytho Slirp o ystorfeydd Ubuntu a cheisio ei redeg:

sudo apt-get install slirp
/usr/bin/slirp
Slirp v1.0.17 (BETA)

Copyright (c) 1995,1996 Danny Gasparovski and others.
All rights reserved.
This program is copyrighted, free software.
Please read the file COPYRIGHT that came with the Slirp
package for the terms and conditions of the copyright.

IP address of Slirp host: 127.0.0.1
IP address of your DNS(s): 1.1.1.1, 10.77.0.7
Your address is 10.0.2.15
(or anything else you want)

Type five zeroes (0) to exit.

[autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud]

SLiRP Ready ...
fish: “/usr/bin/slirp” terminated by signal SIGSEGV (Address boundary error)

O dduwiau. Gadewch i ni osod dadfygiwr Slirp a gweld a allwn ddarganfod beth sy'n digwydd yma:

sudo apt-get install gdb slirp-dbgsym
gdb /usr/bin/slirp
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/slirp...Reading symbols from /usr/lib/debug/.build-id/c6/2e75b69581a1ad85f72ac32c0d7af913d4861f.debug...done.
done.
(gdb) run
Starting program: /usr/bin/slirp
Slirp v1.0.17 (BETA)

Copyright (c) 1995,1996 Danny Gasparovski and others.
All rights reserved.
This program is copyrighted, free software.
Please read the file COPYRIGHT that came with the Slirp
package for the terms and conditions of the copyright.

IP address of Slirp host: 127.0.0.1
IP address of your DNS(s): 1.1.1.1, 10.77.0.7
Your address is 10.0.2.15
(or anything else you want)

Type five zeroes (0) to exit.

[autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud]

SLiRP Ready ...

Program received signal SIGSEGV, Segmentation fault.
                                                    ip_slowtimo () at ip_input.c:457
457     ip_input.c: No such file or directory.

Mae'r gwall yn curo ynom ni y llinell hon. Gadewch i ni edrych ar y stactrace, efallai y bydd rhywbeth yn ein helpu ni yno:

(gdb) bt full
#0  ip_slowtimo () at ip_input.c:457
        fp = 0x55784a40
#1  0x000055555556a57c in main_loop () at ./main.c:980
        so = <optimized out>
        so_next = <optimized out>
        timeout = {tv_sec = 0, tv_usec = 0}
        ret = 0
        nfds = 0
        ttyp = <optimized out>
        ttyp2 = <optimized out>
        best_time = <optimized out>
        tmp_time = <optimized out>
#2  0x000055555555b116 in main (argc=1, argv=0x7fffffffdc58) at ./main.c:95
No locals.

Yma fe welwn fod y ddamwain yn digwydd yn ystod cychwyn y brif ddolen pan fydd slip yn ceisio gwirio am oramserau. Ar y pwynt hwn, bu'n rhaid i mi roi'r gorau i geisio dadfygio. Ond gadewch i ni weld a yw Slirp wedi'i adeiladu o waith math. Fe wnes i ail-lwytho'r archif yn uniongyrchol o'r wefan Ffynhonnell, oherwydd mae llusgo rhywbeth oddi yno trwy'r llinell orchymyn yn boen:

cd ~/dl
wget https://xena.greedo.xeserv.us/files/slirp-1.0.16.tar.gz
tar xf slirp-1.0.16.tar.gz
cd slirp-1.0.16/src
./configure --prefix=$HOME/prefix/slirp
make

Yma rydym yn gweld rhybuddion am swyddogaethau adeiledig heb eu diffinio, hynny yw, am yr anallu i gysylltu'r ffeil ddeuaidd sy'n deillio o hynny. Mae'n ymddangos bod gcc, rhwng 2006 a'r pwynt hwn, wedi rhoi'r gorau i gynhyrchu symbolau a ddefnyddir yn swyddogaethau adeiledig ffeiliau canolradd a luniwyd. Gadewch i ni geisio disodli'r allweddair inline ar sylw gwag ac edrychwch ar y canlyniad:

vi slirp.h
:6
a
<enter>
#define inline /**/
<escape>
:wq
make

Naddo. Nid yw hyn yn gweithio ychwaith. Dal methu dod o hyd i symbolau ar gyfer y swyddogaethau hyn.

Ar y pwynt hwn, rhoddais y gorau iddi a dechrau edrych ar Github Heroku adeiladu pecynnau. Fy theori oedd y byddai rhywfaint o becyn adeiladu Heroku yn cynnwys y binaries yr oeddwn eu hangen. Yn y diwedd, arweiniodd y chwilio fi draw yma. Fe wnes i lawrlwytho a dadbacio uml.tar.gz a chanfod y canlynol:

total 6136
-rwxr-xr-x 1 cadey cadey   79744 Dec 10  2017 ifconfig*
-rwxr-xr-x 1 cadey cadey     373 Dec 13  2017 init*
-rwxr-xr-x 1 cadey cadey  149688 Dec 10  2017 insmod*
-rwxr-xr-x 1 cadey cadey   66600 Dec 10  2017 route*
-rwxr-xr-x 1 cadey cadey  181056 Jun 26  2015 slirp*
-rwxr-xr-x 1 cadey cadey 5786592 Dec 15  2017 uml*
-rwxr-xr-x 1 cadey cadey     211 Dec 13  2017 uml_run*

Deuaidd slip yw hwn! Ydy e'n gweithio?

./slirp
Slirp v1.0.17 (BETA) FULL_BOLT

Copyright (c) 1995,1996 Danny Gasparovski and others.
All rights reserved.
This program is copyrighted, free software.
Please read the file COPYRIGHT that came with the Slirp
package for the terms and conditions of the copyright.

IP address of Slirp host: 127.0.0.1
IP address of your DNS(s): 1.1.1.1, 10.77.0.7
Your address is 10.0.2.15
(or anything else you want)

Type five zeroes (0) to exit.

[autodetect SLIP/CSLIP, MTU 1500, MRU 1500]

SLiRP Ready ...

Nid yw'n damwain - felly dylai weithio! Gadewch i ni blannu'r deuaidd hwn i mewn ~/bin/slirp:

cp slirp ~/bin/slirp

Rhag ofn y bydd crëwr y pecyn yn ei ddileu, I gwneud drych.

Cyfluniad rhwydwaith

Nawr, gadewch i ni sefydlu'r rhwydwaith ar ein cnewyllyn gwadd. Diweddaru opsiynau lansio:

linux 
  root=/dev/root 
  rootfstype=hostfs 
  rootflags=$HOME/prefix/uml-demo 
  rw 
  mem=64M 
  eth0=slirp,,$HOME/bin/slirp 
  init=/bin/sh

Nawr, gadewch i ni droi'r rhwydwaith ymlaen:

mount -t proc proc proc/
mount -t sysfs sys sys/

ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15
route add default gw 10.0.2.2

Y ddau orchymyn cyfluniad cyntaf /proc и /sys angenrheidiol ar gyfer gwaith ifconfig, sy'n gosod y rhyngwyneb rhwydwaith i gyfathrebu â Slirp. Tîm route yn gosod y bwrdd llwybro cnewyllyn i orfodi'r holl draffig i gael ei anfon trwy dwnnel Slirp. Gadewch i ni wirio hyn gydag ymholiad DNS:

nslookup google.com 8.8.8.8
Server:    8.8.8.8
Address 1: 8.8.8.8 dns.google

Name:      google.com
Address 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Address 2: 2607:f8b0:4006:81b::200e lga25s63-in-x0e.1e100.net

Mae'n gweithio!

Nodyn fesul .: Yn ôl pob tebyg, ysgrifennwyd y post gwreiddiol ar bwrdd gwaith gyda cherdyn rhwydwaith gwifrau, neu ryw ffurfweddiad arall nad oedd angen gyrwyr ychwanegol arno. Ar liniadur gyda WiFi 8265 gan Intel, mae gwall yn digwydd wrth godi'r rhwydwaith

/ # ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15
slirp_tramp failed - errno = 2
ifconfig: ioctl 0x8914 failed: No such file or directory
/ #

Yn ôl pob tebyg, ni all y cnewyllyn gyfathrebu â gyrrwr y cerdyn rhwydwaith. Yn anffodus, ni lwyddodd ymgais i lunio'r firmware i'r cnewyllyn i ddatrys y sefyllfa. Ar adeg cyhoeddi, nid oedd yn bosibl dod o hyd i ateb yn y cyfluniad hwn. Ar ffurfweddiadau symlach (er enghraifft, yn Virtualbox), mae'r rhyngwyneb yn codi'n gywir.

Gadewch i ni awtomeiddio'r ailgyfeiriad gyda'r sgript cragen ganlynol:

#!/bin/sh
# init.sh

mount -t proc proc proc/
mount -t sysfs sys sys/
ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15
route add default gw 10.0.2.2

echo "networking set up"

exec /tini /bin/sh

A'i nodi'n weithredadwy:

chmod +x init.sh

Ac yna byddwn yn gwneud newidiadau i'r llinell orchymyn cnewyllyn:

linux 
  root=/dev/root 
  rootfstype=hostfs 
  rootflags=$HOME/prefix/uml-demo 
  rw 
  mem=64M 
  eth0=slirp,,$HOME/bin/slirp 
  init=/init.sh

A gadewch i ni ailadrodd:

SLiRP Ready ...
networking set up
/bin/sh: can't access tty; job control turned off

nslookup google.com 8.8.8.8
Server:    8.8.8.8
Address 1: 8.8.8.8 dns.google

Name:      google.com
Address 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Address 2: 2607:f8b0:4004:800::200e iad30s09-in-x0e.1e100.net

Mae'r rhwydwaith yn sefydlog!

ffeil docwr

Er mwyn ei gwneud yn haws i chi wirio hyn i gyd, rwyf wedi casglu Dockerfile, sy'n awtomeiddio'r rhan fwyaf o'r camau a ddisgrifir a dylai ddarparu cyfluniad gweithio i chi. Mae gen i hefyd cyfluniad cnewyllyn parod, sy'n cynnwys popeth a ddisgrifir yn y post. Ond mae'n bwysig deall fy mod yma wedi amlinellu'r gosodiadau lleiaf yn unig.

Rwy'n gobeithio bod y swydd hon wedi eich helpu i ddeall sut i godi cnewyllyn gwestai. Trodd allan i fod yn rhyw fath o anghenfil, ond lluniwyd y cyhoeddiad fel canllaw cynhwysfawr ar adeiladu, gosod a ffurfweddu Modd Defnyddiwr yn Linux o dan fersiynau modern o systemau gweithredu'r teulu hwn. Dylai'r camau nesaf gynnwys gosod gwasanaethau a meddalwedd arall sydd eisoes y tu mewn i'r system westeion. Gan mai dim ond tarballau cyhoeddusrwydd yw delweddau cynhwysydd Docker, dylech allu echdynnu'r ddelwedd trwyddynt docker export, ac yna penderfynu ar ei lwybr gosod yng ngwraidd system ffeiliau'r cnewyllyn gwadd. Wel, yna gweithredu'r sgript cragen.

Diolch arbennig i Rkeene o #lobsters ar Freenode. Heb ei gymorth i ddadfygio Slirp, ni fyddwn wedi cyrraedd mor bell â hyn. Nid oes gennyf unrhyw syniad sut mae ei system Slackware yn gweithio'n gywir gyda slirp, ond nid oedd fy systemau Ubuntu ac Alpaidd yn derbyn sliper ac awgrymodd y Rkeene deuaidd i mi. Ond mae'n ddigon i mi bod o leiaf rhywbeth yn gweithio i mi.

Ffynhonnell: hab.com

Ychwanegu sylw