Wéi fänkt de Benotzermodus am Linux un

Aféierung vum Iwwersetzer: Virun der Kuliss vun der massiver Entrée an eisem Liewen vu verschiddenen Zorte vu Container kann et ganz interessant an nëtzlech sinn erauszefannen mat wéi enge Technologien alles eemol ugefaang huet. E puer vun hinnen kënnen nëtzlech bis haut benotzt ginn, awer net jiddereen erënnert sech un esou Methoden (oder weess ob se net während hirer rapider Entwécklung gefaange goufen). Eng esou Technologie ass User Mode Linux. Den Auteur vum Original huet vill gegruewen, erausfonnt wéi eng vun den alen Entwécklungen nach funktionnéieren a wéi eng net, an huet eppes zesummegesat wéi eng step-by-step Instruktioun fir Iech selwer en homebrew UML am 2k19 ze kréien. An jo, mir invitéiert den Auteur vum Original Post op Habr Cadey, also wann Dir Froen hutt - frot op Englesch an de Kommentarer.

Wéi fänkt de Benotzermodus am Linux un

User Mode am Linux ass tatsächlech en Hafen vum Linux Kernel fir sech selwer. Dëse Modus erlaabt Iech e komplette Linux Kernel als Benotzerprozess ze lafen a gëtt allgemeng vun Entwéckler benotzt fir Treiber ze testen. Awer dëse Modus ass och nëtzlech als allgemeng Isolatiounstool, de Prinzip vun deem ass ähnlech wéi d'Operatioun vu virtuelle Maschinnen. Dëse Modus bitt méi Isolatioun wéi Docker, awer manner wéi eng vollwäerteg virtuell Maschinn wéi KVM oder Virtual Box.

Am Allgemengen kann de Benotzermodus wéi e komeschen a schwieregen Tool schéngen ze benotzen, awer et huet nach ëmmer seng Notzung. No allem ass dëst e vollwäertege Linux Kernel deen vun engem onprivilegéierte Benotzer leeft. Dës Fonktioun erlaabt potenziell net vertrauenswürdege Code ouni Bedrohung fir d'Hostmaschinn ze lafen. A well dëst e vollwäertege Kärel ass, sinn seng Prozesser vun der Hostmaschinn isoléiert, dat ass Prozesser, déi am Benotzermodus lafen, wäerten dem Host net sichtbar sinn. Dëst ass net wéi den üblechen Docker Container, an deem Fall gesäit d'Hostmaschinn ëmmer d'Prozesser am Repository. Kuckt dëst Stéck pstree vun engem vun mengen Serveren:

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 vergläicht dëst mat der pstree vum Linux Kernel am Benotzermodus:

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

Wann Dir mat Docker Container schafft, kann ech vum Host d'Nimm vun de Prozesser gesinn, déi am Gaascht lafen. Mam Linux User Mode ass dëst net méiglech. Wat heescht dat? Dëst bedeit datt d'Iwwerwaachungsinstrumenter déi duerch de Linux Audit-Subsystem lafen gesinn net Prozesser déi am Gaaschtsystem lafen. Awer an e puer Situatiounen kann dës Fonktioun en duebelschneidegt Schwäert ginn.

Am Allgemengen ass de ganze Post hei ënnen eng Sammlung vu Fuerschung a rau Versuche fir dat gewënschte Resultat z'erreechen. Fir dëst ze maachen, muss ech verschidden antik Tools benotzen, d'Kernelquellen liesen, intensiv Debugging vu Code maachen, geschriwwen an den Deeg wou ech nach an der Grondschoul war, an och mat Heroku baut mat engem spezielle Binär fir d'Tools ze fannen déi ech gebraucht hunn. . All dës Aarbecht huet d'Jongen op mengem IRC gefouert fir mech Magie ze nennen. Ech hoffen, datt dëse Post als zouverlässeg Dokumentatioun déngt fir een déi selwecht Saach mat méi neie Kärelen an OS Versiounen ze probéieren.

Upassung

De Linux User Mode opzestellen gëtt a verschiddene Schrëtt gemaach:

  • Ofhängegkeete vum Host installéieren;
  • de Linux Kernel eroflueden;
  • Kernel Build Configuratioun;
  • Kernel Assemblée;
  • binär Installatioun;
  • Konfiguratioun vum Gaaschtdateisystem;
  • Auswiel vu Kernel Startparameter;
  • engem Gaascht Reseau Ariichten;
  • de Gaaschtkär starten.

Ech huelen un datt wann Dir decidéiert et selwer ze maachen, Dir wäert héchstwahrscheinlech alles maachen wat an engem Ubuntu oder Debian-ähnleche System beschriwwe gëtt. Ech hu probéiert all déi uewe genannten a menger Liiblingsverdeelung ëmzesetzen - Alpine, awer näischt ass dovun komm, anscheinend wéinst der Tatsaach datt de Linux Kernel eng haart verbindlech Glibc-Isms fir Treiber am User Mode huet. Ech plangen dëst zu Upstream ze mellen nodeems ech endlech de Problem verstinn.

Ofhängegkeete vum Host installéieren

Ubuntu erfuerdert op d'mannst déi folgend Packagen fir de Linux-Kernel ze bauen (unhuelend eng propper Installatioun):

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

Dir kënnt se mat dem folgenden Kommando installéieren (als Root oder mat sudo):

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

Bedenkt datt de Linux Kernel Menu Setup Programm d'Installatioun erfuerdert libncurses-dev. Gitt sécher datt et mam folgendem Kommando installéiert ass (als Root oder mat sudo):

apt-get -y install libncurses-dev

Kernel download

Entscheede wou Dir eroflueden an dann de Kärel bauen. Fir dës Operatioun musst Dir ongeféier 1,3 GB Festplack Plaz zouginn, also vergewëssert Iech datt Dir et hutt.

No goen op kernel.org a kritt d'URL fir de leschte stabile Kernel erofzelueden. Zu der Zäit vum Schreiwen ass dëst: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Luet dës Datei erof mat 'wget':

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

An Extrait et mat 'tar':

tar xJf linux-5.1.16.tar.xz

Elo gitt mir de Verzeechnes erstallt wann Dir den Tarball auspackt:

cd linux-5.1.16

Kernel Build Setup

De Kernel Build System ass e Set Maacht Dateien с vill personaliséiert Tools a Skripte fir de Prozess ze automatiséieren. Éischt, öffnen den interaktiven Setup Programm:

make ARCH=um menuconfig

Et wäert deelweis eng Dialogbox fir Iech bauen a weisen. Wéini '[Select]', kënnt Dir konfiguréieren mat de Space oder Enter Schlësselen. Navigéiert d'Fënster, wéi gewinnt, mat den Tastaturpfeile "up" an "down", a wielt Elementer - "lénks" oder "riets".

De View Pointer -> bedeit datt Dir an engem Ënnermenü sidd, zougänglech mam Enter Schlëssel. De Wee aus et ass offensichtlech duerch '[Exit]'.

Gitt déi folgend Optiounen an '[Select]' a gitt sécher datt se en '[*]' niewend hinnen hunn:

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

Dat ass et, Dir kënnt dës Fënster erausgoen andeems Dir successiv '[Exit]'. Gitt sécher datt Dir gefrot gëtt d'Konfiguratioun um Enn ze späicheren a wielt '[Yes]'.

Ech recommandéieren datt Dir mat de Kernel Build Optiounen spillt nodeems Dir dëse Post gelies hutt. Duerch dës Experimenter kënnt Dir vill léieren wat d'Aarbecht vun der Low-Level Kernel Mechanik an d'Auswierkunge vu verschiddene Fändelen op seng Versammlung versteet.

De Kärel bauen

De Linux Kernel ass e grousse Programm dee vill Saache mécht. Och mat sou enger minimaler Konfiguratioun op aler Hardware kann et zimmlech laang daueren fir ze bauen. Also baut de Kernel mat dem folgenden Kommando:

make ARCH=um -j$(nproc)

Fir wat? Dëse Kommando wäert eise Builder soen all verfügbare CPU Cores an Threads am Bauprozess ze benotzen. Equipe $(nproc) um Enn vum Build ersetzt d'Ausgab vum Kommando nproc, déi Deel vun coreutils an engem Standard Ubuntu Build.

No enger Zäit gëtt eise Kernel an eng ausführbar Datei kompiléiert ./linux.

Installatioun vun der binär

Zënter Benotzermodus am Linux erstellt e reegelméissege Binär, kënnt Dir et wéi all aner Utility installéieren. Hei ass wéi ech et gemaach hunn:

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

Et ass derwäert och sécherzestellen, datt ~/bin ass an Ärem $PATH:

export PATH=$PATH:$HOME/bin

Astellung vum Gaaschtdateisystem

Erstellt e Verzeichnis fir de Gaaschtdateisystem:

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

Open alpinelinux.org an an download Rubrik fannen den aktuellen Downloadlink MINI ROOT FILESYSTEM. Zu der Zäit vum Schreiwen war dëst:

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

Luet dësen Tarball mat wget erof:

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

Gitt elo de Verzeechnes vum Gaaschtdateisystem an extrahéiert d'Archiv:

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

Déi beschriwwen Aktiounen erstellen e klenge Dateiesystem Template. Wéinst der Natur vum System wäert et extrem schwéier sinn Packagen duerch den Alpine apk Manager z'installéieren. Awer dës FS wäert genuch sinn fir déi allgemeng Iddi ze evaluéieren.

Mir brauchen och en Tool Tini Erënnerung Konsum ze bekämpfen Zombie Prozesser eise Gaaschtkär.

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

Erstellt eng Kernel Kommandozeil

De Linux Kernel, wéi déi meescht aner Programmer, huet Kommandozeil Argumenter déi zougänglech sinn andeems Dir de Schlëssel spezifizéiert --help.

Selwer - Hëllef

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.

Dëse Panel beliicht d'Haaptparameter vum Start. Loosst eis de Kernel mat dem minimum erfuerderleche Set vun Optiounen lafen:

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

D'Linnen uewen erzielen eise Kernel déi folgend:

  • Gitt un datt de Root Dateiesystem e Pseudo-Apparat ass /dev/root.
  • Wielt hostfs als Root Dateisystem Chauffer.
  • Mount de Gaaschtdateisystem dee mir um Root-Apparat erstallt hunn.
  • An jo, am Lies-Schreifmodus.
  • Benotzt nëmmen 64 MB RAM (Dir kënnt vill manner benotzen jee no wat Dir plangt ze maachen, awer 64 MB schéngt den optimale Betrag).
  • De Kernel fänkt automatesch un /bin/sh wéi init- Prozess.

Fëllt dëse Kommando aus an Dir sollt eppes wéi déi folgend kréien:

Ee méi Blat

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

D'Manipulatiounen hei uewen ginn eis Gaascht System op Minimum, ouni Saachen wéi /proc oder zougewisen Hostnumm. Zum Beispill, probéiert déi folgend Kommandoen:

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

Fir aus dem Gaascht auszeloggen, Typ exit oder dréckt Kontroll-d. Dëst wäert d'Schuel ëmbréngen gefollegt vun enger Kernel Panik:

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

Mir hunn dës Kernel Panik well de Linux Kernel denkt datt den Initialiséierungsprozess ëmmer leeft. Ouni et kann de System net méi funktionnéieren a klappt. Awer well dëst e Benotzermodus Prozess ass, schéckt déi resultéierend Ausgang selwer un SIGABRT, wat zu engem Ausgang resultéiert.

Gaascht Netzwierk Astellung

An hei fänken d'Saache schief ze goen. Vernetzung am Benotzermodus Linux ass wou dat ganzt Konzept vum limitéierten "Benotzermodus" ufänkt auserneen ze falen. No all, normalerweis um System Niveau, ass de Reseau limitéiert privilegiéiert Ausféierungsmodi fir all eis verständlech Grënn.

Note. pro .: Dir kënnt méi iwwer déi verschidde Méiglechkeeten liesen fir mat engem Netzwierk an UML ze schaffen hei.

Rees op Slirp

Wéi och ëmmer, et gëtt en antike a bal net ënnerstëtzten Tool genannt Schlupp, mat deem de Benotzermodus Linux mat dem Netz interagéiere kann. Et funktionnéiert vill wéi e Benotzerniveau TCP / IP Stack an erfuerdert keng Systempermissiounen fir ze lafen. Dëst Instrument war 1995 verëffentlecht, an de leschten Update ass datéiert 2006 Joer. Slirp ass ganz al. Wärend der Zäit ouni Ënnerstëtzung an Updates sinn Compilers sou wäit gaang datt elo dëst Tool nëmmen als beschriwwe ka ginn code rot.

Also loosst eis Slirp vun den Ubuntu Repositories eroflueden a probéiert et auszeféieren:

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)

Oh Gott. Loosst eis de Slirp Debugger installéieren a kucken ob mir erausfannen wat hei lass ass:

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.

De Feeler schléit an eis dëser Linn. Loosst eis d'Stacktrace kucken, vläicht eppes hëlleft eis do:

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

Hei gesi mir datt de Crash wärend der Haaptschleifstart geschitt wann de Slirp probéiert fir Timeouts ze kontrolléieren. Zu dësem Zäitpunkt hunn ech opginn ze probéieren ze Debuggen. Awer loosst eis kucken ob Slirp aus Zorte gebaut gëtt. Ech hunn d'Archiv direkt vum Site erofgelueden sourceforge, well eppes vun do duerch d'Kommandozeil ze zéien ass e Péng:

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

Hei gesi mir Alarmer iwwer ondefinéiert agebaute Funktiounen, dat heescht iwwer d'Onméiglechkeet fir déi resultéierend binär Datei ze verbannen. Et schéngt, datt tëscht 2006 an dësem Punkt gcc gestoppt huet Symboler ze produzéieren, déi an agebaute Funktiounen vun mëttlere kompiléierten Dateien benotzt goufen. Loosst eis probéieren de Schlësselwuert ze ersetzen inline op engem eidele Kommentar a kuckt d'Resultat:

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

Nee. Dëst funktionnéiert och net. Nach kann net Symboler fir dës Funktiounen fannen.

Zu dësem Zäitpunkt hunn ech opginn an ugefaang op Github ze kucken Heroku bauen Packagen. Meng Theorie war datt e puer Heroku Build Package déi Binären enthalen déi ech gebraucht hunn. Um Enn huet d'Sich mech gefouert genau hei. Ech erofgeluede an ausgepaakt uml.tar.gz an déi folgend fonnt:

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*

Dëst ass de Schlirp Binär! Schafft hien?

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

Crasht net - also sollt et funktionéieren! Loosst eis dës Binär planzen ~/bin/slirp:

cp slirp ~/bin/slirp

Am Fall wou de Package Creator et läscht, ech e Spigel gemaach.

Netzkonfiguratioun

Loosst eis elo d'Netzwierk op eisem Gaaschtkär opsetzen. Update Startoptiounen:

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

Loosst eis elo d'Netzwierk ausschalten:

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

Déi éischt zwee Configuratioun Kommandoen /proc и /sys néideg fir Aarbecht ifconfig, deen d'Netzwierk-Interface setzt fir mat Slirp ze kommunizéieren. Equipe route setzt de Kernel Routing Tabelle fir all Traffic ze zwéngen duerch de Slirp Tunnel ze schécken. Loosst eis dëst mat enger DNS Ufro kontrolléieren:

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

Et funktionnéiert!

Notiz per .: Anscheinend gouf den urspréngleche Post op engem Desktop mat enger kabelloser Netzwierkkaart geschriwwen, oder eng aner Konfiguratioun déi keng zousätzlech Chauffeuren erfuerdert. Op engem Laptop mat WiFi 8265 vun Intel geschitt e Feeler beim Erhéigung vum Netz

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

Anscheinend kann de Kernel net mat dem Netzwierkkaart Chauffer kommunizéieren. E Versuch fir d'Firmware an de Kernel ze kompiléieren, leider huet d'Situatioun net fixéiert. Zu der Zäit vun der Verëffentlechung war et net méiglech eng Léisung an dëser Konfiguratioun ze fannen. Op méi einfache Konfiguratiounen (zum Beispill an Virtualbox) klëmmt d'Interface korrekt.

Loosst eis de Viruleedung automatiséieren mat dem folgenden Shell-Skript:

#!/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 markéiert et ausféierbar:

chmod +x init.sh

An da wäerte mir Ännerungen un der Kernel Kommandozeil maachen:

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

A loosst eis widderhuelen:

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

D'Netz ass stabil!

docker Datei

Fir Iech et méi einfach ze maachen all dëst ze kontrolléieren, hunn ech gesammelt dockerfile, déi déi meescht vun de beschriwwenen Schrëtt automatiséiert a sollt Iech eng funktionéierend Konfiguratioun ginn. Ech hunn och virkonfiguréiert Kernel, déi alles huet wat am Post beschriwwe gëtt. Awer et ass wichteg ze verstoen datt ech hei nëmmen de Minimum Astellung skizzéiert hunn.

Ech hoffen, datt dëse Post Iech gehollef huet ze verstoen wéi Dir e Gaaschtkernel erhéijen. Et huet sech als eng Aart Monster erausgestallt, awer d'Publikatioun gouf als e komplette Guide iwwer d'Konstruktioun, d'Installatioun an d'Konfiguratioun vum Benotzermodus am Linux ënner modernen Versioune vu Betribssystemer vun dëser Famill konzipéiert. Déi nächst Schrëtt sollten d'Installatioun vu Servicer an aner Software schonn am Gaaschtsystem enthalen. Zënter Docker Container Biller sinn just publizéiert Tarballs, sollt Dir fäeg sinn d'Bild iwwer ze extrahieren docker export, a bestëmmen dann säin Installatiounswee an der Wuerzel vum Gaaschtkär säi Dateiesystem. Gutt, da fuert de Shell-Skript aus.

Spezielle Merci un Rkeene aus # Hummer op Freenode. Ouni seng Hëllef Slirp Debugging, Ech wier net esou wäit komm. Ech hu keng Ahnung wéi säi Slackware System richteg funktionnéiert mat Schlirp, awer meng Ubuntu an Alpine Systemer hunn d'Slirp net akzeptéiert an de binäre Rkeene huet mir virgeschloen. Mee et geet mir duer, datt op d'mannst eppes fir mech funktionnéiert.

Source: will.com

Setzt e Commentaire