Hvernig á að byrja að nota notendaham á Linux

Inngangur frá þýðanda: Með hliðsjón af gríðarlegri innkomu ýmissa tegunda gáma inn í líf okkar getur verið mjög áhugavert og gagnlegt að komast að því með hvaða tækni þetta byrjaði einu sinni. Sumar þeirra geta verið gagnlegar til þessa dags, en ekki allir muna eftir slíkum aðferðum (eða vita, ef þeir voru ekki veiddir á hraðri þróun þeirra). Ein slík tækni er User Mode Linux. Höfundur frumritsins lagði talsvert í að grafa, finna út hver af gömlu þróununum virkar enn og hver ekki, og setti saman eitthvað eins og skref-fyrir-skref leiðbeiningar um hvernig á að búa til heimaræktað UML fyrir sjálfan þig í 2k19. Og já, við buðum höfundi upprunalegu færslunnar til Habr Hreinsa, þannig að ef þú hefur spurningar skaltu spyrja á ensku í athugasemdunum.

Hvernig á að byrja að nota notendaham á Linux

User Mode í Linux er í raun höfn á Linux kjarnanum við sjálfan sig. Þessi háttur gerir þér kleift að keyra allan Linux kjarna sem notendaferli og er almennt notað af forriturum til að prófa rekla. En þessi háttur er einnig gagnlegur sem tæki til almennrar einangrunar, þar sem meginreglan er svipuð rekstri sýndarvéla. Þessi háttur veitir meiri einangrun en Docker, en minna en fullgild sýndarvél eins og KVM eða Virtual Box.

Á heildina litið kann User Mode að virðast skrítið og erfitt tæki í notkun, en það hefur sín not. Þegar öllu er á botninn hvolft er þetta fullgildur Linux kjarni sem keyrir sem notandi án forréttinda. Þessi eiginleiki gerir hugsanlega ótraustum kóða kleift að keyra án þess að hýsingarvélinni sé ógnað. Og þar sem þetta er fullgildur kjarni eru ferlar hans einangraðir frá hýsingarvélinni, það er ferlar sem keyra í notendastillingu verða ekki sýnilegir gestgjafanum. Þetta er ekki eins og hefðbundinn Docker gámur, þar sem hýsingarvélin sér alltaf ferlana inni í geymslunni. Horfðu á þetta stykki af pstree frá einum af netþjónunum mínum:

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}]

Og berðu þetta saman við pstree Linux kjarnans í notendaham:

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

Þegar ég er að vinna með Docker gáma get ég séð frá gestgjafanum nöfn ferlanna sem eru í gangi í gestnum. Þetta er ekki mögulegt með Linux User Mode. Hvað þýðir það? Þetta þýðir að eftirlitstæki keyra í gegnum endurskoðunarundirkerfi Linux sjá ekki ferli sem keyra í gestakerfinu. En í sumum tilfellum getur þessi eiginleiki verið tvíeggjað sverð.

Almennt séð er öll færslan hér að neðan samansafn rannsókna og grófra tilrauna til að ná tilætluðum árangri. Til að gera þetta þurfti ég að nota ýmis forn tól, lesa kjarnaheimildir, taka þátt í mikilli villuleit á kóða sem skrifaður var þegar ég var enn í grunnskóla og líka fikta við Heroku smíðar með því að nota sérstakan binary í leit að verkfærunum sem ég þurfti. Öll þessi vinna leiddi til þess að strákarnir á IRC-inu mínu kölluðu mig töframann. Ég vona að þessi færsla muni þjóna sem áreiðanleg skjöl fyrir einhvern til að gera það sama, en með nýrri kjarna og stýrikerfisútgáfum.

aðlögun

Uppsetning Linux notendahamur felur í sér nokkur skref:

  • setja upp ósjálfstæði á gestgjafanum;
  • að hlaða niður Linux kjarnanum;
  • uppsetning kjarnabyggingar;
  • kjarnasamsetning;
  • setja upp tvöfaldan;
  • setja upp gestaskráarkerfið;
  • val á frumbreytum kjarna;
  • setja upp gestanet;
  • ræsir gestakjarnann.

Ég geri ráð fyrir að ef þú ákveður að gera allt þetta sjálfur, þá gerirðu líklega allt sem lýst er í einhverju Ubuntu eða Debian-líku kerfi. Ég reyndi að innleiða allt ofangreint í uppáhalds dreifingunni minni - Alpine, en ekkert gekk, greinilega vegna þess að Linux kjarninn er þétt bundinn glibc-ismum fyrir rekla í User Mode. Ég ætla að tilkynna þetta til andstreymis eftir að ég hef loksins fundið út vandamálið.

Að setja upp ósjálfstæði á hýsilinn

Ubuntu krefst að minnsta kosti eftirfarandi pakka til að byggja upp Linux kjarnann (að því gefnu að uppsetningin sé hrein):

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

Þú getur sett þau upp með eftirfarandi skipun (sem rót eða með sudo):

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

Vinsamlegast athugaðu að það þarf uppsetningu að keyra valmyndaraðlögunarforritið fyrir Linux kjarnann libncurses-dev. Gakktu úr skugga um að það sé sett upp með eftirfarandi skipun (sem rót eða með sudo):

apt-get -y install libncurses-dev

Að sækja kjarnann

Ákveða hvar á að hlaða niður og byggðu síðan kjarnann. Þú þarft að úthluta um það bil 1,3 GB plássi á harða disknum fyrir þessa aðgerð, svo vertu viss um að þú hafir það.

Farðu síðan til kernel.org og fáðu slóðina til að hlaða niður nýjustu stöðugu kjarnaútgáfunni. Þegar þú skrifar þessa færslu: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Sæktu þessa skrá með því að nota 'wget':

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

Og draga það út með 'tar':

tar xJf linux-5.1.16.tar.xz

Nú förum við inn í möppuna sem var búin til við að pakka upp tarballinu:

cd linux-5.1.16

Að setja upp kjarnabyggingu

Kjarnasmíðakerfið er sett Búðu til skrár с margir sérsniðin verkfæri og forskriftir til að gera ferlið sjálfvirkt. Til að byrja skaltu opna uppsetningarforritið á netinu:

make ARCH=um menuconfig

Það mun ljúka samsetningunni að hluta og birta svarglugga fyrir þig. Þegar ljósið birtist neðst í glugganum[Select]', getur þú stillt stillingarnar með því að nota bil eða Enter takkana. Flakk um gluggann er eins og venjulega með því að nota lyklaborðsörvarnar „upp“ og „niður“ og val á þáttum er „vinstri“ eða „hægri“.

Skoðavísirinn -> þýðir að þú ert í undirvalmynd sem hægt er að nálgast með því að nota Enter takkann. Leiðin út er augljóslega í gegnum '[Exit]'.

Hafa eftirfarandi valkosti í '[Select]' og vertu viss um að það sé '[*]' tákn við hliðina á þeim:

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

Það er það, þú getur farið úr þessum glugga með því að velja í röð '[Exit]'. Gakktu úr skugga um að í lokin ertu beðinn um að vista stillingarnar og veldu '[Yes]'.

Ég mæli með að þú spilar þig með kjarnabyggingarvalkostina eftir að hafa lesið þessa færslu. Af þessum tilraunum er hægt að læra mikið um hvernig kjarnavélfræði á lágu stigi virkar og hvernig mismunandi fánar hafa áhrif á hvernig kjarninn er byggður.

Byggja kjarnann

Linux kjarninn er stórt forrit sem gerir ýmislegt. Jafnvel með þessari lágmarksstillingu á eldri vélbúnaði getur samsetning tekið töluverðan tíma. Svo byggðu kjarnann með því að nota eftirfarandi skipun:

make ARCH=um -j$(nproc)

Til hvers? Þessi skipun mun segja byggingaraðilanum okkar að nota alla tiltæka CPU kjarna og þræði meðan á smíðaferlinu stendur. Lið $(nproc) í lok Build setur úttak skipunarinnar inn nproc, sem er hluti coreutils í venjulegu Ubuntu byggingunni.

Eftir nokkurn tíma verður kjarninn okkar settur saman í keyrsluskrá ./linux.

Að setja upp binary

Þar sem notendahamur í Linux býr til venjulegan tvöfalda, geturðu sett það upp eins og önnur tól. Svona gerði ég það:

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

Það er líka þess virði að ganga úr skugga um það ~/bin er í þínum $PATH:

export PATH=$PATH:$HOME/bin

Stilla gestaskráakerfið

Búðu til möppu fyrir gestaskráarkerfið:

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

Opnaðu alpinelinux.org og inn niðurhalshluta finna núverandi niðurhalstengil MINI ROOT FILESYSTEM. Þegar þetta var skrifað var þetta:

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

Sæktu þennan tarball með 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

Farðu nú inn í gestaskráarkerfisskrána og taktu upp skjalasafnið:

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

Skrefin sem lýst er munu búa til lítið skráarkerfissniðmát. Vegna þess hvernig kerfið virkar verður mjög erfitt að setja upp pakka í gegnum Alpine apk manager. En þetta FS mun duga til að meta almenna hugmynd.

Við þurfum líka tæki Pínulítið til að stöðva minnisnotkun uppvakningaferlar gestakjarna okkar.

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

Að búa til kjarnastjórnlínu

Linux kjarninn, eins og flest önnur forrit, hefur skipanalínurök sem hægt er að nálgast með því að tilgreina lykilinn --help.

Sjálfur — hjálpa

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.

Þetta spjald undirstrikar helstu ræsingarfæribreytur. Við skulum keyra kjarnann með lágmarks nauðsynlegum valkostum:

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

Línurnar hér að ofan segja kjarnanum okkar eftirfarandi:

  • Gerum ráð fyrir að rót skráarkerfið sé gervitæki /dev/root.
  • Veldu hostfs sem bílstjóri fyrir rót skráarkerfi.
  • Settu upp gestaskráarkerfið sem við bjuggum til á rótartækinu.
  • Og já, í lesa-skrifa ham.
  • Notaðu aðeins 64 megabæti af vinnsluminni (þú getur notað mun minna eftir því hvað þú ætlar að gera, en 64 MB virðist vera ákjósanlegasta magnið).
  • Kjarninn fer sjálfkrafa í gang /bin/sh sem init-ferli.

Keyrðu þessa skipun og þú ættir að fá eitthvað eins og eftirfarandi:

Annað blað

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
/ # 

Meðhöndlunin hér að ofan mun gefa okkur lágmarks gestakerfi, án þess að hafa hluti eins og /proc eða úthlutað hýsingarnafni. Prófaðu til dæmis eftirfarandi skipanir:

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

Til að skrá þig út úr gestakerfinu skaltu slá inn exit eða ýttu á control-d. Þetta mun skjóta skelinni og síðan kjarna læti:

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

Við fengum þessa kjarna læti vegna þess að Linux kjarninn heldur að frumstillingarferlið sé alltaf í gangi. Án þess getur kerfið ekki lengur virkað og slokknar. En þar sem þetta er notendastillingarferli sendir niðurstaðan sig til SIGABRT, sem leiðir að útganginum.

Að setja upp gestanet

En þetta er þar sem hlutirnir fara að fara úrskeiðis hjá okkur. Netkerfi í notendaham Linux er þar sem hugmyndin um takmarkaðan „notendaham“ byrjar að falla í sundur. Þegar öllu er á botninn hvolft er netið venjulega takmarkað á kerfisstigi forréttinda framkvæmdaraðferðir af augljósum ástæðum fyrir okkur öll.

Athugið pr.: Þú getur lesið meira um mismunandi valkosti til að vinna með net í UML hér.

Ferð til að slípa

Hins vegar er til forn og nánast óstudd tól sem heitir Slirp, sem User Mode Linux getur haft samskipti við netið. Það virkar nokkurn veginn eins og TCP/IP stafla á notendastigi og þarf engar kerfisheimildir til að keyra. Þetta tól var gefin út árið 1995, og síðasta uppfærsla er dagsett 2006 árg. Slirp er mjög gamall. Á þeim tíma án stuðnings og uppfærslu hafa þýðendur náð svo langt að nú er aðeins hægt að lýsa þessu tóli sem "kóða rotnun".

Svo skulum við hlaða niður Slirp frá Ubuntu geymslunum og reyna að keyra það:

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)

Ó guð minn góður. Við skulum setja upp Slirp kembiforritið og sjá hvort við getum fundið út hvað er að gerast hér:

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.

Villan slær á okkur þessari línu. Við skulum skoða staflasporið, kannski mun eitthvað hjálpa okkur þar:

(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.

Hér sjáum við að hrunið á sér stað við ræsingu aðallykkunnar, þegar slirp reynir að athuga tímamörkin. Það var á þessu augnabliki sem ég varð að hætta að reyna að kemba. En við skulum sjá hvort Slirp, byggt úr tegundum, virkar. Ég sótti skjalasafnið aftur beint af síðunni sourceforge, vegna þess að það er sársaukafullt að draga eitthvað þaðan í gegnum skipanalínuna:

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

Hér sjáum við tilkynningar um óskilgreindar innbyggðar aðgerðir, það er að segja um ómöguleikann á að tengja tvöfalda skrána sem myndast. Svo virðist sem á milli 2006 og nú hafi gcc hætt að búa til tákn sem notuð eru í innbyggðum milliaðgerðum. Við skulum reyna að skipta um leitarorðið inline í tóma athugasemd og skoðaðu niðurstöðuna:

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

Neibb. Þetta virkar ekki heldur. Finn samt ekki tákn fyrir þessar aðgerðir.

Á þessum tímapunkti gafst ég upp og byrjaði að leita á Github Heroku smíða pakka. Mín kenning var sú að einhver Heroku smíðapakki myndi innihalda tvöfaldana sem ég þurfti. Að lokum leiddi leit mín mig hérna. Ég niðurhalaði og pakkaði niður uml.tar.gz og fann eftirfarandi:

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*

Þetta er slirp binary! Virkar það?

./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 ...

Það dettur ekki - svo það ætti að virka! Við skulum planta þessu tvöfalda inn ~/bin/slirp:

cp slirp ~/bin/slirp

Ef höfundur pakkans fjarlægir hann, ég búið til spegil.

Stillingar netsins

Nú skulum við stilla netið á gestakjarna okkar. Við skulum uppfæra ræsibreytur:

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

Nú skulum við virkja netið:

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

Fyrstu tvær stillingarskipanirnar /proc и /sys nauðsynleg til vinnu ifconfig, sem setur upp netviðmót til að eiga samskipti við Slirp. Lið route setur leiðartöflu kjarna til að þvinga alla umferð til að senda í gegnum Slirp göngin. Við skulum athuga þetta með DNS fyrirspurn:

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

Það virkar!

Athugið við.: Svo virðist sem upprunalega færslan hafi verið skrifuð á skjáborð með netkorti með snúru eða einhverri annarri uppsetningu sem krefst ekki viðbótarrekla. Á fartölvu með WiFi 8265 frá Intel kemur upp villa þegar netið er hækkað

/ # 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
/ #

Svo virðist sem kjarninn geti ekki átt samskipti við netdrifsbílstjórann. Tilraun til að setja saman fastbúnaðinn inn í kjarnann, því miður, leiðrétti ekki ástandið. Við útgáfuna var enn ekki hægt að finna lausn í þessari tilteknu uppsetningu. Í einfaldari stillingum (til dæmis í Virtualbox) er viðmótið rétt hækkað.

Við skulum gera endurvísunina sjálfvirkan með því að nota eftirfarandi skeljaforskrift:

#!/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

Og merktu það sem keyranlegt:

chmod +x init.sh

Og þá skulum við gera breytingar á kjarna skipanalínunni:

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

Og við skulum endurtaka:

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

Netið er stöðugt!

docker skrá

Til að auðvelda þér að athuga þetta allt hef ég safnað Dockerfil, sem gerir flest skref sem lýst er sjálfvirkt og ætti að veita þér virka uppsetningu. Ég hef líka tilbúin kjarnastilling, sem inniheldur allt sem lýst er í færslunni. En það er mikilvægt að skilja að hér hef ég aðeins lýst lágmarksstillingunum.

Ég vona að þessi færsla hafi hjálpað þér að skilja hvernig á að koma upp gestakjarna. Það reyndist vera einhvers konar skrímsli, en ritinu var ætlað að vera yfirgripsmikil leiðarvísir um samsetningu, uppsetningu og stillingu User Mode í Linux undir nútímaútgáfum af stýrikerfum þessarar fjölskyldu. Síðari skref ættu að fela í sér að setja upp þjónustu og annan hugbúnað sem þegar er inni í gestakerfinu. Þar sem Docker gámamyndir eru bara kynntar tarballs ættirðu að geta dregið myndina út í gegnum docker export, og ákvarða síðan slóðina til að setja það upp í rót gestakjarna skráarkerfisins. Jæja, keyrðu síðan skeljaforskriftina.

Sérstakar þakkir til Rkeene frá #humar á Freenode. Án hans hjálpar við að kemba Slirp hefði ég ekki komist svona langt. Ég hef ekki hugmynd um hvernig Slackware kerfið hans virkar rétt með slirp, en Ubuntu og Alpine kerfin mín samþykktu ekki slirp og tvöfaldur Rkeene lagði til við mig. En það er nóg fyrir mig að að minnsta kosti eitthvað virkar fyrir mig.

Heimild: www.habr.com

Bæta við athugasemd