Kā sākt izmantot User Mode Linux 욓영

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. Cadey, tāpēc, ja ir jautājumi - uzdodiet angliski komentāros.

Kā sākt izmantot User Mode Linux 욓영

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]
      └─slirp

Strā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-dev

Koda 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 kernel.org un iegūstiet URL, lai lejupielādētu jaunāko stabilo koda versiju. Šī brīža postā tas ir: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

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.xz

Tagad ieejiet direktorijā, kas izveidota, atverot tarball:

cd linux-5.1.16

Koda būves konfigurācija

Koda būves sistēma ir komplekts Make-failiem 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\/bin

Viesu 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ļā ielādes 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.gz

Lejupielā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.gz

Tagad ieejiet viesu failu sistēmā un izvelciet arhīvu:

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

AprakstÄ«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 tini lai novērstu atmiņas patēriņu zombiju procesiem mÅ«su viesu kodolā.

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

Kodola 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/sh

IepriekÅ” 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 hostfs 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/sh kā 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 Å”eit.

Ceļojums uz slirp

Tomēr ir sen aizmirsts un gandrÄ«z neatbalstÄ«ts rÄ«ks ar nosaukumu Slirp, 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ā Ā«code rotĀ».

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 Ŕajā rindā. 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 Sourceforge, 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
make

Nē, tas arÄ« nedarbojas. Vēl joprojām nevar atrast Å”o funkciju simbolus.

Å ajā posmā es padodos un sāku meklēt Github. Heroku kompilēŔanas paketes.. 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 uz Å”ejieni.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 izveidoju spoguļattēlu..

Tīkla iestatījumi.

Tagad iestatīsim tīklu uz mūsu viesoŔā kodola. Atjaunināsim palaiŔanas parametrus.:

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

Un atzīmēsim to kā izpildāmu:

chmod +x init.sh

Pē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.net

Tīkls darbojas stabilā stāvoklī!

Docker fails

Lai jums bÅ«tu vieglāk to visu pārbaudÄ«t, es esmu savākusi Dockerfile, kas automatizē lielāko daļu aprakstÄ«to soļu un jānodroÅ”ina jums darba konfigurācija. Man arÄ« ir gatava kodu konfigurācija, 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

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster