Kif tibda Tuża l-Modalità Utent fuq Linux

Introduzzjoni mit-traduttur: Fl-isfond tad-dħul massiv ta' diversi tipi ta' kontenituri f'ħajjitna, jista' jkun pjuttost interessanti u utli li ssir taf b'liema teknoloġiji dan kollu beda darba. Xi wħud minnhom jistgħu jintużaw b'mod utli sal-lum, iżda mhux kulħadd jiftakar metodi bħal dawn (jew jaf, jekk ma nqabdux matul l-iżvilupp mgħaġġel tagħhom). Waħda minn dawn it-teknoloġiji hija User Mode Linux. L-awtur ta 'l-oriġinal għamel ammont ġust ta' tħaffir, sib liema mill-iżviluppi qodma għadu jaħdem u liema le, u għaqqad xi ħaġa bħal struzzjonijiet pass pass dwar kif toħloq UML imkabbar fid-dar għalik innifsek. 2k19. U iva, stiedna lill-awtur tal-post oriġinali lil Habr Cadey, Mela jekk għandek mistoqsijiet, staqsi bl-Ingliż fil-kummenti.

Kif tibda Tuża l-Modalità Utent fuq Linux

Il-Modalità Utent fil-Linux hija, fil-fatt, port tal-kernel tal-Linux għalih innifsu. Din il-modalità tippermettilek li tħaddem kernel Linux sħiħ bħala proċess tal-utent u huwa komunement użat mill-iżviluppaturi biex jittestjaw is-sewwieqa. Iżda dan il-mod huwa utli wkoll bħala għodda għall-iżolament ġenerali, li l-prinċipju tiegħu huwa simili għat-tħaddim ta 'magni virtwali. Din il-modalità tipprovdi aktar iżolament minn Docker, iżda inqas minn magna virtwali sħiħa bħal KVM jew Virtual Box.

B'mod ġenerali, il-Modalità Utent tista 'tidher għodda stramba u diffiċli biex tużaha, iżda għandha l-użi tagħha. Wara kollox, dan huwa kernel Linux sħiħ li jaħdem bħala utent mhux privileġġjat. Din il-karatteristika tippermetti li kodiċi potenzjalment mhux fdat jaħdem mingħajr ebda theddida għall-magna ospitanti. U peress li dan huwa qalba sħiħa, il-proċessi tiegħu huma iżolati mill-magna ospitanti, jiġifieri proċessi li jaħdmu fil-Modalità Utent mhux se jkunu viżibbli għall-host. Dan mhux bħal kontenitur Docker tradizzjonali, li fih il-magna ospitanti dejjem tara l-proċessi ġewwa l-ħażna. Ħares lejn din il-biċċa pstree minn wieħed mis-servers tiegħi:

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

U qabbel dan mal-pstree tal-kernel tal-Linux fil-Modalità Utent:

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

Meta naħdem ma 'kontenituri Docker, nista' nara mill-ospitant l-ismijiet tal-proċessi li qed jaħdmu fil-mistieden. Dan mhux possibbli bil-Linux User Mode. Xi tfisser? Dan ifisser li l-għodod ta 'monitoraġġ li jaħdmu permezz tas-subsistema tal-verifika tal-Linux ma tarax proċessi li jaħdmu fis-sistema mistieden. Iżda f'xi sitwazzjonijiet din il-karatteristika tista 'tkun xabla b'żewġ truf.

B'mod ġenerali, il-post kollu hawn taħt huwa ġabra ta 'riċerka u tentattivi mhux maħduma biex jinkiseb ir-riżultat mixtieq. Biex nagħmel dan, kelli nuża diversi għodod tal-qedem, naqra sorsi tal-qalba, nidħol f'debugging intensiv ta 'kodiċi miktub meta kont għadni fl-iskola elementari, u wkoll nibda ma' Heroku builds billi tuża binarju speċjali fit-tfittxija tal-għodod li kelli bżonn. Dan ix-xogħol kollu wassal biex il-guys fuq l-IRC tiegħi sejħuli magician. Nittama li din il-kariga sservi bħala dokumentazzjoni affidabbli għal xi ħadd biex jagħmel l-istess ħaġa, iżda b'kernels u verżjonijiet OS aktar ġodda.

aġġustament

It-twaqqif tal-Linux User Mode jinvolvi diversi passi:

  • l-installazzjoni tad-dipendenzi fuq il-host;
  • tniżżil tal-kernel tal-Linux;
  • setup tal-bini tal-kernel;
  • assemblaġġ tal-qalba;
  • installazzjoni tal-binarju;
  • it-twaqqif tas-sistema tal-fajl mistieden;
  • għażla tal-parametri tal-varar tal-qalba;
  • it-twaqqif ta' netwerk mistiedna;
  • tniedi l-kernel mistieden.

Nassumu li jekk tiddeċiedi li tagħmel dan kollu lilek innifsek, x'aktarx li tagħmel dak kollu deskritt f'xi sistema bħal Ubuntu jew Debian. Ippruvajt nimplimenta dak kollu ta 'hawn fuq fid-distribuzzjoni favorita tiegħi - Alpine, iżda xejn ma ħadem, apparentement minħabba li l-kernel tal-Linux huwa marbut sewwa mal-glibc-isms għas-sewwieqa fil-Modalità Utent. Jiena nippjana li nirrapporta dan upstream wara li fl-aħħar insib il-problema.

Installazzjoni tad-dipendenzi fuq il-host

Ubuntu teħtieġ mill-inqas il-pakketti li ġejjin biex tibni l-kernel tal-Linux (jekk wieħed jassumi installazzjoni nadifa):

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

Tista' tinstallahom bil-kmand li ġej (bħala root jew b'sudo):

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

Jekk jogħġbok innota li t-tħaddim tal-programm ta 'personalizzazzjoni tal-menu għall-qalba tal-Linux se jeħtieġ installazzjoni libncurses-dev. Jekk jogħġbok kun żgur li huwa installat billi tuża l-kmand li ġej (bħala root jew billi tuża sudo):

apt-get -y install libncurses-dev

Niżżel il-qalba

Iddetermina fejn tniżżel u mbagħad ibni l-qalba. Ikollok bżonn talloka madwar 1,3 GB ta 'spazju għall-hard drive għal din l-operazzjoni, għalhekk kun żgur li jkollok.

Imbagħad mur kernel.org u ġib il-URL biex tniżżel l-aħħar verżjoni stabbli tal-qalba. Fil-ħin tal-kitba ta’ din il-kariga: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Niżżel dan il-fajl billi tuża 'wget':

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

U estrattha ma 'tar':

tar xJf linux-5.1.16.tar.xz

Issa nidħlu fid-direttorju maħluq meta nħoll it-tarball:

cd linux-5.1.16

Twaqqif ta 'kernel build

Is-sistema tal-bini tal-qalba hija sett Agħmel fajls с ħafna għodod u skripts tad-dwana biex awtomat il-proċess. Biex tibda, iftaħ il-programm tas-setup online:

make ARCH=um menuconfig

Se tlesti parzjalment l-assemblaġġ u juri kaxxa ta 'dialog għalik. Meta d-dawl jidher fil-qiegħ tat-tieqa[Select]', tista' tikkonfigura s-settings billi tuża l-Ispacebar jew it-tasti Enter. In-navigazzjoni madwar it-tieqa hija bħas-soltu billi tuża l-vleġeġ tat-tastiera "fuq" u "l isfel", u l-għażla tal-elementi hija "xellug" jew "lemin".

L-indikatur tal-vista -> ifisser li inti qiegħed f'submenu, li jista' jiġi aċċessat billi tuża ċ-ċavetta Enter. It-triq 'il barra hija ovvjament permezz ta' '[Exit]".

Inkludi l-għażliet li ġejjin fi '[Select]' u kun żgur li hemm simbolu '[*]' ħdejhom:

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

Dak hu, tista' toħroġ minn din it-tieqa billi tagħżel b'mod sekwenzjali '[Exit]“. Kun żgur li fl-aħħar inti mitlub biex issalva l-konfigurazzjoni u agħżel '[Yes]".

Nirrakkomanda li tilgħab bl-għażliet tal-bini tal-qalba wara li taqra din il-kariga. Minn dawn l-esperimenti tista 'titgħallem ħafna dwar kif jaħdmu l-mekkaniżmi tal-qalba ta' livell baxx u kif bnadar differenti jaffettwaw kif tinbena l-qalba.

Bini tal-qalba

Il-kernel tal-Linux huwa programm kbir li jagħmel ħafna affarijiet. Anke b'din il-konfigurazzjoni minima fuq ħardwer antik, l-assemblaġġ jista 'jieħu żmien mhux ħażin. Allura ibni l-kernel billi tuża l-kmand li ġej:

make ARCH=um -j$(nproc)

Għalxiex? Dan il-kmand jgħid lill-bennej tagħna biex juża l-qlub u l-ħjut tas-CPU kollha disponibbli matul il-proċess tal-bini. Tim $(nproc) fl-aħħar ta 'Ibni ddaħħal l-output tal-kmand nproc, li hija parti coreutils fil-bini standard Ubuntu.

Wara xi żmien, il-qalba tagħna se tiġi kkompilata f'fajl eżekutibbli ./linux.

Installazzjoni tal-binarju

Peress li l-Modalità Utent fil-Linux toħloq binarju regolari, tista 'tinstallaha bħal kull utilità oħra. Hawn kif għamilt:

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

Huwa wkoll ta 'min niżguraw li ~/bin huwa tiegħek $PATH:

export PATH=$PATH:$HOME/bin

Konfigurazzjoni tas-Sistema tal-Fajl tal-Mistieden

Oħloq direttorju għas-sistema tal-fajls mistieden:

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

Iftaħ alpinelinux.org u ġo sezzjoni download sib il-link tat-tniżżil attwali MINI ROOT FILESYSTEM. Fil-ħin tal-kitba dan kien:

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

Niżżel dan it-tarball billi tuża 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

Issa daħħal id-direttorju tas-sistema tal-fajls mistieden u neħħi l-pakkjar tal-arkivju:

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

Il-passi deskritti se joħolqu mudell żgħir tas-sistema tal-fajls. Minħabba l-mod kif taħdem is-sistema, l-installazzjoni tal-pakketti permezz tal-maniġer tal-apk Alpine se tkun estremament diffiċli. Iżda din l-FS tkun biżżejjed biex tevalwa l-idea ġenerali.

Għandna bżonn ukoll għodda tini biex twaqqaf il-konsum tal-memorja proċessi zombie il-qalba mistieden tagħna.

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

Ħolqien ta 'Linja ta' Kmand tal-kernel

Il-kernel tal-Linux, bħall-biċċa l-kbira tal-programmi l-oħra, għandu argumenti tal-linja tal-kmand li jistgħu jiġu aċċessati billi tispeċifika ċ-ċavetta --help.

Hu nnifsu—jgħin

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.

Dan il-panel jenfasizza l-parametri ewlenin tat-tnedija. Ejja nħaddmu l-qalba bis-sett minimu meħtieġ ta 'għażliet:

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

Il-linji ta 'hawn fuq jgħidu lill-qalba tagħna dan li ġej:

  • Ejja nassumu li s-sistema tal-fajls tal-għeruq hija psewdo apparat /dev/root.
  • Agħżel hostfs bħala sewwieq tas-sistema tal-fajls tal-għeruq.
  • Immonta s-sistema tal-fajls mistieden li ħloqna fuq it-tagħmir tal-għeruq.
  • U iva, fil-modalità read-write.
  • Uża biss 64 megabytes ta 'RAM (tista' tuża ħafna inqas skont dak li qed tippjana li tagħmel, iżda 64 MB jidher li huwa l-aħjar ammont).
  • Il-qalba tibda awtomatikament /bin/sh kif init-proċess.

Mexxi dan il-kmand u għandek tikseb xi ħaġa bħal din li ġejja:

Folja oħra

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

Il-manipulazzjonijiet ta 'hawn fuq se jagħtuna sistema minima tal-mistieden, mingħajr affarijiet simili /proc jew isem tal-ospitant assenjat. Pereżempju, ipprova l-kmandi li ġejjin:

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

Biex toħroġ mis-sistema mistieden, daħħal exit jew agħfas kontroll-d. Dan se jispara l-qoxra segwit minn paniku tal-qalba:

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

Aħna ltqajna dan il-paniku tal-qalba minħabba li l-qalba tal-Linux jaħseb li l-proċess tal-inizjalizzazzjoni dejjem għaddej. Mingħajrha, is-sistema ma tistax tiffunzjona aktar u tintefa. Iżda peress li dan huwa proċess tal-modalità tal-utent, ir-riżultat li jirriżulta jibgħat lilu nnifsu lil SIGABRT, li twassal għall-ħruġ.

Twaqqif ta' netwerk mistieden

Iżda dan huwa fejn l-affarijiet jibdew imorru ħażin għalina. In-netwerking fil-Modalità tal-Utent Linux huwa fejn il-kunċett kollu ta '"modalità tal-utent" limitat jibda jinqasam. Wara kollox, in-netwerk ġeneralment ikun limitat fil-livell tas-sistema privileġġjat modi ta 'eżekuzzjoni għal raġunijiet ovvji għalina lkoll.

Nota per.: Tista 'taqra aktar dwar għażliet differenti biex taħdem ma' netwerk f'UML hawn.

Vjaġġ biex slirp

Madankollu, hemm għodda antika u prattikament mhux appoġġjata msejħa Slirp, li biha User Mode Linux jista' jinteraġixxi man-netwerk. Topera bejn wieħed u ieħor bħal munzell TCP/IP fil-livell tal-utent u ma teħtieġ l-ebda permess tas-sistema biex taħdem. Din l-għodda kienet rilaxxat fl-1995, u l-aħħar aġġornament huwa datat 2006. Slirp huwa antik ħafna. Matul iż-żmien mingħajr appoġġ u aġġornamenti, kompilaturi waslu tant li issa din l-għodda tista 'tiġi deskritta biss bħala "taħsir tal-kodiċi".

Allura, ejja tniżżel Slirp mir-repożitorji ta 'Ubuntu u nipprova tħaddem:

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 allat tiegħi. Ejja ninstallaw id-debugger Slirp u naraw jekk nistgħux insemmu x'inhu għaddej hawn:

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.

L-iżball qed iħabbat fuqna din il-linja. Ejja nħarsu lejn l-istacktrace, forsi xi ħaġa tgħinna hemm:

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

Hawnhekk naraw li l-ħabta sseħħ waqt l-istartjar tal-linja prinċipali, meta slirp jipprova jiċċekkja l-timeouts. Kien f'dan il-mument li kelli nieqaf milli nipprova niddebug. Imma ejja naraw jekk Slirp, mibnija minn xorta, jaħdem. Erġajt niżżilt l-arkivju direttament mis-sit Sourceforge, għax tkaxkir xi ħaġa minn hemm permezz tal-linja tal-kmand hija uġigħ:

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

Hawnhekk naraw twissijiet dwar funzjonijiet inkorporati mhux definiti, jiġifieri dwar l-impossibbiltà li torbot il-fajl binarju li jirriżulta. Jidher li bejn l-2006 u issa gcc waqaf joħloq simboli użati f'funzjonijiet intermedji mibnija. Ejja nippruvaw nissostitwixxu l-keyword inline għal kumment vojt u ħares lejn ir-riżultat:

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

Le. Dan lanqas ma jaħdim. Għadu ma tistax issib simboli għal dawn il-funzjonijiet.

F'dan il-punt ċeda u bdejt infittex fuq Github Heroku jibni pakketti. It-teorija tiegħi kienet li xi pakkett tal-bini Heroku kien ikun fih il-binarji li kelli bżonn. Fl-aħħar, it-tfittxija tiegħi wasslitni hawnhekk. Niżżilt u żppakkjat uml.tar.gz u sabet dan li ġej:

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*

Dan huwa binarju slirp! Jaħdem?

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

Ma taqax - għalhekk għandha taħdem! Ejja nħawlu dan il-binarju ~/bin/slirp:

cp slirp ~/bin/slirp

F'każ li l-kreatur tal-pakkett ineħħih, I għamel mera.

Twaqqif tan-netwerk

Issa ejja kkonfiguraw in-netwerk fuq il-qalba tal-mistieden tagħna. Ejja naġġornaw il-parametri tat-tnedija:

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

Issa ejja nippermettu n-netwerk:

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

L-ewwel żewġ kmandi tal-konfigurazzjoni /proc и /sys meħtieġa għax-xogħol ifconfig, li jistabbilixxi interface tan-netwerk biex jikkomunika ma' Slirp. Tim route jistabbilixxi t-tabella tar-routing tal-kernel biex iġġiegħel it-traffiku kollu jintbagħat mill-mina Slirp. Ejja niċċekkjaw dan b'mistoqsija 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

Jaħdem!

Nota per.: Apparentement, il-post oriġinali kien miktub fuq desktop b'karta tan-netwerk bil-fili, jew xi konfigurazzjoni oħra li ma teħtieġx sewwieqa addizzjonali. Fuq laptop b'WiFi 8265 minn Intel, iseħħ żball meta tgħolli n-netwerk

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

Apparentement, il-kernel ma jistax jikkomunika mas-sewwieq tad-drajv tan-netwerk. Attentat biex jinġabar il-firmware fil-qalba, sfortunatament, ma kkoreġix is-sitwazzjoni. Fiż-żmien tal-pubblikazzjoni, għadha ma setgħet tinstab l-ebda soluzzjoni f'din il-konfigurazzjoni partikolari. Fuq konfigurazzjonijiet aktar sempliċi (per eżempju, f'Virtualbox), l-interface titqajjem b'mod korrett.

Ejja awtomatizzaw ir-ridirezzjoni billi tuża l-iskript tal-qoxra li ġej:

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

U mmarkaha bħala eżekutibbli:

chmod +x init.sh

U mbagħad ejja nagħmlu bidliet fil-linja tal-kmand tal-kernel:

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

U ejja nirrepetu:

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

In-netwerk huwa stabbli!

fajl docker

Biex tagħmilha aktar faċli għalik li tiċċekkja dan kollu, ġabar dockerfile, li awtomatizza ħafna mill-passi deskritti u għandha tagħtik konfigurazzjoni ta' ħidma. Għandi wkoll konfigurazzjoni tal-qalba lesta, li fih dak kollu deskritt fil-post. Iżda huwa importanti li tifhem li hawn spjegajt biss is-settings minimi.

Nittama li din il-kariga għenet tifhem kif tqajjem kernel mistieden. Irriżulta li kien xi tip ta 'mostru, iżda l-pubblikazzjoni kienet maħsuba bħala gwida komprensiva dwar is-suġġett tal-assemblaġġ, l-installazzjoni u l-konfigurazzjoni tal-Modalità tal-Utent fil-Linux taħt verżjonijiet moderni tas-sistemi operattivi ta' din il-familja. Il-passi sussegwenti għandhom jinkludu l-installazzjoni tas-servizzi u softwer ieħor diġà fis-sistema mistieden. Peress li l-immaġini tal-kontejners Docker huma biss tarballs promossi, għandek tkun tista 'tiġbed l-immaġni permezz docker export, u mbagħad iddetermina l-mogħdija biex tinstallaha fl-għerq tas-sistema tal-fajl tal-kernel mistieden. Ukoll, imbagħad mexxi l-iskrittura tal-qoxra.

Grazzi speċjali lil Rkeene minn #lobsters fuq Freenode. Mingħajr l-għajnuna tiegħu fid-debugging ta 'Slirp, ma kontx wasalt s'issa. M'għandi l-ebda idea kif is-sistema Slackware tiegħu taħdem b'mod korrett bi slirp, iżda s-sistemi Ubuntu u Alpini tiegħi ma aċċettawx slirp u r-Rkeene binarju ssuġġerieli. Iżda huwa biżżejjed għalija li għall-inqas xi ħaġa taħdem għalija.

Sors: www.habr.com

Żid kumment