Faʻafefea ona amata faʻaaoga le Faʻaoga Faʻaoga i Linux

Folasaga mai le fa'aliliu upu: Fa'asaga i tua o le tele o le ulufale mai o ituaiga eseese o koneteina i totonu oo tatou olaga, e mafai ona fai si manaia ma aoga le su'esu'eina po'o a tekinolosi na amata uma mai i se taimi. O nisi oi latou e mafai ona faʻaaogaina e oʻo mai i aso nei, ae le o tagata uma e manatua ia auala (pe iloa, pe a le maua i le taimi o lo latou atinaʻe vave). O se tasi o ia tekinolosi o le User Mode Linux. O le tusitala o le uluaʻi tusi na faia se aofaʻiga talafeagai o le eliina, ma iloa po o fea o atinaʻe tuai o loʻo galue pea ma e leai, ma tuʻu faʻatasi se mea e pei o taʻiala taʻitasi i le auala e fatuina ai se UML i le fale mo oe lava i totonu. 2k19. Ma ioe, na matou valaauliaina le tusitala o le uluai pou ia Habr Cadey, o lea afai ei ai ni au fesili, fesili ile Igilisi ile faʻamatalaga.

Faʻafefea ona amata faʻaaoga le Faʻaoga Faʻaoga i Linux

Faiga Faʻaoga i Linux, o le mea moni, o se taulaga o le fatu Linux ia te ia lava. O lenei faiga e mafai ai e oe ona faʻatautaia se fatu Linux atoa e avea o se faʻaoga faʻaoga ma e masani ona faʻaaogaina e le au atinaʻe e suʻe ai avetaavale. Ae o lenei faiga e aoga foi o se meafaigaluega mo le vavaeeseina lautele, o le mataupu faavae e tutusa ma le faagaoioiga o masini masini. O lenei faiga e maua ai le tele o le tuʻueseeseina nai lo Docker, ae itiiti ifo nai lo se masini komepiuta atoatoa e pei o KVM poʻo Pusa Pusa.

I le aotelega, o le User Mode atonu e foliga mai o se meafaigaluega uiga ese ma faigata e faʻaaoga, ae e iai ona faʻaoga. A uma mea uma, o se fatu Linux atoatoa lea o loʻo taʻavale e avea o se tagata e le faʻaaogaina. O lenei vaega e mafai ai ona faʻaogaina le code e le talitonuina e aunoa ma se faʻafefe i le masini talimalo. Ma talu ai o lenei mea o se fatu atoa, o ana faiga e vavae ese mai le masini talimalo, o lona uiga fa'agasologa o lo'o fa'atinoina i totonu o le Fa'aoga Fa'aoga o le a le mafai ona iloa e le tagata talimalo. E le pei o se pusa masani a Docker, lea e vaʻai ai le masini talimalo i taimi uma i totonu o le teuina. Va'ai i lenei fasi pstree mai se tasi o a'u 'au'aunaga:

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

Ma faʻatusatusa lenei mea i le pstree o le Linux kernel i le User Mode:

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

Pe a galue ma Docker containers, e mafai ona ou vaʻaia mai le talimalo igoa o faʻagasologa o loʻo taʻavale i le malo. E le mafai lenei mea ile Linux User Mode. O le a le uiga? O lona uiga o meafaigaluega mata'ituina o lo'o fa'agaoioia i totonu ole su'ega su'etusi a Linux le vaai fa'agasologa o lo'o fa'agaoioia i totonu ole faiga fa'amālō. Ae i nisi tulaga e mafai ona avea lenei vaega ma se pelu mata-lua.

I se tulaga lautele, o le pou atoa o loʻo i lalo o se aofaʻiga o suʻesuʻega ma taumafaiga faigata e ausia ai le manaʻoga. Ina ia faia lenei mea, e tatau ona ou faʻaogaina meafaigaluega anamua, faitau fatu fatu, auai i le faʻaogaina o le code na tusia aʻo ou i ai i le aoga tulagalua, ma faʻapipiʻi foi Heroku fausia e faʻaaoga ai se binary faapitoa e suʻe ai meafaigaluega ou te manaʻomia. O nei galuega uma na mafua ai ona taʻua aʻu e tagata i luga o laʻu IRC o se fai togafiti. Ou te faʻamoemoe o lenei pou o le a avea ma faʻamaumauga faʻalagolago mo se tasi e faia le mea lava e tasi, ae faʻatasi ai ma fatu fou ma OS versions.

tonu

O le faʻatulagaina o le Linux User Mode e aofia ai ni laasaga:

  • fa'apipi'i fa'alagolago ile talimalo;
  • downloadina o le fatu Linux;
  • seti fausia fatu;
  • potopotoga fatu;
  • fa'apipi'i le binary;
  • fa'atūina le faiga o faila faila;
  • filifiliga o fa'ailoga fa'alauiloa kernel;
  • fa'atūina se feso'ota'iga malo;
  • tatala le fatu malo.

Ou te manatu afai e te filifili e fai nei mea uma ia oe lava, e foliga mai o le a e faia mea uma o loʻo faʻamatalaina i totonu o nisi Ubuntu poʻo Debian-pei o le polokalama. Na ou taumafai e faʻatino mea uma o loʻo i luga i laʻu tufatufaga e sili ona ou fiafia i ai - Alpine, ae leai se mea na aoga, e foliga mai ona o le Linux kernel o loʻo fusia mau i glibc-isms mo avetaavale ile User Mode. Ou te fuafua e lipoti atu lenei mea i luga o le vaitafe pe a uma ona ou iloa le faafitauli.

Fa'apipi'i fa'alagolago ile talimalo

E manaʻomia e Ubuntu ia pusa nei e fausia ai le fatu Linux (faʻapea o se faʻapipiʻi mama):

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

E mafai ona e faʻapipiʻiina i latou i le poloaiga lenei (e pei o aʻa poʻo le sudo):

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

Faamolemole ia matau o le faʻatinoina o le polokalame faʻapitoa mo le Linux kernel e manaʻomia le faʻapipiʻiina libncurses-dev. Faamolemole ia mautinoa o loʻo faʻapipiʻiina e faʻaaoga ai le poloaiga lenei (e pei o aʻa poʻo le faʻaaogaina o sudo):

apt-get -y install libncurses-dev

La'uina o le fatu

Filifili po o fea e sii mai ai ona fausia lea o le fatu. E te mana'omia le tu'ufa'atasia pe tusa ma le 1,3 GB le avanoa mo le ta'aloga, ia mautinoa o lo'o ia te oe.

Ona alu lea i kernel.org ma maua le URL e la'u mai ai le lomiga fou o le kernel mautu. I le taimi na tusia ai lenei pou: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

La'u mai le faila lea e fa'aaoga 'wget':

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

Ma aveese mai ma 'tar':

tar xJf linux-5.1.16.tar.xz

O lea ua matou ulufale i le lisi na faia pe a tatalaina le tarball:

cd linux-5.1.16

Fa'atulaga se fatu fatu

Ole faiga ole fatu ole seti Fai faila с tele mea faigaluega masani ma tusitusiga e otometi ai le faagasologa. Ina ia amata, tatala le polokalame seti i luga ole laiga:

make ARCH=um menuconfig

O le a fa'amae'aina se vaega o le fa'apotopotoga ma fa'aali se pusa fa'atalanoa mo oe. Pe a aliali mai le malamalama i le pito i lalo o le faamalama[Select]', e mafai ona e fa'atulagaina tulaga e fa'aaoga ai le Spacebar po'o le ulufale ki. Fa'asagaga fa'ata'amilo i le fa'amalama e pei ona masani ai le fa'aogaina o aū keyboard "luga" ma le "lalo", ma le filifilia o elemene o le "agavale" po'o le "taumatau".

O le faʻaaliga vaʻaia -> o lona uiga o loʻo e i totonu o se submenu, lea e mafai ona faʻaogaina e faʻaaoga ai le Enter key. O le ala i fafo e manino lava e ala mai '[Exit]'.

Fa'aaofia filifiliga nei i le '[Select]' ma ia mautinoa o loʻo i ai se '[*]' faʻailoga i tafatafa o latou:

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

O le mea lena, e mafai ona e alu ese mai lenei faamalama e ala i le filifilia faasolosolo '[Exit]'. Tau lava ia mautinoa i le faaiuga e uunaia oe e teu le faatulagaga ma filifili '[Yes]'.

Ou te fautuaina oe e taʻalo faʻatasi ma le kernel build options pe a uma ona faitau lenei pou. Mai nei fa'ata'ita'iga e tele mea e te a'oa'oina ai pe fa'afefea ona fa'aogaina le fa'ainisinia o le fatu ma pe fa'afefea fo'i ona a'afia fu'a eseese ile auala e fausia ai le fatu.

Fausia le fatu

O le Linux kernel o se polokalama tele e faia ai le tele o mea. E tusa lava pe la'ititi la'ititi la'asaga i masini tuai, e fai lava si umi o le fa'apotopotoga. O lea ia fausia le fatu e faʻaaoga ai le poloaiga lenei:

make ARCH=um -j$(nproc)

Mo le a? O lenei poloaiga o le a taʻu atu ai i le matou faufale e faʻaoga uma pusa CPU ma filo i le taimi o le fausiaina. Au $(nproc) i le fa'ai'uga o le Faufale fa'aofi le fa'atonuga nproc, o se vaega o coreutils i le tulaga masani Ubuntu fausia.

A maeʻa sina taimi, o le a tuʻufaʻatasia a tatou fatu i se faila faila ./linux.

Fa'apipi'i le binary

Talu ai ona o le Faiga Faʻaoga i Linux e fatuina ai se binary masani, e mafai ona e faʻapipiʻiina e pei o soʻo se isi mea aoga. O le auala lea na ou faia ai:

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

E taua foi le mautinoa o lena mea ~/bin o lo'o i totonu o lou $PATH:

export PATH=$PATH:$HOME/bin

Fa'atulagaina le Faiga Fa'atonu Fa'atonu

Fausia se fa'atonuga mo le faiga o faila faila:

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

Tatala alpinelinux.org ma totonu vaega download su'e le feso'ota'iga o lo'o iai nei MINI ROOT FILESYSTEM. I le taimi na tusia ai lenei mea:

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

Sii mai lenei tarball faʻaaoga 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

Fa'ato'a ulufale nei i le fa'atonuga o faila faila ma tatala le fa'amaumauga:

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

O laasaga o loʻo faʻamatalaina o le a fatuina ai se faʻataʻitaʻiga faila faila. Ona o le auala e galue ai, o le faʻapipiʻiina o afifi e ala i le Alpine apk manager o le a matua faigata lava. Ae o lenei FS o le a lava e iloilo ai le manatu lautele.

Matou te manaʻomia foʻi se meafaigaluega tini e taofi le taumafaina manatua faiga zombie a tatou fatu malo.

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

Fausiaina o le Kernel Command Line

O le fatu Linux, pei o le tele o isi polokalame, o loʻo i ai faʻamatalaga laina laina e mafai ona maua e ala i le faʻamaonia o le ki --help.

O Ia lava—fesoasoani

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.

O lenei laulau o lo'o fa'amamafaina ai fa'asologa autu o le fa'alauiloa. Sei o tatou fa'agasolo le fatu ma le seti aupito maualalo mana'omia o filifiliga:

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

O laina o loʻo i luga o loʻo taʻu mai i la tatou fatu mea nei:

  • Se'i tatou manatu o le root filesystem o se pseudo device /dev/root.
  • Filifili hostfs e fai ma aveta'avale faiga faila a'a.
  • Faʻamau le faila faila malo na matou fatuina i luga o le masini aʻa.
  • Ma ioe, i le faitau-tusi faiga.
  • Fa'aaoga na'o le 64 megabytes o le RAM (e mafai ona e fa'aogaina le itiiti ifo i le mea o lo'o e fuafua e fai, ae o le 64 MB e foliga mai o le aofa'i sili lea).
  • E otometi lava ona amata le fatu /bin/sh auala init-fa'agasolo.

Faʻatonu lenei poloaiga ma e tatau ona e mauaina se mea e pei o lenei:

O le isi laupepa

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

O togafiti o loʻo i luga o le a tuʻuina mai ia i tatou faiga malo itiiti, e aunoa ma ni mea faapena /proc po'o le igoa talimalo ua tofia. Mo se faʻataʻitaʻiga, taumafai i tulafono nei:

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

Ina ia alu ese mai le faiga malo, ulufale exit po'o le fetaomi le pulea-d. Ole mea lea ole a mu ai le atigi sosoo ai ma le popole fatu:

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

Na matou maua lenei faʻalavelave fatu ona o le Linux kernel e manatu o le amataga o le faagasologa o loʻo faʻagasolo pea. A aunoa ma lea mea, e le mafai ona toe galue ma tapuni le faiga. Ae talu ai o se faiga faʻaoga lenei, o le taunuuga e tuʻuina atu ia lava i SIGABRT, lea e tau atu i le ulufafo.

Fa'atulaga se feso'ota'iga malo

Ae o le mea lea e amata ai ona faaletonu ia i tatou. Networking in User Mode Linux o le mea lea e amata ai ona malepelepe le manatu atoa o se "tagata faʻaoga" faʻatapulaʻa. A uma mea uma, o le fesoʻotaʻiga e masani ona faʻatapulaʻaina i le tulaga o le system fa'aeaina faiga fa'ataunu'u mo mafuaaga manino ia i tatou uma.

Manatua per.: E mafai ona e faitau atili e uiga i filifiliga eseese mo le galue ma se fesoʻotaʻiga i UML iinei.

Malaga e slirp

Ae ui i lea, o loʻo i ai se meafaigaluega tuai ma toetoe lava a le lagolagoina e taʻua Slirp, lea e mafai ai e le User Mode Linux ona fegalegaleai ma le upega tafailagi. E fa'agaoioia e pei o se fa'aputuga TCP/IP tulaga fa'aoga ma e le mana'omia so'o se fa'atagaga e fa'atino ai. O lenei meafaigaluega sa tatalaina i le 1995, ma o le faafouga mulimuli o le aso 2006. Ua matua tele le Slirp. I le taimi e aunoa ma se lagolago ma faʻafouga, ua oʻo mai tagata faʻapipiʻi i le taimi nei e mafai ona faʻamatalaina lenei meafaigaluega "code rot".

O lea la, seʻi o tatou download Slirp mai faleoloa Ubuntu ma taumafai e taʻavale:

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'u atua e. Sei o tatou faʻapipiʻi le Slirp debugger ma vaʻai pe mafai ona tatou iloa le mea o loʻo tupu iinei:

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.

Ua taia i tatou e le sese lenei laina. Sei o tatou tilotilo i le stacktrace, atonu o le a fesoasoani ia i tatou iina:

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

O iinei tatou te vaʻai ai o le faʻalavelave e tupu i le amataga o le matasele autu, pe a taumafai le slirp e siaki le taimi. O le taimi lea na tatau ai ona ou fiu i le taumafai e faʻapipiʻi. Ae seʻi o tatou vaʻai pe aoga Slirp, fausia mai ituaiga. Na ou toe siiina sa'o le fa'amaumauga mai le saite Punavai, aua o le tosoina o se mea mai iina e ala i le laina o le poloaiga o se tiga:

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

O iinei tatou te vaʻaia ai faʻasalalauga e uiga i galuega faʻapipiʻi e leʻi faʻamalamalamaina, o lona uiga, e uiga i le le mafai ona faʻafesoʻotaʻi le faila faila faila. E foliga mai o le va o le 2006 ma le taimi nei na taofia e le gcc le fatuina o faʻailoga e faʻaaogaina i galuega faʻavae. Tatou taumafai e sui le upu autu inline i se faʻamatalaga gaogao ma vaʻai i le iʻuga:

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

Leai. E le aoga foi lea. E le'i maua lava fa'ailoga mo nei galuega.

I le taimi lea na ou fiu ma amata suʻesuʻe ile Github Heroku fausia afifi. O loʻu manatu o nisi Heroku fausia afifi o le a aofia ai binaries ou te manaʻomia. I le faaiuga, o la'u sailiga na taitai atu ai au iinei tonu. Sa ou sii maia ma tatala uml.tar.gz ma maua mea nei:

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*

Ole slirp binary lea! E aoga?

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

E le pa'u - e tatau la ona aoga! Tatou totō le binary i totonu ~/bin/slirp:

cp slirp ~/bin/slirp

Afai e aveese e le na faia le afifi, I faia se faata.

Faʻatonuina o fesoʻotaʻiga

Se'i o tatou fetu'una'i le feso'ota'iga i luga o la tatou malo fa'apitoa. Se'i o tatou fa'afou le fa'ailoga fa'alauiloa:

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

Ia tatou fa'agaoioia le feso'ota'iga:

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

O fa'atonuga muamua e lua /proc и /sys e tatau mo galuega ifconfig, lea e fa'atulaga ai se feso'ota'iga feso'ota'iga e feso'ota'i ma Slirp. Au route fa'atulaga le laulau fa'ata'ita'i e fa'amalosi ai fe'avea'i uma e lafo i le alalaupapa Slirp. Sei o tatou siaki lenei mea i se fesili 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

E aoga!

Fa'aaliga mo.: E foliga mai, o le ulua'i pou na tusia i luga o le laulau ma se kata feso'ota'iga uaea, po'o se isi fa'atulagaga e le mana'omia ni ta'avale fa'aopoopo. I luga o se komepiuta feaveai ma WiFi 8265 mai Intel, e tupu se mea sese pe a siitia le fesoʻotaʻiga

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

E foliga mai, e le mafai e le fatu ona fesoʻotaʻi ma le avetaʻavale o fesoʻotaʻiga. O se taumafaiga e tuufaatasia le firmware i totonu o le fatu, o le mea e leaga ai, e leʻi faʻasaʻo le tulaga. I le taimi o le faʻasalalauga, e leʻi mafai ona maua se fofo i lenei faʻatulagaga faapitoa. I luga o configs faigofie (mo se faʻataʻitaʻiga, i le Virtualbox), o le atinaʻe e saʻo le siitia.

Se'i otometi le toe fa'afeiloa'i e fa'aaoga ai le fa'ailoga atigi lea:

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

Ma fa'ailoga e mafai ona fa'atinoina:

chmod +x init.sh

Ona tatou faia lea o suiga i le kernel command line:

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

Ma tatou toe fai:

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

E mautu le upega!

faila faila

Ina ia faafaigofieina mo oe le siakiina o nei mea uma, ua ou aoina faila faila, lea otometi le tele o laasaga o loʻo faʻamatalaina ma e tatau ona tuʻuina atu ia te oe se faʻatulagaga galue. E iai foʻi aʻu saunia kernel configuration, lea e aofia ai mea uma o loʻo faʻamatalaina i le pou. Ae e taua le malamalama o iinei ua ou otootoina atu na o tulaga maualalo.

Ou te faʻamoemoe o lenei pou na fesoasoani ia te oe e te malamalama ai i le faʻatupuina o se kernel malo. Na foliga mai o se ituaiga o sauʻai, ae o le lomiga na faʻamoemoeina e avea o se taʻiala atoatoa i le autu o le faʻapipiʻiina, faʻapipiʻi ma faʻapipiʻi le Faʻaoga Faʻaoga i Linux i lalo o faʻaonaponei faʻaogaina faiga faʻaoga a lenei aiga. O laasaga mulimuli e tatau ona aofia ai le faʻapipiʻiina o auaunaga ma isi polokalama faʻapipiʻi i totonu o le polokalama faʻapitoa. Talu ai o ata Docker container ua naʻo le faʻalauiloaina o tarballs, e tatau ona e faʻapipiʻiina le ata e ala i docker export, ona fuafua lea o le ala e faʻapipiʻi ai i le aʻa o le polokalama faila kernel malo. Ia, ona ta'e lea o le shell script.

Fa'afetai fa'apitoa ia Rkeene mai #lobsters on Freenode. A aunoa ma lana fesoasoani i le fa'aleaga Slirp, semanu ou te le o'o i lenei mamao. Ou te le iloa pe faʻafefea ona galue saʻo lana Slackware system i le slirp, ae o laʻu Ubuntu ma Alpine system e leʻi taliaina le slirp ma o le binary Rkeene na fautua mai ia te aʻu. Ae ua lava ia te au o se mea e aoga mo au.

puna: www.habr.com

Faaopoopo i ai se faamatalaga