Kuidas alustada User Mode'i kasutamist Linuxis

TĂ”lkija sissejuhatus: Erinevate konteinerite laialdase kasutuselevĂ”tu taustal vĂ”ib olla ĂŒsna huvitav ja kasulik uurida, millistest tehnoloogiatest see kĂ”ik kunagi algas. MĂ”ndasid neist saab kasulikult rakendada ka tĂ€napĂ€eval, aga kĂ”ik ei mĂ€leta (vĂ”i ei tea, kui nad ei olnud tunnistajaks nende kiirele arengule). Üks selline tehnoloogia on User Mode Linux. Originaali autor uuris sĂŒvitsi, et mĂ”ista, millised vanad arendused veel töötavad ja millised mitte, ning koondas kokku midagi, mis sarnaneb samm-sammult juhendiga, kuidas ise endale koduse UML-i 2k19 kĂ€ivitada. Ja jah, me kutsusime Habri originaalpostituse autori. Cadey, nii et kui teil on kĂŒsimusi, kĂŒsige inglise keeles kommentaarides.

Kuidas alustada User Mode'i kasutamist Linuxis

User Mode Linux — see, port of the Linux kernel to itself. This mode allows you to run a full Linux kernel as a user process and is typically used by developers for testing drivers. However, this mode is also helpful as a tool for general isolation, similar to how virtual machines work. This mode provides greater isolation than Docker, but less than a full virtual machine like KVM or Virtual Box.

Overall, User Mode might seem like a strange and complex tool to use, but it still has its applications. After all, it is a fully-fledged Linux kernel running as an unprivileged user. This feature allows you to run potentially untrusted code without any threats to the host machine. And since it's a full kernel, its processes are isolated from the host machine, meaning the processes running inside User Mode will not be visible to the host. This is not like a typical Docker container, where the host machine can always see the processes inside the storage. Look at this piece of pstree from one of my servers:

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 kernel pstree'ga kasutajareĆŸiimis:

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

Docker-konteinerite kĂ€itamisel saan hostilt nĂ€ha protsesside nimesid, mis on kĂ€ivitatud kĂŒlgsĂŒsteemis. Linuxi kasutajareĆŸiimis ei ole see vĂ”imalik. Mis see tĂ€hendab? See tĂ€hendab, et jĂ€lgimistööristad, mis töötavad Linuxi auditialase alamsĂŒsteemi kaudu, ei nĂ€e kĂŒljel kĂ€ivitatavaid protsesse. Kuid mĂ”nes olukorras vĂ”ib see omadus olla ka kahesuunaline relv.

Kogu allolev postitus on uuringute ja katsete kogum, et saavutada soovitud tulemus. Selleks pidin kasutama erinevaid vanu tööriistu, lugema tuuma lĂ€htekoodi, tegema intensiivset koodi silumist, mis oli kirjutatud ajal, mil ma veel algkoolis kĂ€isin, ja kaevama Heroku kogumites erilise binaariga, et leida vajalikud tööriistad. KĂ”ik see töö tĂ”i selleni, et mu IRC sĂ”brad hakkasid mind nimetama nĂ”iaks (magic). Lo Ű§Ù…ÛŒŰŻÙˆŰ§Ű±Đ¶, et see postitus toob kedagi usaldusvÀÀrse dokumentatsioonina, et teha kĂ”ike sama, kuid uute tuumade ja OS versioonidega.

Seadistamine

Linux User Mode seadistamine toimub mitmes etapis:

  • sĂ”ltuvuste installimine hostis;
  • Linuxi tuuma allalaadimine;
  • tuuma kogumise seadistamine;
  • tuuma kokku kogumine;
  • binaari installimine;
  • kĂŒlaliste failisĂŒsteemi seadistamine;
  • tuuma kĂ€ivitusparameetrite valimine;
  • kĂŒlaliste vĂ”rgu seadistamine;
  • kĂŒlaliste tuuma kĂ€ivitamine.

Arvan, et kui otsustate kĂ”ik ise ajada, siis teete tĂ”enĂ€oliselt kĂ”ike Ubuntu vĂ”i Debian-taolises sĂŒsteemis. PĂŒĂŒdsin rakendada kĂ”ike eespool mainitut oma lemmikjaotuses — Alpine'is, kuid see ei Ă”nnestunud, ilmselt seetĂ”ttu, et Linuxi kernalil on tugev sidumine glibc-ims jaoks User Mode'i draiverite jaoks. Plaanin sellest upstream'is teatada, kui olen probleemiga tĂ€ielikult kursis.

SÔltuvuste installimine hostis

Ubuntu vajab, vÀhemalt, jÀrgmised paketid Linuxi kerneli ehitamiseks (eeldusel, et tegemist on puhta paigaldamisega):

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

Saate need installida jÀrgmise kÀsu abil (root'i Ôigustes 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 kerneli menĂŒĂŒ seadistamise programmi kĂ€ivitamine nĂ”uab libncurses-dev. Palun veenduge, et see on installitud jĂ€rgmise kĂ€su abil (root'i Ă”igustes vĂ”i sudo abil):

apt-get -y install libncurses-dev

Kerneli allalaadimine

MÀÀrake koht tuvastamiseks ja jĂ€rgmise sammu jaoks tuumade ĂŒleslaadimiseks. Selle protsessi jaoks on teil vaja umbes 1,3 Gt kettaruumi, seega veenduge, et teil on see olemas.

SeejÀrel minge aadressile kernel.org ja hankige viide viimasest stabiilsest tuumaversioonist. Praeguse seisuga 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 ekstraktige see kasutades 'tar':

tar xJf linux-5.1.16.tar.xz

NĂŒĂŒd siseneme kausta, mis loodi tarball'i lahti pakkimisel:

cd linux-5.1.16

Tuumade ehitamise seadistamine

Tuumade ehitamise sĂŒsteem on komplekt Make-failidest koos mugavate kasutajate tööriistadest ja skriptidest, mis automatiseerivad protsessi. Alustamiseks avage interaktiivne seade programme:

make ARCH=um menuconfig

See viib teid osaliselt kaudu ja avab dialoogikasti. Kui akna allosas kuvatakse '[Select]', saate seadistamist teha tĂŒhikuklahvi vĂ”i Enteriga. Akna navigeerimine toimub nagu tavaliselt, kasutades nooleklahve "ĂŒles" ja "alla", ning elementide valimine on "vasakule" vĂ”i "paremale".

Viidatud tĂŒĂŒp —> tĂ€hendab, et olete menĂŒĂŒ alamosas, kuhu pÀÀseb siseneda sisestusklahviga. VĂ€ljumine sealt toimub eitamise kaudu.[Exit]‘.

Aktiveerige jĂ€rgmised parameetrid ‘[Select]‘ ja veenduge, et nende kĂ”rval on sĂŒmbol ‘[*]’:

UML-spetsiifilised valikud:
  - Host-failisĂŒsteem
VĂ”rgu tugi (lĂŒlitage see sisse, et menĂŒĂŒ alamosa ilmuks):
  - VÔrgu valikud:
    - TCP/IP vÔrgundus
UML vÔrgu seadmed:
  - Virtuaalne vÔrgu seade
  - SLiRP transport

KĂ”ik, sellest aknast on vĂ”imalik vĂ€lja minna, valides jĂ€rjest ‘[Exit]‘. Lihtsalt veenduge, et keegi lĂ”puks kĂŒsib teilt konfiguratsiooni salvestamist ja valite ‘[Jah]‘.

Soovitan teil pÀrast selle postituse lugemist proovida mÀngida kerneli ehitamise parameetridega. Nende katsetega saate palju Ôppida, mÔistes madalama taseme kernelimehhanisme ja erinevate lipu mÔju selle ehitusele.

Kerneli ehitamine

Linuxi kerneli on suur programm, mis tegeleb paljude asjadega. Isegi minimaalsete seadistuste korral vanal riistvaral vÔib selle ehitamine vÔtta piisavalt kaua aega. SeetÔttu ehitage kerneli jÀrgnevate kÀskude abil:

make ARCH=um -j$(nproc)

Miks? See kĂ€sk ĂŒtleb meie koostajale kasutada kĂ”iki saadaolevaid protsessori sĂŒdamike ja lĂ”imede kombinatsioone koostamisprotsessi ajal. KĂ€sk $(nproc) Build lĂ”pus kasutatakse kĂ€su nprocvĂ€ljastust, mis on osa coreutils standardse Ubuntu versiooni koostamisest.

MÔne aja pÀrast on meie tuum loodud kÀivitatavaks failiks ./linux.

Binaari installimine

Kuna Linuxi kasutajareĆŸiim loob tavalise binaari, saate seda installida nagu igasugust muud utiliiti. NĂ€itan, kuidas mina seda tegin:

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

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

export PATH=$PATH:$HOME/bin

KĂŒlalissĂŒsteemi failisĂŒsteemi seadistamine

Looge kĂŒlalissĂŒsteemi failisĂŒsteemile kaust:

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

Avage alpinelinux.org ja allalaadimise sektsioonis leidke aktuaalne link allalaadimiseks MINI ROOT FILESYSTEM. Publikatsiooni kirjutamise hetkel oli see jÀrgmine:

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

Laadige see tarball alla, kasutades 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

NĂŒĂŒd minge kĂŒlalissĂŒsteemi failisĂŒsteemi kausta ja pakkige arhiiv lahti:

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

Kirjeldatud toimingud loovad vĂ€ikese failisĂŒsteemi malli. SĂŒsteemi töö pĂ”himĂ”tete tĂ”ttu on Alpine'i pakettide installimine lĂ€bi apk haldurit ÀÀrmiselt keeruline. Kuid see failisĂŒsteem on piisav, et mĂ”ista ĂŒldist ideed.

Samuti on meil vaja tööriista tini mĂ€lu tarbimise vĂ€ltimiseks zombi-protsesside meie kĂŒlaliskerneli.

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

Kerneli kÀsurea loomine

Linuxi kernels, nagu enamikes teistes programmides, on kÀsurea argumendid, millega tutvuda saab, kasutades vÔtit --help.

ise —help

linux --help
User Mode Linux v5.1.16
        saadaval aadressil http://user-mode-linux.sourceforge.net/

--showconfig
    Prindib konfiguratsioonifaili, mille pÔhjal see UML binaar loodi.

iomem=,
    Konfigureeri  IO mÀlu piirkonnana nimega .

mem=
    See kontrollib, kui palju "fĂŒĂŒsilist" mĂ€lu tuum jagab
    sĂŒsteemile. Suuruse mÀÀramine toimub numbri ja jĂ€rgneva
    ĂŒhe 'k', 'K', 'm', 'M' abil, millel on ilmne tĂ€hendus.
    See ei ole seotud hosti mÀluhulgaga. See vÔib olla rohkem,
    ja ĂŒlejÀÀk, kui seda kunagi kasutatakse, vahetatakse lihtsalt vĂ€lja.
        NĂ€ide: mem=64M

--help
    Prindib selle sÔnumi.

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

root=
    Seda kasutatakse tegelikult universaalse tuuma jaoks tÀpselt samamoodi
    nagu igas teises tuumas. Kui konfigureerite mitmeid blokeeringu
    seadmeid ja soovite kÀivitada midagi muud kui ubd0, peaksite
    kasutama midagi sellist:
        root=/dev/ubd5

--version
    Prindib tuuma versiooninumbri.

umid=
    Seda kasutatakse, et mÀÀrata sellele UML masinale ainulaadne identiteet ja
    seda kasutatakse pid faili ja halduskonsooli side nimeks.

con[0-9]*=
    Kinnita konsool vÔi seeria rida hostikanalile.  Vaata
    http://user-mode-linux.sourceforge.net/old/input.html, et saada tÀielikku
    kirjeldust selle lĂŒliti kohta.

eth[0-9]+=,
    Konfigureeri vÔrgu seade.
    
aio=2.4
    Seda kasutatakse UML-i sundimiseks kasutama 2.4-stiilis AIO, isegi siis
    kui 2.6 AIO on saadaval. 2.4 AIO on ĂŒhe teema, mis kĂ€sitleb
    ĂŒhe pĂ€ringu korraga, sĂŒstemaatiliselt.  2.6 AIO on teema, mis kasutab
    2.6 AIO liidest, et kÀsitleda suvalist arvu ootel olevaid pÀringuid.
    2.6 AIO ei ole saadaval tt reĆŸiimis, 2.4 hostides vĂ”i kui UML
    on loodud ilma /usr/include/linux/aio_abi.h. Paljud distributsioonid
    ei sisalda aio_abi.h, seega peate selle kopeerima
    tuumapuu alt oma /usr/include/linux tuumaklastri ehitamiseks, mis toetab AIO

nosysemu
    Keerab syscall emulatsiooni patch'i vÀlja ptrace'i (SYSEMU) jaoks.
    SYSEMU on jÔudluse parandus, mille tutvustas Laurent Vivier. See muudab
    ptrace() kÀitumist ja aitab vÀhendada hosti konteksti vahetuse kiirus.
    Selle toimimiseks vajate ka hosti tuuma plaastrit.
    Vaata http://perso.wanadoo.fr/laurent.vivier/UML/ edasise
    teabe saamiseks.

uml_dir=
    Asukoht pid ja umid failide paigutamiseks.

quiet
    Keerab vÀlja teabe sÔnumid kÀivitamise ajal.

hostfs=,,...
    Seda kasutatakse hostfs parameetrite seadmiseks. Juurkatalooge argument
    kasutatakse kÔigi hostfs mahtude piiramiseks mÀÀratud katalooge
    puusse. Kui seda ei ole mÀÀratud, siis vÔib UML siseneja
    monteerida midagi hostil, mis on ligipÀÀsetav kasutajale, kes selle
    kÀivitab.
    Praegu toetatud ainus lipp on 'append', mis mÀÀrab, et kÔik
    hostfs-i avatud failid avatakse lisamise reĆŸiimis.

See lipp on valgustab kÀivitamise pÔhiseaded. KÀivitame tuuma 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 tuumale jĂ€rgmist:

  • Oletame, et juurefailisĂŒsteem on pseudoseade /dev/root.
  • Vali hostfs juurefailisĂŒsteemi draiveriks.
  • Mount the guest file system we created in the root device.
  • Ja jah, lugemise-kirjutamise reĆŸiimis.
  • Kasutage ainult 64 megabaiti RAM-i (saate kasutada palju vĂ€hem, sĂ”ltuvalt sellest, mida kavatsete teha, kuid 64 MB tundub optimaalse mahuna).
  • Tuum kĂ€ivitab automaatselt /bin/sh kuidas init-protsessi.

KÀivitage see kÀsk ja peaksite saama midagi sellist nagu:

Veel ĂŒks leht

Yderekorralduse piirangud:
        soft - 0
        hard - PUUDUB
Kontrollin, kas ptrace saab muuta sĂŒsteemi kutsungi numbreid...OK
Kontrollin sĂŒstemikutsungi emulatsiooni parandust ptrace jaoks...OK
Kontrollin edasijĂ”udnud sĂŒstemikutsungi emulatsiooni parandus ptrace jaoks...OK
Kontrollin keskkonnamuutujate olemasolu ajutise kausta jaoks...mida ei leitud
Kontrollin, kas /dev/shm on tmpfs-s...OK
Kontrollin PROT_EXEC mmap /dev/shm-s...OK
Lisatakse 32137216 baiti fĂŒĂŒsilist mĂ€lu exec-shieldi vahe kompenseerimiseks
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 2019, 18:57:19 UTC
Kohandatud 1 tsoonilised loendid, liikuvuse rĂŒhmamine. Kokku lehti: 23898
Kernelis kÀskude rida: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Dentry cache'i hash tabeli kirjeid: 16384 (tellimus: 5, 131072 baiti)
Inode-cache'i hash tabeli kirjeid: 8192 (tellimus: 4, 65536 baiti)
MĂ€lu: 59584K/96920K (2692K kernelikood, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K reserveeritud, 0K cma-reserveeritud)
SLUB: HWalign=64, Tellimus=0-3, MinObjects=0, CPU-s=1, SĂŒsteemides=1
NR_IRQS: 15
kellallikas: ajastik: mask: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns
Kalibreerimine viivitus... 7479.29 BogoMIPS (lpj=37396480)
pid_max: vaikimisi: 32768 minimaalne: 301
Mount-cache'i hash tabeli kirjeid: 512 (tellimus: 0, 4096 baiti)
Mountpoint-cache'i hash tabeli kirjeid: 512 (tellimus: 0, 4096 baiti)
Kontrollin, et host ptys toetab SIGIO vÀljundit...Jah
Kontrollin, et host ptys toetab SIGIO kokkuklapituna...Ei, aktiveerimine edasilĂŒkkamist
devtmpfs: initsialiseeritud
random: get_random_bytes kutsuti setup_net+0x48/0x1e0, crng_init=0-ga
Kasutatakse 2.6 host AIO
kellallikas: jiffies: mask: 0xffffffff, max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash tabeli kirjeid: 256 (tellimus: 0, 6144 baiti)
NET: Registreeritud protokolliperekond 16
kellallikas: Vahetatud kellallikas ajastik
NET: Registreeritud protokolliperekond 2
tcp_listen_portaddr_hash hash tabeli kirjeid: 256 (tellimus: 0, 4096 baiti)
TCP loodud hash tabeli kirjeid: 1024 (tellimus: 1, 8192 baiti)
TCP sidumise hash tabeli kirjeid: 1024 (tellimus: 1, 8192 baiti)
TCP: Hash tabelid seadistatud (loodud 1024, sidumine 1024)
UDP hash tabeli kirjeid: 256 (tellimus: 1, 8192 baiti)
UDP-Lite hash tabeli kirjeid: 256 (tellimus: 1, 8192 baiti)
NET: Registreeritud protokolliperekond 1
konsol [stderr0] keelatud
mconsole (versioon 2) initsialiseeriti /home/cadey/.uml/tEwIjm/mconsole
Kontrollin host MADV_REMOVE tuge...OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Ploki kihistamise SCSI ĂŒldine (bsg) draiveri versioon 0.4 on laaditud (peamine 254)
io ajakava noop registreeritud (vaikimisi)
io ajakava bfq registreeritud
loop: moodul laaditud
NET: Registreeritud protokolliperekond 17
Initsialiseeritud stdio kontrolleri draiver
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 1 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 2 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 3 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 4 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 5 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 6 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 7 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 8 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 9 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 10 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 11 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 12 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 13 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 14 puhul: konfigureerimine ebaÔnnestus
Kasutatakse kanalitĂŒĂŒpi, mis on konfigureeritud UML-ist vĂ€lja
setup_one_line ebaÔnnestus seadme 15 puhul: konfigureerimine ebaÔnnestus
Konsol on initsialiseeritud /dev/tty0-s
konsol [tty0] aktiveeritud
konsol [mc-1] aktiveeritud
EbaÔnnestus ubd seadme 0 initsialiseerimisel: seadme faili suurust ei Ônnestunud mÀÀrata
VFS: Mountitud juur (hostfs-failisĂŒsteem) seadmel 0:11.
devtmpfs: montitud
See arhitektuur ei toeta kerneli mÀlu kaitset.
KĂ€ivitage /bin/sh init-protsessina
/bin/sh: ei pÀÀse tty-le; töö kontroll on vĂ€lja lĂŒlitatud
random: kiire algus tehtud
/ # 

Ülaltoodud manipulatsioonid annavad meile kĂŒlalisreĆŸiimis miinimumversiooni, 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ĂŒlalisreĆŸiimist vĂ€ljumiseks sisestage exit vĂ”i vajutage control-d. See tapab shelli ja pĂ”hjustab jĂ€rgmist kernel panic:

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

Me saime selle kernel panic'i, kuna Linuxi sĂŒdamik arvab, et initsialiseerimisprotsess on alati kĂ€imas. Ilma selleta ei saa sĂŒsteem enam funktsioneerida ja lĂ”petab töö. Kuid kuna see on kasutaja reĆŸiimi protsess, saadab saadud tulemus enda sisse SIGABRT, mis viib lahkumiseni.

KĂŒlgvĂ”rgu seadistamine

Aga siit hakkavad asjad mitte nii nagu planeeritud minema. VĂ”rk User Mode Linuxis on koht, kus kogu piiratud „kasutaja reĆŸiimi” kontseptsioon hakkab murenema. Tavalises sĂŒsteemi tasemel on vĂ”rk piiratud privileegitud tĂ€itmisreĆŸiimide tĂ”ttu, mille pĂ”hjustel me kĂ”ik teame.

MÀrkusena: rohkem erinevate UMLi vÔrgu töötlemise variantide kohta saab lugeda siit.

Reis slirpi

Siiski on olemas iidne ja praktiliselt mitte toetatud tööriist nimega Slirp, mille, millega User Mode Linux suudab vĂ”rku suhelda. See töötab umbes nagu TCP/IP protokollipakk kasutaja tasemel ja ei vaja kĂ€ivitamiseks sĂŒsteemilubasid. See tööriist oli vĂ€lja antud 1995. aastal, viimase uuendusega kuupĂ€eva 2006. aastal. Slirp on vĂ€ga vana. Toetuse ja uuenduste puudumise tĂ”ttu on kompilaatorid jĂ”udnud nii kaugele, et nĂŒĂŒd saab seda tööriista iseloomustada ainult kui «koodide lagunemine».

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

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

AutoriÔigus (c) 1995,1996 Danny Gasparovski ja teised.
KÔik Ôigused kaitstud.
See programm on autoriÔiguse alusel tasuta tarkvara.
Palun lugege Slirpi
paketiga kaasas olnud faili COPYRIGHT autorite Ôiguste tingimuste kohta.

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

Viie nulli (0) tippimine lÔpetab.

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

SLiRP Valmis ...
fisher: “/usr/bin/slirp” katkestatud signaali SIGSEGV (aadressiriba viga) tĂ”ttu

Oh, jumal pĂŒha. Laseme Slirpi jaoks debuggeri 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.

TÔrge esines selles reas. Vaatame stacktrace'i, ehk leidub sealt midagi kasulikku:

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

Siin nĂ€eme, et rike toimub pĂ”hitsĂŒkli kĂ€ivitamise ajal, kui slirp pĂŒĂŒab kontrollida ajaĂŒlesandeid. Sel hetkel oleksin pidanud loobuma tĂ”rkeotsingust. Kuid vaatame, kas Slirp töötab, kui see on allalaaditud allikatest. TĂ”in arhiivi otse veebisaidilt tagasi Sourceforge, sest seal midagi kĂ€surealt alla tĂ”mmata – see on piin:

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 teateid mÀÀratlemata sisseehitatud funktsioonide kohta, s.t. vĂ”imetus lingitud failis sĂŒmboleid genereerida. Tundub, et aastate vahel 2006 ja praeguse hetkeni on gcc lĂ”petanud looma sĂŒmboleid, mida kasutatakse sisseehitatud funktsioonide jaoks vahepeal compileeritud 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 toimi. Funktsioonide sĂŒmboleid ei leita endiselt.

Sellel etapil andsin alla ja hakkasin otsima Githubist Heroku ehituspaketid. Minu teooria pÔhines sellel, et mÔnes Heroku ehituspaketis peavad olema vajalikud binaarfailid. LÔpuks viivad otsingud mind siia. Laadisin alla ja pakkisin lahti 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! Kas see töötab?

./slirp
Slirp v1.0.17 (BETA) FULL_BOLT

Copyright (c) 1995,1996 Danny Gasparovski ja teised.
KÔik Ôigused kaitstud.
Palun lugege faili COPYRIGHT, mis tuli koos Slirp
paketiga autoriÔiguse tingimuste ja nÔuete kohta.

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

VĂ€ljuda saab kirjutades viis nulli (0).

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

SLiRP on valmis ...

Ei lange — nii et peaks tööle hakkama! Laseme selle binaarfi ~/bin/slirp:

cp slirp ~/bin/slirp

Juhuks, kui paketi looja selle kustutab, ma tegin peegli.

VÔrgu seadistamine

NĂŒĂŒd seadistame vĂ”rgu meie kĂŒlaliskernelil. Uuendame kĂ€ivitamisparameetreid:

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

NĂŒĂŒd lĂŒlitame vĂ”rgu sisse:

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Ôrguliidese suhtlemiseks Slirpiga. KÀsk mars seab kernelile marsruutimistabeleid, et sundida kogu liiklust Slirpi tunnelisse. Kontrollime 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

Nimi:      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öötas!

MĂ€rkus: Tundub, et algne post kirjutati lauaarvutis, millel oli juhtmeta vĂ”rkaart vĂ”i mĂ”ni muu konfiguratsioon, mis ei nĂ”ua tĂ€iendavaid draivereid. SĂŒlearvutis, millel on Intel WiFi 8265, tekib vĂ”rgu tĂ”stmisel 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
/ #

Tundub, et tuum ei saa ĂŒhendust vĂ”rgu draiveriga. Kahjuks ei parandanud firmware'i tuumasse kompileerimine olukorda. Avaldamise hetkel pole sellises konfiguratsioonis lahendust leitud. Lihtsamatel konfiguratsioonidel (nĂ€iteks Virtualboxis) tĂ”useb liides korrektselt.

Automatiseerime suunamise jÀrgmise shell-skripti abil:

#!/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 teeme muudatused tuuma kÀsureale:

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

Ja kordame:

SLiRP Valmis ...
ettevĂ”tte ĂŒhendus seadistatud
/bin/sh: ei pÀÀse tty-le; töö juhtimine on vĂ€lja lĂŒlitatud

nslookup google.com 8.8.8.8
Server:    8.8.8.8
Aadress 1: 8.8.8.8 dns.google

Nimi:      google.com
Aadress 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Aadress 2: 2607:f8b0:4004:800::200e iad30s09-in-x0e.1e100.net

VÔrk töötab stabiilselt!

Docker-fail

Teie mugavuseks olen kokku pannud Dockerfile, mis automatiseerib enamik kirjeldatud samme ja peaks tagama teile töötava konfiguratsiooni. Mul on ka valmis tuumakonfiguratsioon, mis sisaldab kÔike, mis postituses on mainitud. Kuid oluline on mÔista, et siin olen kirjeldanud ainult minimaalset seadistust.

Loodan, et see postitus aitas teil mĂ”ista, kuidas luua kĂŒlalisjaotust. Tuli vĂ€lja mingisugune monster, kuid publikatsioon mĂ”eldi kui kĂ”ikehĂ”lmavat juhendit User Mode'i ĂŒlesehitamise, installimise ja seadistamise kohta Linuxis, kaasaegsete operatsioonisĂŒsteemide versioonide jaoks. JĂ€rgmised sammud peaksid hĂ”lmama teenuste ja muu tarkvara installimist juba kĂŒlalissĂŒsteemi sees. Kuna Docker'i konteineripildid on lihtsalt komprimeeritud tar-arhiivid, peate olema vĂ”imeline pilti vĂ€lja tĂ”mbama lĂ€bi docker export, ja seejĂ€rel mÀÀrake selle paigaldamise tee kĂŒlalisjaotuse failisĂŒsteemi juures. Siis kĂ€ivitage shell-skripti.

Eriline tĂ€nu Rkeene'ile #lobsters kanalil Freenodes. Ilma tema abita Slirp'i tĂ”rkeotsingul ei oleks ma nii kaugele jĂ”udnud. Mul pole aimugi, kuidas tema Slackware'i sĂŒsteem slirpiga korrektselt toimib, kuid minu Ubuntu ja Alpine sĂŒsteemid ei aktsepteerinud slirp'i ja Rkeene'i pakutud binaarfaili. Kuid mulle piisab sellest, et mul on töötav lahendus.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster