Hyrje nga pĂ«rkthyesi: NĂ« mes tĂ« hyrjes masive tĂ« mĂ«nyrave tĂ« ndryshme tĂ« konteinerĂ«ve nĂ« jetĂ«n tonĂ«, mund tĂ« jetĂ« mjaft interesante dhe e dobishme tĂ« dihet se nga cilat teknologji ka filluar gjithçka njĂ«herĂ« e njĂ« kohĂ«. Disa prej tyre mund tĂ« aplikohen me dobi edhe sot, por jo tĂ« gjithĂ« e dinĂ« pĂ«r kĂ«to mĂ«nyra (ose nuk e dinĂ«, nĂ«se nuk ishin aty gjatĂ« zhvillimit tĂ« tyre tĂ« shpejtĂ«). NjĂ« nga kĂ«to teknologji Ă«shtĂ« User Mode Linux. Autori i origjinalit ka bĂ«rĂ« njĂ« hulumtim tĂ« thellĂ« pĂ«r tĂ« zbuluar se çfarĂ« nga arritjet e vjetra akoma funksionon dhe çfarĂ« jo, dhe ka mbledhur njĂ« manual tĂ« ngjashĂ«m hap pas hapi se si tĂ« krijoni vetĂ« njĂ« UML tĂ« improvizuar nĂ« 2019. Dhe po, e kemi ftuar nĂ« Habr autorin e postit origjinal , kĂ«shtu qĂ« nĂ«se keni ndonjĂ« pyetje â mos hezitoni tĂ« pyesni nĂ« anglisht nĂ« komentet.

Rejimi User Mode në Linux është, në fakt, një port i bërthamës Linux në vetveten. Ky regjistër lejon të aktivizohet një bërthamë e plotë Linux si një proces përdoruesi dhe zakonisht përdoret nga zhvilluesit për testimin e shoferëve. Por ky regjistër është gjithashtu i dobishëm si një mjet i përgjithshëm izolimi, parimi i të cilit është i ngjashëm me funksionimin e makinave virtuale. Ky regjistër siguron një izolim më të madh se Docker, por më të vogël se një makinë virtuale e plotë si KVM ose Virtual Box.
Në përgjithësi, User Mode mund të duket si një mjet i çuditshëm dhe i komplikuar për t'u përdorur, por megjithatë ka disa fusha të aplikimit. Kjo është një bërthamë e plotë Linux, e cila funksionon nga një përdorues jo të privilegjuar. Ky veçori lejon ekzekutimin e kodit potencialisht të pasigurt pa ndonjë rrezik për makinën host. Dhe për faktin se kjo është një bërthamë e plotë, proceset e saj janë të izoluar nga makina host, pra proceset që funksionojnë brenda User Mode, nuk do të jenë të dukshme për hostin. Kjo nuk është si një kontejner Docker i zakonshëm, ku makina host gjithmonë sheh proceset brenda depozites. Shikoni këtë pjesë të pstree nga një nga serverët e mi:
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}]Dhe krahasoni kĂ«tĂ« me pstree tĂ« bĂ«rthamĂ«s Linux nĂ« Modalitetin e PĂ«rdoruesit:
linuxââŹâ5*[linux]
ââslirpDuke punuar me kontejnerĂ«t Docker, unĂ« mund tĂ« shoh nga hosti emrat e proceseve qĂ« janĂ« tĂ« lançuar nĂ« sistemin e mysafirĂ«ve. Me Modalitetin e PĂ«rdoruesit tĂ« Linux-it kjo nuk Ă«shtĂ« e mundur. ĂfarĂ« do tĂ« thotĂ« kjo? Kjo do tĂ« thotĂ« se mjetet e monitorimit qĂ« punojnĂ« nĂ«pĂ«rmjet nĂ«nstrukturĂ«s sĂ« auditit tĂ« Linux-it (Linuxâs auditing subsystem) nuk shohin proceset qĂ« ekzekutohen nĂ« sistemin e mysafirĂ«ve. Por nĂ« disa situata, kjo veçori mund tĂ« bĂ«het njĂ« armĂ« me dy presa.
I gjithë postimi më poshtë është një grumbull studimesh dhe përpjekjesh të thjeshta për të arritur rezultatin e dëshiruar. Për këtë, kam përdorur instrumente të ndryshme antike, kam lexuar burime të bërthamës, kam bërë përshtatje intensive të kodit të shkruar në kohën kur unë ende isha në shkollë fillore, dhe kam hulumtuar në paketimin e Heroku me një binar të veçantë për të gjetur mjetet që më nevojiteshin. Të gjitha këto punë bënë që shokët e mi në IRC të fillonin të më quajnë magjistare (magic). Shpresoj se ky post do të shërbejë si dokumentacion i besueshëm për dikë që dëshiron të bëjë të njëjtën gjë, por me bërthama dhe versione më të reja të OS.
Konfigurimi
Konfigurimi i MĂČdulit tĂ« PĂ«rdoruesit Linux realizohet nĂ« disa etapa:
- instalimi i varësive në host;
- shkarkimi i bërthamës Linux;
- konfigurimi i ndërtimit të bërthamës;
- ndërtimi i bërthamës;
- instalimi i binarit;
- konfigurimi i sistemit file të mysafirit;
- zgjedhja e parametrave të nisjes së bërthamës;
- konfigurimi i rrjetit mysafir;
- nisja e bërthamës mysafire.
Mendoj se nĂ«se vendosni ta bĂ«ni kĂ«tĂ« vetĂ«, ka tĂ« ngjarĂ« tĂ« bĂ«ni gjithçka nĂ« njĂ« sistem tĂ« ngjashĂ«m me Ubuntu ose Debian. UnĂ« kam provuar ta realizoj tĂ« gjithĂ« kĂ«tĂ« nĂ« distribuimin tim tĂ« preferuar â Alpine, por nuk arrita dot, duket pĂ«r shkak se bĂ«rthama Linux ka njĂ« lidhje tĂ« fortĂ« me glibc-isms pĂ«r drejtuesit nĂ« User Mode. Planifikoj tĂ« raportoj kĂ«tĂ« nĂ« upstream pasi tĂ« pĂ«rfundoj pĂ«rfundimisht me problemin.
Instalimi i varësive në host
Ubuntu kërkon, së paku, paketat e mëposhtme për ndërtimin e bërthamës Linux (nën kushtin e një instalimi të pastër):
- 'build-essential'
- 'flex'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certificates'
- 'bc'
- 'linux-headers'
Mund tâi instaloni ato me komandĂ«n e mĂ«poshtme (me tĂ« drejtat root ose me sudo):
apt-get -y install build-essential flex bison xz-utils wget ca-certificates bc
linux-headers-$(uname -r) Vini re se ekzekutimi i programit të konfigurimit të menusë për bërthamën Linux do të kërkojë instalimin e libncurses-dev. Ju lutem, sigurohuni që ai të jetë instaluar me komandën e mëposhtme (me të drejtat root ose me sudo):
apt-get -y install libncurses-devShkarkimi i bërthamës
Përcaktoni vendin për ngarkimin dhe ndërtimin e mëpasshëm të bërthamës. Për këtë operacion do t'ju duhet të rezervoni rreth 1,3 GB hapësirë në diskun e ngurtë, prandaj sigurohuni që e keni atë.
Pas kësaj, kaloni në dhe merrni URL-në për të shkarkuar versionin e fundit stabil të bërthamës. Në momentin e shkrimit të këtij postimi, kjo është:
Shkarkoni këtë skedare duke përdorur 'wget':
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz Dhe nxirrni atë duke përdorur 'tar':
tar xJf linux-5.1.16.tar.xzTani hyni në direktoren që u krijua gjatë shpërndarjes së tarball-it:
cd linux-5.1.16Konfigurimi i ndërtimit të bërthamës
Sistemi i ndërtimit të bërthamës është një grup me m shumë mjete dhe skripte të personalizuara për automatizimin e procesit. Fillimisht hidhni një sy në programin interaktiv të konfigurimit:
make ARCH=um menuconfig Ai do tĂ« kryejĂ« pjesĂ«risht ndĂ«rtimin dhe do t'ju shfaqĂ« njĂ« dritare dialogu. Kur nĂ« fund tĂ« dritares shfaqet â[Select]â, do tĂ« jeni nĂ« gjendje tĂ« bĂ«ni konfigurimin duke pĂ«rdorur butonat Space ose Enter. Navigimi nĂ« dritare, si zakonisht, bĂ«het me çelĂ«sat e drejtimit âlartâ dhe âposhtĂ«â, ndĂ«rsa pĂ«rzgjedhja e elementeve me âmajtasâ ose âdjathasâ.
Tregoja e tipit â> tregon se ndodheni nĂ« njĂ« submenu, nĂ« tĂ« cilĂ«n hyni me çelĂ«sin Enter. Dalja nga ajo bĂ«het, natyrisht, pĂ«rmes â[Dalja]â.
Aktivizoni parametrat e mĂ«poshtĂ«m nĂ« â[Select]â dhe sigurohuni qĂ« pranĂ« tyre tĂ« ketĂ« simbolin â[*]â:
Opsionet specifike për UML:
- Sistemi i skedarëve të hostit
Mbështetje për rrjet (aktivizojeni këtë për të shfaqur submenu-n):
- Opsionet e rrjetit:
- TCP/IP Rrjet
Dispozitat e rrjetit UML:
- Dispozita virtuale e rrjetit
- Transporti SLiRP Nga kjo dritare mund tĂ« dilni duke zgjedhur rend pas â[Dalja]â. Thjesht sigurohuni qĂ« nĂ« fund tĂ« jetĂ« propozuar tĂ« ruani konfiguracionin dhe zgjidhni â[Po]â.
Ju rekomandoj të eksperimentoni me parametrat e ndërtimit të kernelit pas leximit të këtij postimi. Përmes këtyre eksperimenteve do të arrini shumë në kuptimin e mekanizmave të ulët të kernelit dhe ndikimin e ndryshëm flamujve në ndërtimin e tij.
Ndërtimi i kernelit
Një kernel Linux është një program i madh, që përfshin shumë gjëra. Edhe me një konfiguro minimal në pajisje të vjetra, ndërtimi i tij mund të marrë mjaft kohë. Prandaj, ndërtoni kernelin me komandën e mëposhtme:
make ARCH=um -j$(nproc) Pse? Kjo komandë do t'i thotë ndërtuesit tonë të përdorë të gjitha bërthamat dhe fushat e disponueshme të procesorit gjatë procesit të ndërtimit. Komanda $(nproc) në fund të ndërtimit zëvendëson rezultatin e komandës nproc, që është pjesë e coreutils në ndërtimin standard të Ubuntu.
Pas një kohe, bërthama jonë do të jetë ndërtuar në një skedar ekzekutiv ./linux.
Instalimi i binarit
Duke qenë se Mode-i i Përdoruesit në Linux krijon një binar normal, mund ta instaloni si çdo utilitar tjetër. Ja si e kam bërë unë:
mkdir -p ~/bin
cp linux ~/bin/linux Gjithashtu vlen të siguroheni që ~/bin është në $PATH:
export PATH=$PATH:$HOME/binKonfigurimi i sistemit të files për mysafirët
Krijoni një drejtor të sistemit të files për mysafirët:
mkdir -p $HOME/prefix/uml-demo
cd $HOME/prefix
Hyni në alpinelinux.org dhe në gjeni lidhjen aktuale për shkarkim MINI ROOT FILESYSTEM. Në momentin e publikimit, kjo ishte:
http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gzShkarkoni këtë tarball, duke përdorur 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.gzTani hyni në drejtorinë e sistemit të files për mysafirët dhe shpërndani arkivën:
cd uml-demo
tar xf ../alpine-rootfs.tgzVeprimet e përshkruara do të krijojnë një model të vogël të sistemit të skedarëve. Për shkak të karakteristikave të funksionimit të sistemit, do të jetë jashtëzakonisht e vështirë të instalosh paketat përmes menaxhuesit apk të Alpine. Por, ky sistem do të jetë i mjaftueshëm për të vlerësuar idenë e përgjithshme.
Na nevojitet gjithashtu një mjet për të ndaluar konsumimin e memories të bërthamës tonë të hostit.
wget -O tini https://github.com/krallin/tini/releases/download/v0.18.0/tini-static
chmod +x tiniKrijimi i komandës së bërthamës
Në bërthamën Linux, ashtu siç ndodh me shumicën e programeve të tjera, ka argumente të komandës që mund të njiheni duke përdorur çelësin --help.
VetĂ« âhelp
linux --help
User Mode Linux v5.1.16
i disponueshëm në http://user-mode-linux.sourceforge.net/
--showconfig
Së pari printon skedarin e konfigurimit nga i cili është krijuar ky binar UML.
iomem=,
Konfiguro si një rajon memorie IO të quajtur .
mem=
Kjo kontrollon sa "memorie fizike" kernel-i alokuar
për sistemin. Madhësia përcaktohet si një numër të pasuar nga
një nga 'k', 'K', 'm', 'M', të cilat kanë kuptimin e dukshëm.
Kjo nuk ka lidhje me sasinë e memories në host. Mund të
jetë më shumë, dhe teprica, nëse përdoret ndonjëherë, do të swap-izohet.
Shembull: mem=64M
--help
Printon këtë mesazh.
debug
ky flamur nuk është i nevojshëm për të kryer gdb në UML në modin skas
root=
Kjo përdoret në të vërtetë nga kernel-i tipik në të njëjtën
mënyrë si në çdo kernel tjetër. Nëse konfiguroni një numër të pajisjeve bllok
dhe dëshironi të bootoni nga ndonjë gjë tjetër përveç ubd0, do të
përdorni diçka si:
root=/dev/ubd5
--version
Printon numrin e versionit të kernel-it.
umid=
Ky përdoret për të caktuar një identitet unik për këtë makinë UML dhe
përdoret për emërtimin e skedarit pid dhe socket e menaxhimit të konsolës.
con[0-9]*=
Lidhen një konsolë ose linjë seriale me një kanal host. Shih
http://user-mode-linux.sourceforge.net/old/input.html për një përshkrim të plotë
të kësaj ndihme.
eth[0-9]+=,
Konfiguro një pajisje rrjeti.
aio=2.4
Ky përdoret për të detyruar UML të përdorë AIO në stilin 2.4 edhe kur AIO 2.6 është
e disponueshme. AIO 2.4 është një thread e vetme që trajton një kërkesë njëherë
në kohë, në mënyrë sinkrone. AIO 2.6 është një thread që përdor ndërfaqen AIO
2.6 për të trajtuar një numër të arbitrshëm kërkesash të prapambetura. AIO 2.6
nuk është i disponueshëm në modin tt, në hostet 2.4, ose kur UML është ndërtuar me
/usr/include/linux/aio_abi.h që nuk është i disponueshëm. Shumë shpërndarje nuk
përfshijnë aio_abi.h, kështu që do t'ju duhet ta kopjoni atë nga një pemë kernel-i në
/usr/include/linux tuaj për të ndërtuar një UML të aftë për AIO.
nosysemu
Ăaktivizon ndihmĂ«n e emulimit syscall pĂ«r ptrace (SYSEMU).
SYSEMU është një patch performancë i prezantuar nga Laurent Vivier. Kjo ndryshon
sjelljen e ptrace() dhe ndihmon në reduktimin e normave të këmbimit të konteksteve të hostit.
Për ta bërë këtë të funksionojë, ju nevojitet gjithashtu një patch kernel-i për host-in tuaj.
Shih http://perso.wanadoo.fr/laurent.vivier/UML/ për më shumë
informacion.
uml_dir=
Lokacioni për të vendosur skedaret pid dhe umid.
quiet
Ăaktivizon mesazhet e informacionit gjatĂ« boot-it.
hostfs=,,...
Ky përdoret për të vendosur parametrat e hostfs. Argumenti për drejtorinë rrënjë
përdoret për të kufizuar të gjitha montimet hostfs brenda pemës së drejtorisë së caktuar
në host. Nëse kjo nuk specifikohet, atëherë një përdorues brenda UML mund
të montohet çdo gjë mbi host që është e aksesueshme nga përdoruesi që e po kryen atë.
Flamuri i vetëm që mbështetet aktualisht është 'append', i cili specifikon që të gjitha
skedarët e hapur nga hostfs do të hapen në modin e prapësimit.
Kyçni të dhënat kryesore për nisjen. Le të fillojmë kernelin me setin minimal të opsioneve të nevojshme:
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
init=/bin/shRreshtat e mësipërm i tregojnë kernelit tonë këtë:
- Supozoni se sistemi i skedarëve në rrënjë është një pajisje pseudo
/dev/root. - Zgjidh si drejtuesin e sistemit të skedarëve në rrënjë.
- Montoni sistemin e skedarëve të mysafirëve që krijuam në pajisjen rrënjë.
- Dhe, po, në modin e leximit-shkrimit.
- Përdorni vetëm 64 megabajt RAM (mund të përdorni shumë më pak, në varësi të asaj që planifikoni të bëni, por 64 MB duken volum optimal).
- Kerneli e nis automatikisht
/bin/shsiprocesiinit.
Ekzekutoni këtë komandë dhe duhet të merrni diçka si kjo:
Një tjetër fletë
Kufijtë e bllokimit të bërthamës:
të butë - 0
tĂ« fortĂ« - ASGJĂ
Kontrollimi nëse ptrace mund të ndryshojë numrat e thirrjes në sistem...OK
Kontrollimi i patch-it të emulimit të thirrjeve për ptrace...OK
Kontrollimi i patch-it të avancuar të emulimit të thirrjeve për ptrace...OK
Kontrollimi i variablave të ambientit për një tempdir...asnjë nuk u gjet
Kontrollimi nëse /dev/shm është në tmpfs...OK
Kontrollimi i PROT_EXEC mmap në /dev/shm...OK
Shtimi i 32137216 bajtëve në kujtesën fizike për të kompensuar boshllëkun e exec-shield
Versioni i Linux 5.1.16 (cadey@kahless) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 Di, 7 Korrik 2019 18:57:19 UTC
Ndërtohen 1 zonelista, grupimi i mobilitetit aktiv. Totali i faqeve: 23898
Vija e komandës së bërthamës: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Numri i shënimeve të cache të dentry: 16384 (rend: 5, 131072 bajtë)
Numri i shënimeve të cache të inode: 8192 (rend: 4, 65536 bajtë)
Kujtesa: 59584K/96920K në dispozicion (2692K kodi i bërthamës, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K të rezervuara, 0K rezervuar cma)
SLUB: HWalign=64, Renditja=0-3, MinObjects=0, CPU=1, Nivele=1
NR_IRQS: 15
burimi i orës: timer: maska: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns
Kalibrimi i ciklit të vonesës... 7479.29 BogoMIPS (lpj=37396480)
pid_max: default: 32768 minimum: 301
Numri i shënimeve të cache të mountit: 512 (rend: 0, 4096 bajtë)
Numri i shënimeve të cache të pikë-mount: 512 (rend: 0, 4096 bajtë)
Kontrollimi që ptys e hostit mbështesin daljen SIGIO...Po
Kontrollimi që ptys e hostit mbështesin SIGIO gjatë mbylljes...Jo, duke mundësuar workaround
devtmpfs: inicializuar
rastësor: merr_random_bytes i thirrur nga setup_net+0x48/0x1e0 me crng_init=0
Duke përdorur 2.6 host AIO
burimi i orës: jiffies: maska: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
numri i shënimeve të cache të futex: 256 (rend: 0, 6144 bajtë)
NET: Familja e protokolleve 16 është regjistruar
burimi i orës: Kalimi në burim të orës timer
NET: Familja e protokolleve 2 është regjistruar
tcp_listen_portaddr_hash numri i shënimeve të cache: 256 (rend: 0, 4096 bajtë)
Numri i shënimeve të hash-it të TCP të krijuara: 1024 (rend: 1, 8192 bajtë)
Numri i shënimeve të hash-it të TCP që lidhen: 1024 (rend: 1, 8192 bajtë)
TCP: Tabelat e hash-it janë konfiguruar (krijuar 1024 lidhje 1024)
Numri i shënimeve të hash-it të UDP: 256 (rend: 1, 8192 bajtë)
Numri i shënimeve të hash-it të UDP-Lite: 256 (rend: 1, 8192 bajtë)
NET: Familja e protokolleve 1 është regjistruar
konsola [stderr0] e kthyer dizajni
mconsole (versioni 2) i inicializuar në /home/cadey/.uml/tEwIjm/mconsole
Kontrollimi mbështetjes MADV_REMOVE...OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Blloku i nivelit SCSI generic (bsg) drejtori versioni 0.4 u ngarkua (major 254)
scheduler i io noop u regjistrua (default)
scheduler i io bfq u regjistrua
loop: moduli i ngarkuar
NET: Familja e protokolleve 17 është regjistruar
Inicikuar drejtori i konsolës stdio
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 1: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 2: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 3: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 4: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 5: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 6: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 7: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 8: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 9: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 10: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 11: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 12: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 13: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 14: Dështoi konfigurimi
Duke përdorur një tip kanali që është i konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 15: Dështoi konfigurimi
Konsola u inicializua në /dev/tty0
konsola [tty0] e aktivizuar
konsola [mc-1] e aktivizuar
Dështoi të inicializojë pajisjen ubd 0: Nuk mund të përcaktohet madhësia e skedarit të pajisjes
VFS: U montua rrënja (sistemi i skedarëve hostfs) në pajisjen 0:11.
devtmpfs: e montuar
Kjo arkitekturë nuk ka mbrojtje të kujtesës së bërthamës.
Ekzekutoni /bin/sh si procesin init
/bin/sh: nuk mund të accederos tty; kontrolli i punëve është i ndalur
rastësor: iniconizimi i shpejtë është bërë
/ # Manovrat e mësipërme do të na japin një sistem mik me minimumin e nevojshëm, pa gjëra të tilla si /proc apo hostname i caktuar. Për shembull, provoni të ekzekutoni komandat në vijim:
- uname -av
- cat /proc/self/pid
- hostname
Për t'u dalë nga sistemi mik, shkruani exit apo shtypni control-d. Kjo do të rezultojë në një shell që çon në panik të kernel-it:
/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: â./linux root=/dev/root rootflagâŠâ terminated by signal SIGABRT (Abort) Ne e morĂ«m kĂ«tĂ« panik tĂ« kernel-it pĂ«r shkak se kernel-i Linux mendon se procesi i inicializimit Ă«shtĂ« gjithmonĂ« nĂ« funksion. Pa tĂ«, sistemi nuk mund tĂ« funksionojĂ« mĂ« dhe ndalon. Por duke qenĂ« se ky Ă«shtĂ« njĂ« proces i nivelit tĂ« pĂ«rdoruesit, rezultati i marrĂ« e dĂ«rgon vetveten nĂ« SIGABRT, çka çon nĂ« daljen.
Konfigurimi i rrjetit mik
Por këtu gjërat fillojnë të shkojnë keq. Rrjeti në User Mode Linux është vendi ku gjithë koncepti i "përdorimit të kufizuar" fillon të dështojë. Një sistem normalisht ka rrjet të kufizuar nën modet e privilegjuara për të gjitha arsyet që ne të gjithëve i njohim.
Shënim: më shumë rreth opsioneve të ndryshme të punës me rrjetin në UML mund të lexoni .
Udhëtimi në slirp
Megjithatë, ekziston një mjet i vjetër dhe praktikisht i papërcaktuar i quajtur , me ndihmën e të cilit User Mode Linux mund të bashkëpunojë me rrjetin. Ai funksionon si një stivë TCP/IP në nivelin e përdoruesit dhe nuk kërkon asnjë leje sistemike për t'u aktivizuar. Ky mjet u lëshua në vitin 1995, ndërsa përditësimi më i fundit është nga viti 2006. Slirp është shumë i vjetër. Gjatë periudhës pa mbështetje dhe përditësime, kompajlerët janë avancuar në një mënyrë që ky mjet tani mund të karakterizohet vetëm si .
. Pra, le të instalojmë Slirp nga depozit e Ubuntu dhe ta provojmë atë:
sudo apt-get install slirp
/usr/bin/slirp
Slirp v1.0.17 (BETA)
Copyright (c) 1995,1996 Danny Gasparovski dhe të tjerët.
Të gjitha të drejtat janë të rezervuara.
Ky program është i mbrojtur me të drejta autori, software i lirë.
Ju lutemi lexoni skedarin COPYRIGHT që erdhi me paketën Slirp
për kushtet e të drejtave të autorit.
Adresa IP e hostit Slirp: 127.0.0.1
Adresa IP e DNS (të) tuaja: 1.1.1.1, 10.77.0.7
Adresa juaj është 10.0.2.15
(o ndonjë gjë tjetër që dëshironi)
Shkruani pesë zero (0) për të dalë.
[autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud]
SLiRP Gati ...
fish: â/usr/bin/slirpâ u ndĂ«rpre nga sinjali SIGSEGV (Gabimi i kufirit tĂ« adresĂ«s)Oh, Zot. Le tĂ« vendosim njĂ« debugar pĂ«r Slirp dhe tĂ« shohim nĂ«se mund tĂ« kuptojmĂ« se çfarĂ« po ndodh:
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.Gabim ndodhi në . Le të shohim stacktrace-in, ndoshta do të na ndihmojë ndonjë gjë:
(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.Këtu shohim se dështimi ndodh gjatë fillimit të ciklit kryesor, kur slirp përpiqet të kontrollojë skadencat. Një moment kritik ky ku duhet të isha tërhequr nga përpjekjet për debugging. Por le të shohim nëse Slirp, i ndërtuar nga burimet, funksionon. Rindërtoi arkivën direkt nga site-i. , sepse të tërheqësh diçka prej aty përmes komandës është një mundim:
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 Këtu shohim alarmin për funksionet e ndërtuara të pa përcaktuara, domethënë pamundësinë për të lidhur skedarin binar që rezulton. Duket se në periudhën midis vitit 2006 dhe kësaj pike, gcc ka ndaluar së krijuari simbolet e përdorura në funksionet e ndërmjetme të kompilimit. Le të provojmë të zëvendësojmë fjalën kyçe inline Le të shohim rezultatin e një komenti të zbrazët:
vi slirp.h
:6
a
#define inline /**/
:wq
makeJo. Kjo gjithashtu nuk funksionon. Akoma nuk po gjenden simbolet e këtyre funksioneve.
Në këtë fazë u dorëzova dhe fillova të kërkoj në Github . Teoria ime ishte se do të ishin të përfshira skedarët binarë të nevojshëm në ndonjë paketë ndërtimi të Heroku. Në fund, kërkimet më çuan . E shkarkova dhe e shpërndava uml.tar.gz dhe gjeta këtë:
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*Ky është një skedar binar slirp! Po funksionon?
./slirp
Slirp v1.0.17 (BETA) FULL_BOLT
Copyright (c) 1995,1996 Danny Gasparovski dhe të tjerë.
Të gjitha të drejtat e rezervuara.
Ky program është i mbrojtur nga të drejtën e autorit, softuer i lirë.
Ju lutemi lexoni skedarin COPYRIGHT që erdhi me paketën Slirp
për kushtet dhe rregullat e të drejtave të autorit.
Adresa IP e hostit Slirp: 127.0.0.1
Adresa IP e DNS-ve tuaj: 1.1.1.1, 10.77.0.7
Adresa juaj është 10.0.2.15
(përndryshe, çdo gjë tjetër që dëshiron)
Shkruani pesë zero (0) për të dalë.
[autodetect SLIP/CSLIP, MTU 1500, MRU 1500]
SLiRP Gatshëm ...
Nuk bie â pra do tĂ« duhet tĂ« funksionojĂ«! Le tĂ« fusim kĂ«tĂ« binar nĂ« ~/bin/slirp:
cp slirp ~/bin/slirpNë rast se krijuesi i paketës e heq atë, unë .
Konfigurimi i rrjetit
Tani le të konfiguroni rrjetin në bërthamën tonë të mysafirëve. :
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
eth0=slirp,,$HOME/bin/slirp
init=/bin/shTani le të aktivizojmë rrjetin:
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 Dy komandat e para të konfigurimit /proc dhe /sys janë të nevojshme për funksionimin ifconfig, e cila vendos lidhjen rrjetore për komunikim me Slirp. Komanda route vendos tabelën e rrugës së bërthamës për të detyruar dërgimin e gjithë trafikut përmes tunelit Slirp. Le të kontrollojmë këtë me një kërkesë DNS:
nslookup google.com 8.8.8.8
Server: 8.8.8.8
Adresa 1: 8.8.8.8 dns.google
Emri: google.com
Adresa 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Adresa 2: 2607:f8b0:4006:81b::200e lga25s63-in-x0e.1e100.netFunksionon!
Shënim: duket se posti origjinal është shkruar në një desktop me një kartë rrjeti me tel, ose me ndonjë konfigurim tjetër që nuk kërkon drejtuese shtesë. Në një laptop me WiFi 8265 nga Intel, ndodhin gabime gjatë ngjitjes së rrjetit.
/ # 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
/ #Duket se bërthama nuk mund të lidhë me driverin e kartës së rrjetit. Përpjekja për të kompiluar firmware në bërthamë, për fat të keq, nuk e zgjidhi situatën. Në momentin e publikimit, ende nuk ka pasur zgjidhje për këtë konfigurim. Në konfigurime më të thjeshta (p.sh., në Virtualbox), lidhja funksionon siç duhet.
Le të automatizojmë ridrejtimin me ndihmën e skriptit të mëposhtëm shell:
#!/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/shDhe ta shënojmë si ekzekutues:
chmod +x init.shPastaj do të bëjmë ndryshime në linjën e komandës së bërthamës:
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
eth0=slirp,,$HOME/bin/slirp
init=/init.sh
Dhe do ta përsërisim:
SLiRP Gati ...
rrjetet e vendosura
/bin/sh: nuk mund të qaset tty; kontrolli i punës u ndal
nslookup google.com 8.8.8.8
Server: 8.8.8.8
Adresa 1: 8.8.8.8 dns.google
Emri: google.com
Adresa 1: 172.217.12.206 lga25s63-in-f14.1e100.net
Adresa 2: 2607:f8b0:4004:800::200e iad30s09-in-x0e.1e100.netRrjeti funksionon stabilisht!
Dockerfile
Për t'ju lehtësuar të provoni gjithçka, unë kam mbledhur , e cila automatizon shumicën e hapave të përshkruar dhe duhet t'ju sigurojë një konfigurim funksional. Gjithashtu kam një , në të cilën janë gjitha çfarë është përshkruar në postim. Por është e rëndësishme të kuptohet se këtu kam paraqitur vetëm konfigurimin minimal.
Shpresoj që ky postim të ju ketë ndihmuar të kuptoni si të ngrini një bërthamë të mikpritësit. U krijua një gjë e çuditshme, por qëllimi ishte publikimi si një udhëzues gjithëpërfshirës mbi ndërtimin, instalimin dhe konfigurimin e Modalitetit të Përdoruesit në Linux për versionet moderne të këtij familjeje të sistemit operativ. Veprimet e mëtejshme duhet të përfshijnë instalimin e shërbimeve dhe software-it të tjerë brenda sistemit të mikpritësit. Duke qenë se imazhet e kontejnerëve Docker janë thjesht arkiva tar të shërbimeve, duhet të jeni në gjendje të nxirrni imazhin përmes docker export, dhe pastaj të përcaktoni rrugën e ndërtimit në rrënjën e sistemit të skedarëve të bërthamës së mikpritësit. Pastaj, ekzekutoni skriptin shell.
Një falënderim të veçantë për Rkeene nga #lobsters në Freenode. Pa ndihmën e tij në rregullimin e Slirp, nuk do isha arrin aq larg. Nuk e di si funksionon sistemi i tij Slackware me slirp, por sistemet e mia Ubuntu dhe Alpine nuk pranuan slirp dhe binarin që më ofroi Rkeene. Por më mjafton fakti që kam diçka që funksionon.
Burimi: habr.com
