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. , nii et kui teil on kĂŒsimusi, kĂŒsige inglise keeles kommentaarides.

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]
ââslirpDocker-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-devKerneli 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 ja hankige viide viimasest stabiilsest tuumaversioonist. Praeguse seisuga on see:
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.xzNĂŒĂŒd siseneme kausta, mis loodi tarball'i lahti pakkimisel:
cd linux-5.1.16Tuumade ehitamise seadistamine
Tuumade ehitamise sĂŒsteem on komplekt 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/binKĂŒ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 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.gzLaadige 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.gzNĂŒĂŒd minge kĂŒlalissĂŒsteemi failisĂŒsteemi kausta ja pakkige arhiiv lahti:
cd uml-demo
tar xf ../alpine-rootfs.tgzKirjeldatud 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 mĂ€lu tarbimise vĂ€ltimiseks meie kĂŒlaliskerneli.
wget -O tini https://github.com/krallin/tini/releases/download/v0.18.0/tini-static
chmod +x tiniKerneli 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 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/shkuidasinit-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 .
Reis slirpi
Siiski on olemas iidne ja praktiliselt mitte toetatud tööriist nimega , 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 .
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Ă”ttuOh, 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 . 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 , 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
makeEi. See ei toimi. Funktsioonide sĂŒmboleid ei leita endiselt.
Sellel etapil andsin alla ja hakkasin otsima Githubist . Minu teooria pÔhines sellel, et mÔnes Heroku ehituspaketis peavad olema vajalikud binaarfailid. LÔpuks viivad otsingud mind . 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/slirpJuhuks, kui paketi looja selle kustutab, ma .
VÔrgu seadistamine
NĂŒĂŒd seadistame vĂ”rgu meie kĂŒlaliskernelil. :
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
eth0=slirp,,$HOME/bin/slirp
init=/bin/shNĂŒĂŒ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.netTöö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/shJa teeme selle tÀidetavaks:
chmod +x init.shJa 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.netVÔrk töötab stabiilselt!
Docker-fail
Teie mugavuseks olen kokku pannud , mis automatiseerib enamik kirjeldatud samme ja peaks tagama teile töötava konfiguratsiooni. Mul on ka , 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
