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

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]
ââslirpDocker-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-devKernel'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 ja saage viidatud URL viimase stabiilse kernel'i versiooni allalaadimiseks. Postituse kirjutamise ajal 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 ekstrakteerige see kasutades 'tar':
tar xJf linux-5.1.16.tar.xzNĂŒĂŒd liikuge katalooge, mis loodi tarball'i lahti pakkimisel:
cd linux-5.1.16Kernel'i ehitamise seadistamine
Kernel'i ehitusmoodul on kogum 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/binKĂŒlastaja failisĂŒsteemi seadistamine
Looge kĂŒlalise failisĂŒsteemi jaoks kataloog:
mkdir -p $HOME/prefix/uml-demo
cd $HOME/prefix
Avage alpinelinux.org ja 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.gzLaadige 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.gzNĂŒĂŒd minge kĂŒlalise failisĂŒsteemi kataloogi ja lahti pakkige arhiv:
cd uml-demo
tar xf ../alpine-rootfs.tgzKirjeldatud 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 zombie-protsesside meie kĂŒlalise tuumas.
wget -O tini https://github.com/krallin/tini/releases/download/v0.18.0/tini-static
chmod +x tiniTuumakÀ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 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/shkuidasâ 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 .
Reis slirpi
Kuid on olemas iidne ja praktiliselt toetamata tööriist nimega , 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 .
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 . 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 , 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
makeEi, see ei tööta. Endiselt ei suuda leida nende funktsioonide sĂŒmboleid.
Sel etapil andsin alla ja hakkasin otsima Githubist . Minu teooria pÔhines sellel, et mingis Heroku koostepaketis peavad olema vajalikud binaarfailid. LÔpuks viisid mu otsingud . 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\/slirpJuhuks, kui paketi looja selle eemaldab, tegin ma .
VÔrgu seadistamine
NĂŒĂŒd seadistame vĂ”rgu meie kĂŒlaliskernelis. :
linux
root=\/dev\/root
rootfstype=hostfs
rootflags=$HOME\/prefix\/uml-demo
rw
mem=64M
eth0=slirp,,$HOME\/bin\/slirp
init=\/bin\/shNĂŒĂŒ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.netTöö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/shJa teeme selle tÀidetavaks:
chmod +x init.shJa 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.netKĂŒte töötab stabiilselt!
Docker-fail
Kuna ma tahaksin, et teil oleks lihtsam kÔiki neid samme kontrollida, olen koostanud , mis automatiseerib enamikku kirjeldatud sammudest ja peaks tagama teile töötava konfiguratsiooni. Mul on ka , 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
