Kuidas alustada User Mode'i kasutamist Linuxis

TĂ”lkija sissejuhatus: Erinevate konteinerite massiline sisenemine meie ellu teeb huvitavaks ja kasulikuks teada, millistelt tehnoloogiatelt see kĂ”ik kunagi alguse sai. MĂ”nda neist saab ka tĂ€na kasulikult rakendada, kuid mitte kĂ”ik ei mĂ€leta (vĂ”i ei tea, kui nad ei kooli ajal nende kiiret arengut Ă€ra nĂ€inud). Üks selline tehnoloogia on User Mode Linux. Originaali autor on pĂ”hjalikult uurinud, mis vanadest arendustest veel töötab ja mis mitte, ning koostanud midagi sarnast samm-sammulisele juhendile, kuidas ise 2k19 aastal kodutehnoloogia UML kĂ€ivitada. Ja jah, kutsusime Habrisse originaali postitaja. Cadey, nii et kui on kĂŒsimusi — kĂŒsige inglise keeles kommentaarides.

Kuidas alustada User Mode'i kasutamist Linuxis

User Mode Linuxis — see on tegelikult Linuxi tuuma port iseendasse. See reĆŸiim vĂ”imaldab kĂ€ivitada tĂ€isfunktsionaalset Linuxi tuuma kasutaja protsessina ja seda kasutatakse tavaliselt arendajate poolt draiverite testimiseks. Kuid see reĆŸiim on kasulik ka ĂŒldise isoleerimise tööriistana, mille pĂ”himĂ”te sarnaneb virtuaalmasinate tööle. See reĆŸiim pakub suuremat isoleerimist kui Docker, kuid vĂ€hem kui tĂ€isvÀÀrtuslik virtuaalmasin nagu KVM vĂ”i Virtual Box.

KokkuvĂ”ttes vĂ”ib User Mode tunduda kummaline ja keeruline tööriist, kuid sellel on siiski oma rakendusalad. LĂ”ppude lĂ”puks on tegemist tĂ€isfunktsionaalse Linuxi tuumaga, mis töötab mitteprivileegitud kasutaja alt. See omadus vĂ”imaldab kĂ€ivitada potentsiaalselt ebaturvalist koodi ilma mingeid ohte host-masinale. Ja kuna see on tĂ€isfunktsionaalne tuum, on selle protsessid isoleeritud host-masinast, see tĂ€hendab et User Mode'is töötavad protsessid ei ole hostile nĂ€htavad. See ei sarnane traditsioonilisele Docker-konteinerile, kus host-masin nĂ€eb alati töötlusi, mis asuvad salvestuses. Vaadake seda pstree lĂ”iku ĂŒhest minu serverist:

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

Ja vÔrrelge seda Linuxi tuumade pstree'iga User Mode'is:

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

Docker-konteinerite kasutamisel nĂ€en hostilt protsesside nimesid, mis on kĂ€ivitatud kĂŒlalisĂŒsteemis. Linux User Mode'is on see vĂ”imatu. Mida see tĂ€hendab? See tĂ€hendab, et jĂ€lgimistööriistad, mis töötavad Linuxi auditeerimise alamsĂŒsteemi kaudu, ei nĂ€e kĂŒlalisĂŒsteemis kĂ€ituvate protsesside nimed. Kuid mĂ”nes olukorras vĂ”ib see omadus osutuda kahe teraga mÔÔgaks.

Kogu allolev postitus on analĂŒĂŒside ja julgete katsete kogum soovitud tulemuste saavutamiseks. Selleks pidin olema erinevate vanade tööriistade kasutamisel, lugema tuumakoodi ning intensiivselt silumise tegemiseks koodi, mis kirjutati ajal, mil olin veel algkoolis, samuti pean uurima Heroku ehitusi spetsiaalse binaariga vajalike tööriistade leidmiseks. See kĂ”ik tĂ”i kaasa selle, et mu IRC-sĂ”brad hakkasid mulle vĂ”luriks (magic) nimetama. Loodan, et see postitus teenib kedagi kindla dokumentatsioonina, et sama teha, kuid uuemate tuumade ja operatsioonisĂŒsteemi versioonidega.

Seadistamine

Linux User Mode'i seadistamine toimub mitmes etapis:

  • sĂ”ltuvuste installimine hostis;
  • Linuxi tuuma allalaadimine;
  • tuuma ehituse seadistamine;
  • tuuma kogumine;
  • binaaride installimine;
  • kĂŒlalisfailisĂŒsteemi seadistamine;
  • tuuma kĂ€ivitamisparameetrite valimine;
  • kĂŒlalisvĂ”rgu seadistamine;
  • kĂŒlalisnĂ€idu kĂ€ivitamine.

Ma arvan, et kui otsustate selle ise ette vĂ”tta, siis teete suure tĂ”enĂ€osusega kĂ”ik kirjeldatu mĂ”nes Ubuntu vĂ”i Debian-sarnases sĂŒsteemis. Proovisin kĂ”ike, mida eelnevalt mainisin, rakendada oma lemmikjaotuses - Alpine, kuid ei suutnud, ilmselt seetĂ”ttu, et Linuxi kernelil on glibc-isms'i tĂ”ttu juhtmeteo fĂŒr User Mode ĂŒlesanne. Kavatsema sellest upstream'ile teada anda, kui olen probleemist tĂ€ielikult aru saanud.

SÔltuvuste installimine hostis

Ubuntu nÔuab vÀhemalt jÀrgmisi pakette Linuxi kernelit kompileerimiseks (eeldusel, et see on puhas install):

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

Saate need installida jÀrgmise kÀsuga (root Ôigustega vÔi sudo abil):

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

Pange tĂ€hele, et Linuxi kernelite seadistusmenĂŒĂŒ programmi kĂ€ivitamine nĂ”uab libncurses-dev. Palun veenduge, et see on installitud jĂ€rgmise kĂ€su abil (root Ă”igustega vĂ”i sudo abil):

apt-get -y install libncurses-dev

Kernel'i allalaadimine

MÀÀrake koht, kuhu kernel laadida ja hiljem ehitada. Selle operatsiooni jaoks vajate umbes 1,3 GB kÔvakettaruumi, seega veenduge, et see on olemas.

SeejÀrel minge saidile kernel.org ja saage viidatud URL viimase stabiilse kernel'i versiooni allalaadimiseks. Postituse kirjutamise ajal on see: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Laadige see fail alla, kasutades 'wget':

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

Ja ekstrakteerige see kasutades 'tar':

tar xJf linux-5.1.16.tar.xz

NĂŒĂŒd liikuge katalooge, mis loodi tarball'i lahti pakkimisel:

cd linux-5.1.16

Kernel'i ehitamise seadistamine

Kernel'i ehitusmoodul on kogum Make-failidest jot rohketest kasutajatööriistadest ja skriptidest, mis automatiseerivad protsessi. Alustuseks avage interaktiivne seadistusprogramm:

make ARCH=um menuconfig

See viib teid osaliselt ehituse juurde ja kuvab dialoogakna. Kui akna allosas kuvatakse '[Select]', saate seadistamist alustada klahvidega Space vĂ”i Enter. Liikumine aknas toimub nagu tavaliselt, ĂŒles-alla nooltega ja elementide valik vasakule vĂ”i paremale.

NĂ€punĂ€ide kujul -> tĂ€hendab, et olete allmenĂŒĂŒs, kuhu sisenemise jaoks vajuta Enter. VĂ€ljumiseks on uhvasti '[Exit]‘.

LĂŒlitage sisse jĂ€rgmised parameetrid '[Select]' ja veenduge, et nende kĂ”rval on sĂŒmbol '[*]':

UML-spetsiifilised valikud:
  - KĂŒlalise failisĂŒsteem
VĂ”rgu tugi (lĂŒlitage see sisse, et menĂŒĂŒ oleks nĂ€htav):
  - VÔrgu valikud:
    - TCP/IP vĂ”rguĂŒhendus
UML vÔrguseadmendid:
  - Virtuaalne vÔrgu seade
  - SLiRP transport

KĂ”ik, sellest aknast saab vĂ€ljumiseks jĂ€rjestikku valida ‘[Exit]‘. Veenduge, et lĂ”puks pakutakse teil konfiguratsiooni salvestamist ja valige ‘[Jah]‘.

Soovitan teil pÀrast selle postituse lugemist mÀngida tuumakomplekteerimise parameetritega. Neid eksperimente tehes Ôpite palju tuuma madalamate mehhanismide töö mÔistmisel ja erinevate lippude mÔjususes selle koostamisele.

Tuumakomplekteerimine

Linuxi tuum on suur programm, mis tegeleb paljude asjadega. Isegi sellise minimaalse konfiguratsiooni korral vanadel seadmetel vÔib selle komplekteerimine vÔtta juba piisavalt aega. SeetÔttu koostage tuum jÀrgmise kÀsuga:

make ARCH=um -j$(nproc)

Miks? See kĂ€sk ĂŒtleb meie koostajale kasutada kĂ”iki saadaolevaid tuumikuid ja protsessorivaranteid koostamisprotsessi kĂ€igus. KĂ€sk $(nproc) Build lĂ”pus asendab kĂ€sk nproc, mis on osa coreutils tavapĂ€rases Ubuntu kogumises.

MÔne aja pÀrast on meie tuum koostatud tÀitmiseks ./linux.

Binaari installimine

Kuna User Mode Linux loob tavalise binaari, saab seda installida nagu iga teist tööriista. Nii tegin mina:

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

Samuti tasub veenduda, et ~/bin on teie $PATH:

export PATH=$PATH:$HOME/bin

KĂŒlastaja failisĂŒsteemi seadistamine

Looge kĂŒlalise failisĂŒsteemi jaoks kataloog:

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

Avage alpinelinux.org ja allalaadimise jaotises leidke aktiivne link allalaadimiseks MINI ROOT FILESYSTEM.Selle postituse kirjutamise ajal oli see:

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

Laadige see tarball wget'iga alla:

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

NĂŒĂŒd minge kĂŒlalise failisĂŒsteemi kataloogi ja lahti pakkige arhiv:

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

Kirjeldatud toimingud loovad vĂ€ikese failisĂŒsteemi mustandi. Kuna sĂŒsteemi omadused muudavad pakkide installimise lĂ€bi Alpine’i apk halduri vĂ€ga keeruliseks, siis piisab sellest failisĂŒsteemist ĂŒldise idee hindamiseks.

Samuti vajame tööriista tini zombie-protsesside mĂ€lutarbimise piiramiseks meie kĂŒlalise tuumas.

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

TuumakÀsku genereerimine

Linuxi tuumas, nagu enamikus teistes programmides, on kÀskude argumendid, millega saab tutvuda, kui sisestate vÔtme --help.

Ise —help

linux --help
KasutajareĆŸiimi Linux v5.1.16
        saadaval aadressil http://user-mode-linux.sourceforge.net/

--showconfig
    TrĂŒkib konfiguratsioonifaili, mille pĂ”hjal see UML binaar genereeriti.

iomem=,
    Konfigureeri  IO mÀluregionina nimega .

mem=
    See kontrollib, kui palju "fĂŒĂŒsilist" mĂ€lu sĂŒdamik eraldab
    sĂŒsteemile. Suurus mÀÀratakse arvuna, millele jĂ€rgneb
    ĂŒks 'k', 'K', 'm', 'M', millel on ilmsed tĂ€hendused.
    See ei ole seotud hosti mÀlu mahuga. See vÔib
    olla suurem, ja ĂŒlejÀÀk, kui seda kunagi kasutatakse, lihtsalt vahetatakse vĂ€lja.
        NĂ€ide: mem=64M

--help
    TrĂŒkib selle sĂ”numi.

debug
    seda lippu ei ole vaja gdb kĂ€itamiseks UML-is skas reĆŸiimis

root=
    Seda kasutatakse tegelikult ĂŒldise sĂŒdamiku poolt tĂ€pselt samal
    viisil nagu mis tahes muus sĂŒdamikus. Kui konfigureerite mitmeid plokk
    seadmeid ja soovite bootida midagi muud kui ubd0, peaksite
    kasutama midagi sellist:
        root=/dev/ubd5

--version
    TrĂŒkib sĂŒdamiku versiooninumbri.

umid=
    Seda kasutatakse UML masina unikaalse identiteedi mÀÀramiseks ja
    seda kasutatakse pid faili ja halduskonsooli soketi nimetamiseks.

con[0-9]*=
    Ühendage konsool vĂ”i seriaalne liin hosti kanaliga.  Vaata
    http://user-mode-linux.sourceforge.net/old/input.html selle lĂŒliti tĂ€ieliku
    kirjelduse jaoks.

eth[0-9]+=,
    Konfigureeri vÔrgu seade.
    
aio=2.4
    Seda kasutatakse UMLi sundimiseks kasutama 2.4 stiilis AIO isegi kui 2.6 AIO on
    saadaval.  2.4 AIO on ĂŒks teema, mis kĂ€sitleb ĂŒhte taotlust korraga,
    sĂŒnkroonselt.  2.6 AIO on teema, mis kasutab 2.6 AIO
    liidest, et kÀsitleda suvalist hulka ootel taotlusi.  2.6 AIO
    ei ole saadaval tt reĆŸiimis, 2.4 hostides vĂ”i kui UML on koostatud
    ilma /usr/include/linux/aio_abi.h.  Paljud jaotused ei
    sisalda aio_abi.h, seega peate selle kopeerima kernelipuu 
direktorist oma /usr/include/linux, et koostada AIO-toega UML

nosysemu
    Keerab syscall emulatsiooni plaastri ptrace'i (SYSEMU) vÀlja.
    SYSEMU on sooritusvÔime plaaster, mille on tutvustanud Laurent Vivier. See muudab
    ptrace() kÀitumist ja aitab vÀhendada hosti konteksti vahetusmÀÀrasid.
    Selle toimimiseks vajate ka hostile sĂŒdamiku plaastrit.
    Lisainformatsiooni saamiseks vaata http://perso.wanadoo.fr/laurent.vivier/UML/

uml_dir=
    Asukoht pid ja umid failide paigutamiseks.

quiet
    Keerab kÀivitamise ajal teavitused vÀlja.

hostfs=,,...
    Seda kasutatakse hostfs parameetrite seadmiseks.  Juurdirektori argument
    kasutatakse, et piirata kÔiki hostfs mÀhiseid mÀÀratud kaustapuu
    alla hostis.  Kui seda ei ole mÀÀratud, vÔivad UML-i sees olevad kasutajad
    mountida mis tahes, mis on hostis sellele kasutajale, kes seda kÀitab,
    kergesti ligipÀÀsetav.
    Ainuke toetatud lipp on 'append', mis mÀÀrab, et kÔik
    hostfs-i avatud failid avatakse lisamisreĆŸiimis.

See rida selgitab meie sĂŒdame pĂ”hiseade parameetreid. KĂ€ivitame sĂŒdamiku minimaalse vajaliku valikute kogumiga:

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

Ülaltoodud read ĂŒtlevad meie sĂŒdamikule jĂ€rgmist:

  • Oletame, et juurfailisĂŒsteem on pseudoseade /dev/root.
  • Vali hostfs juurkataloogi failisĂŒsteemi draiverina.
  • Kinnita kĂŒlalisfailisĂŒsteem, mille me juurtseadmest loome.
  • Ja jah, lugemis-kirjutamisreĆŸiimis.
  • Kasutage ainult 64 megabaiti RAM-i (te vĂ”ite kasutada palju vĂ€hem, sĂ”ltuvalt sellest, mida te plaanite teha, kuid 64 MB tundub optimaalne maht).
  • Kernel kĂ€ivitab automaatselt /bin/sh kuidas — algne ettevalmistus enne juurutamist, siin vĂ”ib olla kĂ”ike: sĂ”ltuvuste allalaadimist, saladuste lahtipakkimist ja muud.-protsessi.

KÀivitage see kÀsk ja peaksite nÀgema midagi sellist:

Veel ĂŒks rida

Tuuma piirangud :
        pehme - 0
        kÔva - PUUDUB
Kontrollitakse, kas ptrace saab muuta sĂŒsteemi kutsumisnumbreid...OK
Kontrollitakse syscall emulatsiooni plaastrit ptrace jaoks...OK
Kontrollitakse edasijÔudnud syscall emulatsiooni plaastrit ptrace jaoks...OK
Kontrollitakse keskkonnamuutujate jaoks ajutise kausta olemasolu...ei leitud ĂŒhtegi
Kontrollitakse, kas /dev/shm on tmpfs...OK
Kontrollitakse PROT_EXEC mmap-i /dev/shm...OK
Lisatakse 32137216 baiti fĂŒĂŒsilisse mĂ€llu exec-shield'i tĂŒhiku arvestamiseks
Linuxi versioon 5.1.16 (cadey@kahless) (gcc versioon 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 PĂŒhapĂ€ev 7. juuli 18:57:19 UTC 2019
Kokku toodud 1 zoneliste loetelu, liikuvuse grupeerimine sisselĂŒlitatud.  Kokku lehed: 23898
Kerneli kÀsurea: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Dentry vahemÀlu hash tabeli kanded: 16384 (jÀrjekord: 5, 131072 baiti)
Inode-vahemÀlu hash tabeli kanded: 8192 (jÀrjekord: 4, 65536 baiti)
MĂ€lu: 59584K/96920K saadaval (2692K kerneli kood, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K reserveeritud, 0K cma-reserveeritud)
SLUB: HWalign=64, JÀrjekord=0-3, MinObjects=0, CPU-d=1, SÔlmed=1
NR_IRQS: 15
kellasource: taimer: mask: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns
Kalibreerimine viivituse tsĂŒklis... 7479.29 BogoMIPS (lpj=37396480)
pid_max: vaikimisi: 32768 minimaalne: 301
Mount-cache hash tabeli kanded: 512 (jÀrjekord: 0, 4096 baiti)
Mountpoint-cache hash tabeli kanded: 512 (jÀrjekord: 0, 4096 baiti)
Kontrollitakse, et host ptys toetab SIGIO vÀljundit...Jah
Kontrollitakse, et host ptys toetab SIGIO sulgemisel...Ei, lubatakse lahendus
devtmpfs: algatatud
random: get_random_bytes kutsutud setup_net+0x48/0x1e0, crng_init=0
Kasutades 2.6 host AIO
kellasource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex vahemÀlu hash tabeli kanded: 256 (jÀrjekord: 0, 6144 baiti)
NET: Registreeritud protokolli perekond 16
kellasource: Vahetatud kellaressursile taimer
NET: Registreeritud protokolli perekond 2
tcp_listen_portaddr_hash hash tabeli kanded: 256 (jÀrjekord: 0, 4096 baiti)
TCP loodud hash tabeli kanded: 1024 (jÀrjekord: 1, 8192 baiti)
TCP bind hash tabeli kanded: 1024 (jÀrjekord: 1, 8192 baiti)
TCP: Hash tabelid konfigureeritud (loodud 1024, bind 1024)
UDP hash tabeli kanded: 256 (jÀrjekord: 1, 8192 baiti)
UDP-Lite hash tabeli kanded: 256 (jÀrjekord: 1, 8192 baiti)
NET: Registreeritud protokolli perekond 1
konsool [stderr0] keelatud
mconsole (versioon 2) algatatud /home/cadey/.uml/tEwIjm/mconsole
Kontrollitakse host MADV_REMOVE tuge...OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Bloki tasandi SCSI ĂŒldine (bsg) draiveri versioon 0.4 laaditud (suurem 254)
io ajakava noop registreeritud (vaikimisi)
io ajakava bfq registreeritud
loop: moodul laaditud
NET: Registreeritud protokolli perekond 17
Algatatud stdio kontrolleri draiver
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 1 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 2 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 3 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 4 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 5 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 6 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 7 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 8 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 9 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 10 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 11 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 12 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 13 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 14 jaoks: Konfigureerimine ebaÔnnestus
Kasutades kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 15 jaoks: Konfigureerimine ebaÔnnestus
Konsool algatatud /dev/tty0
konsool [tty0] lubatud
konsool [mc-1] lubatud
Ubd seadme 0 algatamine ebaÔnnestus: Seadmest faili suurust ei Ônnestunud mÀÀrata
VFS: Mountitud juur (hostfs failisĂŒsteem) seadmel 0:11.
devtmpfs: mountitud
See arhitektuur ei oma kerneli mÀlukaitset.
KĂ€ivita /bin/sh algprotsessina
/bin/sh: ei saa tty-le juurde pÀÀseda; töökontroll on vĂ€lja lĂŒlitatud
random: kiire algus lÔpetatud
/ # 

Ükski ĂŒlaltoodud manipuleerimine ei too meile minimaalseid kĂŒlalisĂŒsteeme, ilma selliste asjadeta nagu /proc vĂ”i mÀÀratud hostinimi. NĂ€iteks proovige jĂ€rgmisi kĂ€ske:

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

KĂŒlalisĂŒsteemist vĂ€ljuda sisestage exit vĂ”i vajutage control-d. See tapab shelli jĂ€rgnevate kernel panic'iga:

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

Saime selle kernel panic'i tĂ”ttu, et Linuxi kernel arvab, et initsialiseerimisprotsess on alati kĂ€ivitunud. Ilma selleta ei saa sĂŒsteem enam toimida ja lĂ”petab töö. Kuna see on kasutajareĆŸiimi protsess, saadab saadud tulemus end ise SIGABRT, mis viib vĂ€ljuminemiseni.

KĂŒlageriigi seadistamine

Siin hakkavad asjad mitteplaanipĂ€raselt kĂ€ima. User Mode Linuxis on vĂ”rk see koht, kus kogu piiratud „kasutajareĆŸiimi” kontseptsioon hakkab lagunema. Tavaliselt on vĂ”rgu tasand sĂŒsteemitasemel piiratud privileegidega tĂ€itmisreĆŸiimide tĂ”ttu, mille pĂ”hjused on meile mĂ”istetavad.

MÀrkus tÔlkijale: rohkem erinevaid vÔrgu funktsioone UML-is saab lugeda siin.

Reis slirpi

Kuid on olemas iidne ja praktiliselt toetamata tööriist nimega Slirp, mille abil User Mode Linux suudab vĂ”rku ĂŒhenduda. See töötab umbes nagu TCP/IP stack kasutaja tasemel ning ei nĂ”ua esmaĂ”igusi sĂŒsteemi kĂ€ivitamiseks. See tööriist ilmus 1995. aastal, ja viimane uuendus oli aastal 2006. Slirp on vĂ€ga vana. Aja jooksul toetamata ja uuendamata on kompilandid nii kaugele lĂ€inud, et seda tööriista saab nĂŒĂŒd iseloomustada ainult kui «koodi lagunemine».

Nii et installime Slirpi Ubuntu hoidlatest ja proovime seda kÀivitada:

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

Copyright (c) 1995,1996 Danny Gasparovski ja teised.
KÔik Ôigused kaitstud.
See program on autoriÔigusega kaitstud, vabavara.
Palun lugege Slirpi
paketi kaasasolevat faili COPYRIGHT ning autoriÔiguse tingimusi.

Slirpi hosti IP-aadress: 127.0.0.1
Teie DNS (id) IP-aadress: 1.1.1.1, 10.77.0.7
Teie aadress on 10.0.2.15
(vÔi mis tahes muu, mida soovite)

Sisestage viis nulli (0) vÀljamiseks.

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

SLiRP Valmis ...
fish: “/usr/bin/slirp” lĂ”petati signaaliga SIGSEGV (aadressi piiri viga)

Oh, jumal. Installime Slirpi jaoks siluri ja vaatame, kas suudame aru saada, mis siin toimub:

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 
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:
.
Find the GDB manual and other documentation resources online at:
.
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.

Viga esin, mis meil on selles reas. Vaatame stacktrace'i, ehk seal on midagi, mis aitab:

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

Siin nĂ€eme, et viga tekib programmi pĂ”hitsĂŒkli kĂ€ivitamise ajal, kui slirp pĂŒĂŒab kontrollida ajutajajaid. Just sel hetkel oleksin pidanud loobuma veaparandamise katsetest. Aga vaatame, kas Slirp, mis on allalaaditud allikatest, töötab. Laadisin arhiivi otse veebisaidilt Sourceforge, sest midagi selle kaudu kĂ€surealt tĂ”mmata — on vaev:

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

Siin nĂ€eme hoiatusi mÀÀratlemata sisseehitatud funktsioonide kohta, st ei ole vĂ”imalik siduda tulemust esitlevat binaarfaili. Tundub, et 2006. aasta ja selle hetke vahel on gcc lĂ”petanud sĂŒmbolite loomise, mida kasutatakse sisseehitatud funktsioonide puhul vahepeal kompilitud failides. Proovime asendada mĂ€rksĂ”na inline tĂŒhja kommentaariga ja vaatame, mis juhtub:

vi slirp.h
:6
a

#define inline /**/

:wq
make

Ei, see ei tööta. Endiselt ei suuda leida nende funktsioonide sĂŒmboleid.

Sel etapil andsin alla ja hakkasin otsima Githubist Heroku koostepakette. Minu teooria pÔhines sellel, et mingis Heroku koostepaketis peavad olema vajalikud binaarfailid. LÔpuks viisid mu otsingud siia. Laadisin alla ja unpackisin uml.tar.gz ja leidsin jÀrgmist:

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*

See on binaarfail slirp! Aga kas see töötab?

.\/slirp
Slirp v1.0.17 (BETA) FULL_BOLT

Copyright (c) 1995,1996 Danny Gasparovski ja teised.
KÔik Ôigused kaitstud.
See programm on autoriÔiguse alla, vabavarana.
Palun lugege Slirp'i paketiga kaasas olevat faili COPYRIGHT autoriÔiguse tingimuste kohta.

Slirp hosti IP-aadress: 127.0.0.1
Teie DNS(i) IP-aadress: 1.1.1.1, 10.77.0.7
Teie aadress on 10.0.2.15
(vÔi mis tahes muu, mida soovite)

Tipake viis nulli (0), et vÀljuda.

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

SLiRP valmis...

Ei kukku maha — nii et see peaks toimima! LĂ€hme ja paneme selle binaari ~\/bin\/slirp:

cp slirp ~\/bin\/slirp

Juhuks, kui paketi looja selle eemaldab, tegin ma peegeldise.

VÔrgu seadistamine

NĂŒĂŒd seadistame vĂ”rgu meie kĂŒlaliskernelis. Uuendame kĂ€ivitusparameetreid:

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

NĂŒĂŒd lubame vĂ”rgu:

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

Esimesed kaks seadistamise kÀsku /proc ja /sys on vajalikud tööks ifconfig, mis seadistab vÔrguinterfeisi suhtlemiseks Slirpiga. KÀsk route seadistab tuuma marsruuditabeli, et sunniviisiliselt suunata kogu liiklus Slirpi tunnelisse. Vaadake seda DNS-pÀringu abil:

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

Töötab!

MÀrkus: Tundub, et algne postitus kirjutati lauaarvutil koos kaabli vÔrkaartiga vÔi mÔne muu konfiguratsiooniga, mis ei nÔua tÀiendavaid draivereid. Laptopil, millel on Intel 8265 WiFi, esines vÔrgu loomisel viga

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

Ilmselt ei saa tuum suhelda vÔrgukaardi draiveriga. Katse integreerida firmware tuumasse ei parandanud olukorda. Postitamise hetkeks pole selle konfiguratsiooni jaoks lahendust veel leitud. Lihtsates konfiguratsioonides (nÀiteks Virtualboxis) tÔuseb liidese tÔus korrektselt.

Hankime suunata automatiseerimist jÀrgmise shell-skriptiga:

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

Ja teeme selle tÀidetavaks:

chmod +x init.sh

Ja siis muudame kernel'i kÀsuviibi:

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

Ja korrame:

SLiRP On Valmis ...
etworking on seadistatud
\/bin\/sh: ei saa tty'le juurde pÀÀseda; töö kontroll on keelatud

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

KĂŒte töötab stabiilselt!

Docker-fail

Kuna ma tahaksin, et teil oleks lihtsam kÔiki neid samme kontrollida, olen koostanud Dockerfile, mis automatiseerib enamikku kirjeldatud sammudest ja peaks tagama teile töötava konfiguratsiooni. Mul on ka valmis kernel'i konfiguratsioon, milles on kÔik, mis on postituses kirjas. Kuid on oluline mÔista, et siin on vÀlja toodud ainult minimaalne seadistus.

Loodan, et see postitus aitas teil mĂ”ista, kuidas kĂ€ivitada kĂŒlastus kernel'it. Tuli vĂ€lja mingi koletis, kuid postitust mĂ”eldi kui kĂ”ikehĂ”lmavat juhendit User Mode'i kokkupanekuks, installimiseks ja seadistamiseks Linuxis kaasaegsete operatsioonisĂŒsteemide versioonide all. Edasi liikudes peaks hĂ”lmama teenuste ja muu tarkvara installimist juba kĂŒlastussĂŒsteemis. Kuna Docker konteinerite pildid on lihtsalt tihendatud tar-arhiivid, peaksite olema suuteline pildi vĂ€lja tĂ”mbama lĂ€bi docker export, ja seejĂ€rel mÀÀrama tĂ”ukuriku installimise tee kĂŒlastus kernel'i failisĂŒsteemi juures. Siis tĂ€itke shell-skript.

Erilised tĂ€nud Rkeene'le #lobsters kanalil Freenode'is. Ilma tema abita Slirpi tĂ”rgete lahendamisel poleks ma nii kaugele jĂ”udnud. Ma ei tea, kuidas tema Slackware sĂŒsteem tĂ€pselt Slirpiga töötas, kuid minu Ubuntu ja Alpine sĂŒsteemid ei saanud Slirpit ja soovitatud Rkeene binaarfaili. Kuid piisab, et midagi töötab.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster