Ievads no tulkotÄja: Å emot vÄrÄ masveida konteineru ienÄkÅ”anu mÅ«su dzÄ«vÄ, var bÅ«t diezgan interesanti un noderÄ«gi uzzinÄt, ar kÄdu tehnoloÄ£iju viss sÄkÄs. Dažas no tÄm var noderÄ«gi pielietot arÄ« Å”odien, taÄu ne visi atceras (vai zina, ja nav piedzÄ«vojuÅ”i to straujo attÄ«stÄ«bu). Viena no Ŕīm tehnoloÄ£ijÄm ir User Mode Linux. OriÄ£inÄla autors diezgan pamatÄ«gi pÄtÄ«ja, kas no vecajÄm izstrÄdÄm joprojÄm darbojas, un kas vairs nav aktuÄls, un apkopoja kaut ko lÄ«dzÄ«gu soli pa solim instrukcijÄm par to, kÄ paÅ”am izveidot mÄjas UML 2k19. Un jÄ, mÄs aicinÄjÄm uz Habr oriÄ£inÄlÄ raksta autoru. , tÄpÄc, ja ir jautÄjumi - uzdodiet angliski komentÄros.

User Mode Linux - tas faktiski ir Linux kodola ports pats sev. Å is režīms ļauj palaist pilnvÄrtÄ«gu Linux kodolu kÄ lietotÄja procesu un parasti tiek izmantots izstrÄdÄtÄjiem, lai testÄtu draiverus. Bet Å”is režīms ir noderÄ«gs arÄ« kÄ vispÄrÄjas izolÄcijas rÄ«ks, principi, kura lÄ«dzÄ«gs virtuÄlo maŔīnu darbÄ«bai. Å is režīms nodroÅ”ina lielÄku izolÄciju nekÄ Docker, bet mazÄku nekÄ pilnvÄrtÄ«ga virtuÄlÄ maŔīna kÄ KVM vai Virtual Box.
KopumÄ User Mode var Ŕķist dÄ«vains un grÅ«ti lietojams rÄ«ks, taÄu tam joprojÄm ir savas pielietoÅ”anas jomas. Tas ir pilnvÄrtÄ«gs Linux kodols, kas darbojas no nepÄrvalstÄ«ta lietotÄja. Å Ä« Ä«paŔība ļauj palaist potenciÄli nedroÅ”u kodu bez jebkÄdÄm briesmÄm hosta maŔīnai. Un, tÄ kÄ tas ir pilnvÄrtÄ«gs kodols, tÄ procesi ir izolÄti no hosta maŔīnas, tas ir, procesi, kas darbojas iekÅ” User Mode, nebÅ«s redzami hostÄ. Tas nav lÄ«dzÄ«gi ierastajam Docker konteineram, kurÄ gadÄ«jumÄ hosta maŔīna vienmÄr redz procesus iekÅ” krÄtuves. Apskatiet Å”o pstree fragmentu no viena no maniem serveriem:
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}]Un jÄsalÄ«dziniet to ar Linux kodola pstree lietotÄja režīmÄ:
linuxāā¬ā5*[linux]
āāslirpStrÄdÄjot ar Docker konteineriem, es varu redzÄt no viesdatora procesu nosaukumus, kas tiek veikti viesu sistÄmÄ. Tas nav iespÄjams ar Linux lietotÄja režīmu. Ko tas nozÄ«mÄ? Tas nozÄ«mÄ, ka uzraudzÄ«bas rÄ«ki, kuri darbojas caur Linux audita apakÅ”sistÄmu nesees procesus, kas tiek izpildÄ«ti viesu sistÄmÄ. Bet dažÄs situÄcijÄs Ŕī iezÄ«me var kļūt par divu galu zobenu.
VispÄr, viss zemÄk esoÅ”ais ieraksts ā tas ir pÄtÄ«jumu kopums un rupjas mÄÄ£inÄjumi panÄkt vÄlamo rezultÄtu. Lai to izdarÄ«tu, man bija jÄizmanto dažÄdi seni rÄ«ki, jÄsaprot kodola avoti, intensÄ«vi jÄveic kodÄÅ”anas atkļūdoÅ”ana, kas tika rakstÄ«ta laikÄ, kad es vÄl gÄju pamatskolÄ, un arÄ« jÄpÄtÄ« Heroku krÄtuves ar speciÄlu binÄro failu, meklÄjot nepiecieÅ”amos rÄ«kus. Visa Ŕī darba rezultÄtÄ mani IRC zÄni sÄka saukt par burvi (magic). Es ceru, ka Å”is ieraksts kalpos kÄ uzticama dokumentÄcija, lai paveiktu to paÅ”u, bet jau ar jaunÄkiem kodoliem un operÄcijas versijÄm.
Iestatījumi
Linux lietotÄja režīma iestatīŔana tiek veikta vairÄkos posmos:
- atkarÄ«bu uzstÄdīŔana viesdatorÄ;
- Linux kodola lejupielÄde;
- kodola kopas konfigurÄcija;
- kodola bÅ«vÄÅ”ana;
- binÄro failu instalÄÅ”ana;
- viesu failu sistÄmas konfigurÄcija;
- kodola palaiÅ”anas parametru izvÄle;
- viesu tÄ«kla konfigurÄcija;
- viesu kodola palaiŔana.
Es pieÅemu, ka, ja jÅ«s nolemsiet to visu izdarÄ«t paÅ”i, visdrÄ«zÄk darÄ«siet to kÄdÄ Ubuntu vai Debian lÄ«dzÄ«gÄ sistÄmÄ. Es mÄÄ£inÄju Ä«stenot visu iepriekÅ”minÄto savÄ iecienÄ«tajÄ distribÅ«cijÄ ā Alpine, bet nekas nesanÄca, acÄ«mredzot tÄpÄc, ka Linux kodam ir stingra saistÄ«ba ar glibc-isms draiveriem lietotÄja režīmÄ. PlÄnoju par to paziÅot upstrÄ«mÄ, kad beidzot izpratīŔu problÄmu.
AtkarÄ«bu instalÄcija serverÄ«
Ubuntu prasa vismaz Å”Ädus paketÄm Linux koda bÅ«vÄÅ”anai (ja ir tÄ«ra uzstÄdīŔana):
- 'build-essential'
- 'flex'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certificates'
- 'bc'
- 'linux-headers'
JÅ«s varat tÄs uzstÄdÄ«t, izmantojot sekojoÅ”o komandu (ar root tiesÄ«bÄm vai izmantojot sudo):
apt-get -y install build-essential flex bison xz-utils wget ca-certificates bc
linux-headers-$(uname -r) LÅ«dzu, Åemiet vÄrÄ, ka Linux koda konfigurÄcijas izvÄlnes programmas palaiÅ”ana prasÄ«s uzstÄdÄ«t libncurses-dev. LÅ«dzu, pÄrliecinieties, ka tas ir uzstÄdÄ«ts, izmantojot sekojoÅ”o komandu (ar root tiesÄ«bÄm vai izmantojot sudo):
apt-get -y install libncurses-devKoda lejupielÄde
Nosakiet vietu kodu lejupielÄdei un turpmÄkai bÅ«vÄÅ”anai. Å ai operÄcijai jums bÅ«s nepiecieÅ”ams apmÄram 1,3 GB vietas cietajÄ diskÄ, tÄpÄc pÄrliecinieties, ka tÄ jums ir.
PÄc tam pÄrejiet uz un iegÅ«stiet URL, lai lejupielÄdÄtu jaunÄko stabilo koda versiju. Å Ä« brīža postÄ tas ir:
LejupielÄdÄjiet Å”o failu, izmantojot 'wget':
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz Un izpakojiet to, izmantojot 'tar':
tar xJf linux-5.1.16.tar.xzTagad ieejiet direktorijÄ, kas izveidota, atverot tarball:
cd linux-5.1.16Koda bÅ«ves konfigurÄcija
Koda bÅ«ves sistÄma ir komplekts ar daudziem lietotÄju rÄ«kiem un skriptiem, lai automatizÄtu procesu. SÄciet, atverot interaktÄ«vo konfigurÄcijas programmu:
make ARCH=um menuconfig TÄ daļÄji veiks bÅ«vi un parÄdÄ«s jums dialoglodziÅu. Kad apakÅ”ÄjÄ loga malÄ parÄdÄ«sies ā[Select]ā, jÅ«s varÄsiet sÄkt konfigurÄÅ”anu, izmantojot taustiÅus Space vai Enter. PÄrvietoÅ”ana logÄ, kÄ parasti, ar virzÄ«tÄjiem 'uz augÅ”u' un 'uz leju', bet elementu izvÄle - 'pa kreisi' vai 'pa labi'.
NorÄde, kas izskatÄs pÄc ā>, norÄda, ka jÅ«s esat apakÅ”izvÄlnÄ, kurÄ ieeja notiek ar Enter taustiÅu. Izeja no tÄs, acÄ«mredzot, ar ā[Exit]ā.
IeslÄdziet Å”Ädas opcijas ā[Select]ā un pÄrliecinieties, ka blakus tÄm ir simbols ā[*]ā:
UML specifiskas opcijas:
- VietÄjÄ failu sistÄma
TÄ«kla atbalsts (ieslÄdziet to, lai redzÄtu apakÅ”izvÄlni):
- Tīkla opcijas:
- TCP/IP tīkla
UML tīkla ierīces:
- VirtuÄlÄ tÄ«kla ierÄ«ce
- SLiRP transports No Ŕī loga var izejot, secÄ«gi izvÄloties ā[Exit]ā. Tikai pÄrliecinieties, ka beigÄs jums piedÄvÄs saglabÄt konfigurÄciju un izvÄlÄsieties ā[JÄ]ā.
Es iesaku jums spÄlÄties ar kodola kompilÄÅ”anas opcijÄm pÄc Ŕī ieraksta izlasīŔanas. Å ie eksperimenti palÄ«dzÄs jums labÄk izprast zema lÄ«meÅa kodola mehÄnikas darbÄ«bu un dažÄdu karogu ietekmi uz tÄ kompilÄÅ”anu.
Kodola kompilÄcija
Linux kodols ir liela programma, kas nodarbojas ar daudziem uzdevumiem. Pat ar tÄdu minimÄlo konfigurÄciju vecajÄ aparatÅ«rÄ tÄ kompilÄcija var aizÅemt pietiekami ilgu laiku. TÄdÄļ kompilÄjiet kodolu, izmantojot sekojoÅ”o komandu:
make ARCH=um -j$(nproc) KÄpÄc? Å Ä« komanda pateiks mÅ«su kompilatoram izmantot visus pieejamos kodolus un procesoru pavedienus kompilÄcijas procesÄ. Komanda $(nproc) noslÄgumÄ Build pievieno komandas izsaukuma rezultÄtu nproc, kas ir daļa no coreutils standarta Ubuntu izstrÄdÄ.
PÄc kÄda laika mÅ«su kodols tiks kompilÄts izpildÄmajÄ failÄ .\/linux.
BinarÄ faila instalÄÅ”ana
TÄ kÄ Linux lietotÄja režīms izveido parastu binÄro failu, varat to instalÄt kÄ jebkuru citu utilÄ«tu. Å Ädi es to darÄ«ju:
mkdir -p ~\/bin
cp linux ~\/bin\/linux TÄpat der pÄrliecinÄties, ka ~/bin atrodas jÅ«su $PATH:
export PATH=$PATH:$HOME\/binViesu failu sistÄmas konfigurÄcija
Izveidojiet direktoriju viesu failu sistÄmai:
mkdir -p $HOME\/prefix\/uml-demo
cd $HOME\/prefix
Atveriet alpinelinux.org un sadaÄ¼Ä atrodiet aktuÄlo saiti lejupielÄdei MINI ROOT FILESYSTEM. Raksta brÄ«dÄ« tas bija:
http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gzLejupielÄdÄjiet Å”o tarball, izmantojot 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.gzTagad ieejiet viesu failu sistÄmÄ un izvelciet arhÄ«vu:
cd uml-demo
tar xf ..\/alpine-rootfs.tgzAprakstÄ«tÄs darbÄ«bas izveidos mazu failu sistÄmas paraugu. TÄdÄļ sistÄmas specifikas dÄļ bÅ«s ļoti grÅ«ti instalÄt paketÄs, izmantojot Alpine apk pÄrvaldnieku. Bet Ŕī FS bÅ«s pietiekama, lai novÄrtÄtu kopÄjo ideju.
TÄpat mums bÅ«s nepiecieÅ”ams rÄ«ks lai novÄrstu atmiÅas patÄriÅu mÅ«su viesu kodolÄ.
wget -O tini https:\/\/github.com\/krallin\/tini\/releases\/download\/v0.18.0\/tini-static
chmod +x tiniKodola komandrindas izveide
Linux kodolÄ, kÄ arÄ« lielÄkajÄ daÄ¼Ä citu programmu, ir komandrindas argumenti, ar kuriem var iepazÄ«ties, norÄdot atslÄgu --help.
PaÅ” āhelp
linux --help
User Mode Linux v5.1.16
pieejams http://user-mode-linux.sourceforge.net/
--showconfig
IzdrukÄ konfigurÄcijas failu, no kura Å”is UML binÄrais fails tika Ä£enerÄts.
iomem=,
KonfigurÄ kÄ IO atmiÅas reÄ£ionu ar nosaukumu .
mem=
Tas kontrolÄ, cik daudz "fiziskÄs" atmiÅas kodols pieŔķir
sistÄmai. IzmÄrs tiek norÄdÄ«ts kÄ skaitlis, kam seko
viens no 'k', 'K', 'm', 'M', kuriem ir acīmredzamas nozīmes.
Tas nav saistÄ«ts ar atmiÅas daudzumu viesdatorÄ. Tas var
bÅ«t vairÄk, un pÄrsniegums, ja tas tiek izmantots, vienkÄrÅ”i tiks apmainÄ«ts.
PiemÄrs: mem=64M
--help
IzdrukÄ Å”o ziÅojumu.
debug
Å”is karogs nav nepiecieÅ”ams, lai palaistu gdb uz UML skas režīmÄ
root=
Tas tiek izmantots tieÅ”i tÄdÄ paÅ”Ä veidÄ, kÄ jebkurÄ citÄ kodolÄ.
Ja jÅ«s konfigurÄjat vairÄkus bloku ierÄ«ces un vÄlaties sÄkt no kaut kÄ cita, nevis ubd0,
jūs izmantosiet kaut ko līdzīgu:
root=/dev/ubd5
--version
IzdrukÄ kodola versijas numuru.
umid=
Tas tiek izmantots, lai pieŔķirtu unikÄlu identitÄti Å”ai UML maŔīnai un
tiek izmantots, lai nosauktu pid failu un pÄrvaldÄ«bas konsoles kontaktligzdu.
con[0-9]*=
Pievieno konsoli vai seriÄlo lÄ«niju viesdatora kanÄlam. SkatÄ«t
http://user-mode-linux.sourceforge.net/old/input.html pilnīgai
Ŕī slÄdža aprakstam.
eth[0-9]+=,
KonfigurÄ tÄ«kla ierÄ«ci.
aio=2.4
Tas tiek izmantots, lai piespiestu UML izmantot 2.4.stila AIO, pat ja 2.6 AIO ir
pieejams. 2.4 AIO ir vienas pavediena risinÄjums, kas apstrÄdÄ vienu pieprasÄ«jumu
vienlaicīgi, sinhroni. 2.6 AIO ir pavediena, kas izmanto 2.6 AIO
saskarni, lai apstrÄdÄtu noteiktu skaitu gaidoÅ”o pieprasÄ«jumu. 2.6 AIO
nav pieejams tt režīmÄ, uz 2.4 viesdatoriem, vai kad UML ir veidots ar
/usr/include/linux/aio_abi.h nav pieejams. Daudzas izplatīŔanas neietver aio_abi.h,
tÄdÄļ jums bÅ«s jÄkopÄ tas no kodola koka uz jÅ«su /usr/include/linux, lai
uzbÅ«vÄtu AIO spÄjÄ«gu UML
nosysemu
IzslÄdz sistÄmas zvanu emulÄcijas ielÄpu ptrace (SYSEMU).
SYSEMU ir veiktspÄjas ielÄps, ko ieviesa LorÄns VivjÄrs. Tas maina
ptrace() uzvedÄ«bu un palÄ«dz samazinÄt viesdatora konteksta maiÅas
Ätrumus. Lai tas darbotos, jums ir nepiecieÅ”ams arÄ« viesdatora kodola
ielÄps. SkatÄ«t http://perso.wanadoo.fr/laurent.vivier/UML/ tÄlÄkai
informÄcijai.
uml_dir=
AtraÅ”anÄs vieta, kur novietot pid un umid failus.
quiet
IzslÄdz informÄcijas ziÅojumus palaiÅ”anas laikÄ.
hostfs=,,...
Tas tiek izmantots, lai iestatītu hostfs parametrus. Saknes direktorijas arguments
tiek izmantots, lai ierobežotu visus hostfs montÄžas operÄciju ievieÅ”anu
ietvaros noteiktÄs direktorijas koka struktÅ«rÄ uz viesdatora. Ja tas nav
norÄdÄ«ts, tad lietotÄjs UML var montÄt jebko uz viesdatora, kas ir pieejams
lietotÄjam, kas to palaiž.
VienÄ«gais Å”obrÄ«d atbalstÄ«tais karogs ir 'append', kas norÄda, ka visi
hostfs atvÄrtie faili tiks atklÄti paplaÅ”inÄÅ”anas režīmÄ.Å is dokuments izskaidro galvenos palaiÅ”anas parametrus. ApskatÄ«sim, kÄ palaist kodolu ar minimÄlo nepiecieÅ”amo opciju kopumu:
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
init=/bin/shIepriekÅ” minÄtÄs rindas norÄda mÅ«su kodolam sekojoÅ”o:
- PieÅemot, ka saknes failu sistÄma ir pseido-ierÄ«ce
/dev/root. - IzvÄlieties kÄ saknes failu sistÄmas vadÄ«tÄjs.
- Piesaki viesu failu sistÄmu, ko mÄs izveidojÄm root ierÄ«cÄ.
- Un jÄ, lasīŔanas-iezÄ«mÄÅ”anas režīmÄ.
- Izmanto tikai 64 megabaitus operatÄ«vÄs atmiÅas (tu vari izmantot daudz mazÄk, atkarÄ«bÄ no tÄ, ko plÄno darÄ«t, bet 64 MB Ŕķiet optimÄls apjoms).
- Kodols automÄtiski sÄk
/bin/shkÄinit-procesu.
Izdari Å”o komandu, un tev vajadzÄtu saÅemt kaut ko lÄ«dzÄ«gu Å”im:
VÄl viena lapa
Koda izgÄÅ”anas ierobežojumi :
mīksts - 0
ciets - NAV
PÄrbaude, vai ptrace var mainÄ«t sistÄmas izsaukuma numurus...Labi
PÄrbaude par sistÄmas izsaukuma emulÄcijas ielÄpu ptrace...Labi
PÄrbaude par uzlabotÄs sistÄmas izsaukuma emulÄcijas ielÄpu ptrace...Labi
PÄrbaude par vides mainÄ«gajiem pagaidu direktorijai...nav atrasta
PÄrbaude, vai /dev/shm ir tmpfs...Labi
PÄrbaude PROT_EXEC mmap /dev/shm...Labi
32137216 baitus pievieno fiziskajai atmiÅai, lai kompensÄtu izpildes aizsargklapju atstarpi
Linux versija 5.1.16 (cadey@kahless) (gcc versija 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 Sau 7. jūl. 18:57:19 UTC 2019
UzbÅ«vÄtas 1 zonu saraksti, mobilitÄtes grupÄÅ”ana. KopÄjÄs lapas: 23898
Kodola komandu rinda: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Dentry keŔu hash tabulas ieraksti: 16384 (pasūtījums: 5, 131072 baitus)
Inode-keŔu hash tabulas ieraksti: 8192 (pasūtījums: 4, 65536 baitus)
AtmiÅa: 59584K/96920K pieejama (2692K kodola kods, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K rezervÄts, 0K cma-rezervÄts)
SLUB: HWalign=64, PasÅ«tÄ«jums=0-3, MinimÄlÄs objekti=0, CPU=1, NP=1
NR_IRQS: 15
clocksource: taimeris: maska: 0xffffffffffffffff maksimÄlÄ cikli: 0x1cd42e205, maksimÄlais neaktÄ«vs_ns: 881590404426 ns
KalibrÄjot kavÄjuma ciklu... 7479.29 BogoMIPS (lpj=37396480)
pid_max: noklusÄjums: 32768 minimÄlais: 301
Mount-keŔu hash tabulas ieraksti: 512 (pasūtījums: 0, 4096 baitus)
Mountpunktu-keŔu hash tabulas ieraksti: 512 (pasūtījums: 0, 4096 baitus)
PÄrbaude, vai saimnieka ptys atbalsta izejas SIGIO...JÄ
PÄrbaude, vai saimnieka ptys atbalsta SIGIO pie slÄgÅ”anas...NÄ, iespÄjota atruna
devtmpfs: inicializÄts
nejauŔs: get_random_bytes izsauca no setup_net+0x48/0x1e0 ar crng_init=0
Izmantojot 2.6 saimnieka AIO
clocksource: jiffies: maska: 0xffffffff maksimÄlÄ cikli: 0xffffffff, maksimÄlais neaktÄ«vs_ns: 19112604462750000 ns
futex keŔu hash tabulas ieraksti: 256 (pasūtījums: 0, 6144 baitus)
NET: ReÄ£istrÄta protokolu Ä£imene 16
clocksource: PÄrslÄgts uz pulksteÅa avotu taimeris
NET: ReÄ£istrÄta protokolu Ä£imene 2
tcp_listen_portaddr_hash hash tabulas ieraksti: 256 (pasūtījums: 0, 4096 baitus)
TCP izveidoto keŔu tabulas ieraksti: 1024 (pasūtījums: 1, 8192 baitus)
TCP sasaistīto keŔu tabulas ieraksti: 1024 (pasūtījums: 1, 8192 baitus)
TCP: Hash tabulas ir konfigurÄtas (izveidotÄs 1024 sasaistÄ«tÄs 1024)
UDP hash tabulas ieraksti: 256 (pasūtījums: 1, 8192 baitus)
UDP-Lite hash tabulas ieraksti: 256 (pasūtījums: 1, 8192 baitus)
NET: ReÄ£istrÄta protokolu Ä£imene 1
console [stderr0] atspÄjots
mconsole (versija 2) inicializÄts uz /home/cadey/.uml/tEwIjm/mconsole
PÄrbaude par saimnieka MADV_REMOVE atbalstu...Labi
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Bloka slÄÅa SCSI Ä£eneriskÄ (bsg) draivera versija 0.4 ielÄdÄta (major 254)
io plÄnotÄjs noop reÄ£istrÄts (noklusÄjums)
io plÄnotÄjs bfq reÄ£istrÄts
loop: modulis ielÄdÄts
NET: ReÄ£istrÄta protokolu Ä£imene 17
InicializÄta stdio konsoles draiveris
Izmantojot kanÄla veida, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 1 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 2 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 3 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 4 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 5 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 6 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 7 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 8 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 9 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 10 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 11 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 12 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 13 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 14 : KonfigurÄcija neizdevÄs
Izmantojot kanÄla veidu, kas ir konfigurÄts Ärpus UML
setup_one_line neizdevÄs ierÄ«cei 15 : KonfigurÄcija neizdevÄs
Konsole inicializÄta uz /dev/tty0
console [tty0] iespÄjota
console [mc-1] iespÄjota
NeizdevÄs inicializÄt ubd ierÄ«ci 0 :Nevar noteikt ierÄ«ces faila izmÄru
VFS: Pamatnes (hostfs failsistÄma) uzstÄdÄ«tas uz ierÄ«ces 0:11.
devtmpfs: uzstÄdÄ«ts
Å ai arhitektÅ«rai nav kodola atmiÅas aizsardzÄ«bas.
Izpildiet /bin/sh kÄ init procesu
/bin/sh: nevar piekļūt tty; darba kontrole izslÄgta
nejauÅ”s: Ätra inicializÄcija pabeigta
/ # ManipulÄcijas iepriekÅ” dos mums viesosistÄmu minimÄlÄ versijÄ, bez tÄdÄm lietÄm kÄ /proc vai pieŔķirtais hosta nosaukums. PiemÄram, mÄÄ£iniet izpildÄ«t Å”Ädas komandas:
- uname -av
- cat /proc/self/pid
- hostname
Lai izietu no viesosistÄmas, ierakstiet exit vai nospiediet control-d. Tas noÅ”aus apvalku ar turpmÄku kodola paniku:
/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: ā./linux root=/dev/root rootflagā¦ā terminated by signal SIGABRT (Abort) MÄs saÅÄmÄm Å”o kodola paniku tÄpÄc, ka Linux kodols uzskata, ka inicializÄcijas process vienmÄr darbojas. Bez tÄ sistÄma vairs nevar darboties un izslÄdzas. Bet, tÄ kÄ tas ir lietotÄja režīma process, iegÅ«tais rezultÄts nosÅ«ta sevi uz SIGABRT, kas noved pie izieÅ”anas.
ViesotÄs tÄ«kla iestatīŔana
Bet Å”eit viss sÄk iet ne tÄ kÄ plÄnots. TÄ«kls User Mode Linux ā tas ir tas punkts, kur visa ierobežotÄ Ā«lietotÄja režīmaĀ» koncepcija sÄk sabrukt. Galu galÄ parasti sistÄmas lÄ«menÄ« tÄ«kla piekļuve ir ierobežota privilegÄtajiem izpildes režīmiem visiem saprotamu iemeslu dÄļ.
PiezÄ«me: vairÄk par dažÄdÄm tÄ«kla darbÄ«bas iespÄjÄm UML var izlasÄ«t .
Ceļojums uz slirp
TomÄr ir sen aizmirsts un gandrÄ«z neatbalstÄ«ts rÄ«ks ar nosaukumu , ar kuru User Mode Linux var mijiedarboties ar tÄ«klu. Tas darbojas aptuveni kÄ TCP/IP steks lietotÄja lÄ«menÄ« un neprasa nekÄdas sistÄmas atļaujas palaiÅ”anai. Å is rÄ«ks tika izlaists 1995. gadÄ, un pÄdÄjais atjauninÄjums ir no 2006. gada. Slirp ir ļoti vecs. LaikÄ, kad tam nav atjauninÄjumu un atbalsta, kompilatori ir attÄlinÄjuÅ”ies tik tÄlu, ka Å”o rÄ«ku var raksturot tikai kÄ .
TÄtad, ļaujiet mums instalÄt Slirp no Ubuntu repozitorijiem un izmÄÄ£inÄt to palaist:
sudo apt-get install slirp
/usr/bin/slirp
Slirp v1.0.17 (BETA)
Copyright (c) 1995,1996 Danny Gasparovski un citi.
Visas tiesÄ«bas aizsargÄtas.
Å is programm ir autortiesÄ«bu aizsargÄts, bezmaksas programmatÅ«ra.
LÅ«dzu, izlasiet failu COPYRIGHT, kas nÄk kopÄ ar Slirp
pakotni par autortiesību noteikumiem un nosacījumiem.
Slirp hosta IP adrese: 127.0.0.1
Jūsu DNS(s) IP adrese: 1.1.1.1, 10.77.0.7
Jūsu adrese ir 10.0.2.15
(vai jebkas cits, ko vÄlaties)
Ierakstiet piecus nulles (0), lai izietu.
[autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud]
SLiRP Gatavs ...
fish: ā/usr/bin/slirpā beidzÄs ar signÄlu SIGSEGV (Adreses robežas kļūda)Ak, dievs. NÄciet, instalÄsim debuggers Slirp un aplÅ«kosim, vai varam saprast, kas Å”eit notiek:
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.Kļūda notiek . Apskatīsim stacktrace, varbūt tur atradīsim ko noderīgu:
(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.Å eit mÄs redzam, ka kļūda notiek, kad sÄkas galvenais cikls, kad slirp mÄÄ£ina pÄrbaudÄ«t termiÅus. TieÅ”i Å”ajÄ brÄ«dÄ« man vajadzÄja atteikties no mÄÄ£inÄjumiem veikt atkļūdoÅ”anu. Bet paskatÄ«simies, vai Slirp, kas salikts no avotiem, darbojas. Es atkÄrtoti lejupielÄdÄju arhÄ«vu tieÅ”i no vietnes , jo kaut ko Åemt no turienes caur komandu rindu ā ir sÄpÄ«gi:
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 Å eit mÄs redzam brÄ«dinÄjumus par nenoteiktÄm iebÅ«vÄtajÄm funkcijÄm, proti, par neiespÄjamÄ«bu saistÄ«t iegÅ«to binÄro failu. IzskatÄs, ka laikÄ starp 2006. gadu un Å”o brÄ«di gcc pÄrstÄja veidot simbolus, kurus izmanto iebÅ«vÄtajÄs funkcijÄs, starpÄji kompilÄtiem failiem. ApskatÄ«sim, vai varam aizstÄt atslÄgvÄrdu inline ar tukÅ”u komentÄru, lai redzÄtu rezultÄtu:
vi slirp.h
:6
a
#define inline /**/
:wq
makeNÄ, tas arÄ« nedarbojas. VÄl joprojÄm nevar atrast Å”o funkciju simbolus.
Å ajÄ posmÄ es padodos un sÄku meklÄt Github. . Mana teorija balstÄ«jÄs uz to, ka kÄdÄ no Heroku kompilÄÅ”anas paketÄm bÅ«s nepiecieÅ”amie binÄrie faili. BeigÄs meklÄjumi noveda mani Es lejupielÄdÄju un izpakoju uml.tar.gz. Un atradu sekojoÅ”o:
kopÄ 6136
-rwxr-xr-x 1 cadey cadey 79744 2017. gada 10. decembrī ifconfig*
-rwxr-xr-x 1 cadey cadey 373 2017. gada 13. decembrī init*
-rwxr-xr-x 1 cadey cadey 149688 2017. gada 10. decembrī insmod*
-rwxr-xr-x 1 cadey cadey 66600 2017. gada 10. decembrī route*
-rwxr-xr-x 1 cadey cadey 181056 2015. gada 26. jÅ«nijÄ slirp*
-rwxr-xr-x 1 cadey cadey 5786592 2017. gada 15. decembrī uml*
-rwxr-xr-x 1 cadey cadey 211 2017. gada 13. decembrÄ« uml_run*Tas ir binÄrais fails slirp! Bet vai tas darbojas?
./slirp
Slirp v1.0.17 (BETA) FULL_BOLT
Autortiesības (c) 1995,1996 Danny Gasparovski un citi.
Visas tiesÄ«bas aizsargÄtas.
Å is programma ir autortiesÄ«bu aizsargÄta, brÄ«va programmatÅ«ra.
LÅ«dzu, izlasiet Copyright failu, kas nÄk ar Slirp
paketi, par autortiesību noteikumiem un nosacījumiem.
Slirp saimnieka IP adrese: 127.0.0.1
Tava DNS adrese(i): 1.1.1.1, 10.77.0.7
Tava adrese ir 10.0.2.15
( vai jebkas cits, ko tu vÄlies )
Ievadi piecus nūlļus (0), lai izietu.
[automÄtiskÄ atpazīŔana SLIP/CSLIP, MTU 1500, MRU 1500]
SLiRP Gatavs ...
NekrÄ«t ā tÄ kÄ tas, visticamÄk, darbosies! Ievietosim Å”o binÄro failu ~ /bin/slirp.:
cp slirp ~ /bin/slirp.GadÄ«jumÄ, ja pakotnes veidotÄjs to izdzÄsÄ«s, es .
Tīkla iestatījumi.
Tagad iestatÄ«sim tÄ«klu uz mÅ«su viesoÅ”Ä kodola. :
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
eth0=slirp,,$HOME/bin/slirp
init=/bin/sh.Tagad iekļausim tīklu:
mount -t proc proc/
mount -t sysfs 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. PirmÄs divas konfigurÄcijas komandas /proc un /sys ir nepiecieÅ”amas, ifconfig, kas iestata tÄ«kla interfeisu saziÅai ar Slirp. Komanda route iestata kodola marÅ”rutu tabulu, lai piespiestu visu trafiku sÅ«tÄ«t caur Slirp tuneli. PÄrbaudÄ«sim to ar DNS pieprasÄ«jumu:
nslookup google.com 8.8.8.8
Server: 8.8.8.8
Adrese 1: 8.8.8.8 dns.google
Nosaukums: google.com
Adrese 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Adrese 2: 2607:f8b0:4006:81b::200e lga25s63-in-x0e.1e100.net.StrÄdÄ!
PiezÄ«me: IzskatÄs, ka sÄkotnÄjais ieraksts tika rakstÄ«ts uz galddatora ar vadu tÄ«kla karti, vai kÄdu citu konfigurÄciju, kas neprasa papildu draiverus. Uz klÄpjdatora ar WiFi 8265 no Intel, palaižot tÄ«klu, rodas kļūda.
/ # 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
/ #AcÄ«mredzot, kods nevar izveidot savienojumu ar tÄ«kla draiveri. DiemžÄl mÄÄ£inÄjums iekļaut firmware kodÄ situÄciju neizlabot. PublicÄÅ”anas brÄ«dÄ« tieÅ”i Å”ÄdÄ konfigurÄcijÄ atrast risinÄjumu vÄl nav izdevies. VienkÄrÅ”ÄkÄs konfigurÄcijÄs (piemÄram, Virtualbox) interfeiss tiek veiksmÄ«gi pacelts.
AutomatizÄsim pÄradresÄciju, izmantojot Å”Ädu shell skriptu:
#!/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/shUn atzÄ«mÄsim to kÄ izpildÄmu:
chmod +x init.shPÄc tam veiksim izmaiÅas kodÄ komandrindÄ:
linux
root=\/dev\/root
rootfstype=hostfs
rootflags=$HOME\/prefix\/uml-demo
rw
mem=64M
eth0=slirp,,$HOME\/bin\/slirp
init=\/init.sh
Un atkÄrtosim:
SLiRP Gatavs ...
networking iestatīts
\/bin\/sh: can't access tty; job control turned off
nslookup google.com 8.8.8.8
Server: 8.8.8.8
Address 1: 8.8.8.8 dns.google
Name: google.com
Address 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Address 2: 2607:f8b0:4004:800::200e iad30s09-in-x0e.1e100.netTÄ«kls darbojas stabilÄ stÄvoklÄ«!
Docker fails
Lai jums bÅ«tu vieglÄk to visu pÄrbaudÄ«t, es esmu savÄkusi , kas automatizÄ lielÄko daļu aprakstÄ«to soļu un jÄnodroÅ”ina jums darba konfigurÄcija. Man arÄ« ir , kurÄ ir viss, kas aprakstÄ«ts amatÄ. TaÄu ir svarÄ«gi saprast, ka Å”eit izklÄstÄ«ts tikai minimÄls iestatÄ«jums.
Es ceru, ka Å”is ieraksts palÄ«dzÄja jums saprast, kÄ pacelt viesu kodu. Tas sanÄcis kÄds briesmonis, taÄu publikÄcija tika plÄnota kÄ visaptveroÅ”s ceļvedis par bÅ«vniecÄ«bu, uzstÄdīŔanu un konfigurÄÅ”anu User Mode Linux modernÄm operÄtÄjsistÄmu versijÄm. NÄkamajiem soļiem jÄietver pakalpojumu un citu programmatÅ«ru uzstÄdīŔana jau iekÅ”ÄjÄ viesu sistÄmÄ. TÄ kÄ Docker konteineru attÄli ir vienkÄrÅ”i izkliedÄti tar arhÄ«vi, jums vajadzÄtu spÄt izsniegt attÄlu caur docker export, un pÄc tam noteikt tÄ uzstÄdīŔanas vietu viesu koda failu sistÄmas saknÄ. Un pÄc tam izpildiet shell skriptu.
AtseviŔķs paldies Rkeene ar #lobsters Freenode. Bez viÅa palÄ«dzÄ«bas Slirp atkļūdoÅ”anÄ es nebÅ«tu tik tÄlu tikusi. Man nav ne jausmas, kÄ viÅa Slackware sistÄma darbojas ar slirp, bet manas Ubuntu un Alpine sistÄmas nepieÅÄma slirp un piedÄvÄto Rkeene binÄro failu. Bet man ir pietiekami ar to, ka kaut kas strÄdÄ.
Avots: habr.com
