Paragrafi hyrĂ«s nga pĂ«rkthyesi: NĂ« sfondin e hyrjes masive tĂ« llojeve tĂ« ndryshme tĂ« kontejnerĂ«ve nĂ« jetĂ«n tonĂ«, mund tĂ« jetĂ« mjaft interesante dhe e dobishme tĂ« kuptojmĂ« se nga cilat teknologji Ă«shtĂ« nisur gjithçka dikur. Disa prej tyre mund tĂ« aplikohen me dobi edhe sot, por jo tĂ« gjithĂ« e dinĂ« pĂ«r kĂ«to mĂ«nyra (ose nuk kanĂ« qenĂ« tĂ« pranishĂ«m gjatĂ« zhvillimit tĂ« tyre entuziast). NjĂ« nga kĂ«to teknologji Ă«shtĂ« User Mode Linux. Autori i materialit origjinal ka bĂ«rĂ« njĂ« hulumtim tĂ« thellĂ«, duke u pĂ«rpjekur tĂ« zbulojĂ« se çfarĂ« nga punimet e vjetra ende funksionon dhe çfarĂ« nuk Ă«shtĂ« mĂ« aq efektiv, dhe ka mbledhur diçka si njĂ« udhĂ«zim hap pas hapi se si tĂ« krijosh njĂ« UML tĂ« bĂ«rĂ« vetĂ« nĂ« vitin 2019. Dhe po, e kemi ftuar nĂ« Habr autorin e postit origjinal. , kĂ«shtu qĂ« nĂ«se keni ndonjĂ« pyetje â mos ngurroni tĂ« pyesni nĂ« anglisht nĂ« komentet.

User Mode nĂ« Linux Ă«shtĂ«, nĂ« thelb, njĂ« portim i bĂ«rthamĂ«s Linux mbi veten e saj. Ky mod mundĂ«son запŃŃĐșаŃĐ” e njĂ« bĂ«rthame tĂ« plotĂ« Linux si njĂ« proces pĂ«rdoruesi dhe zakonisht pĂ«rdoret nga zhvilluesit pĂ«r testimin e drejtuesve. Por gjithashtu ky mod Ă«shtĂ« i dobishĂ«m si njĂ« mjet izolimi tĂ« pĂ«rgjithshĂ«m, principi i tĂ« cilit Ă«shtĂ« i ngjashĂ«m me funksionimin e makina virtuale. Ky mod ofron njĂ« nivel mĂ« tĂ« lartĂ« izolimi se Docker, por mĂ« tĂ« ulĂ«t se njĂ« makinĂ« virtuale tĂ« plotĂ« si KVM ose Virtual Box.
Në përgjithësi, User Mode mund të duket si një mjet i çuditshëm dhe i komplikuar në përdorim, por megjithatë ka fushat e tij të aplikimit. Sepse kjo është një bërthamë e plotë Linux, e cila punon nga një përdorues i pa privilegjuar. Ky veçorim lejon ekzekutimin e kodit potencialisht të pasigurt pa ndonjë rrezik për makinën pritëse. Dhe duke qenë se kjo është një bërthamë e plotë, proceset e saj janë të izoluara nga makina pritëse, do të thotë proceset që punojnë brenda User Mode nuk do të jenë të dukshme për hostin. Kjo nuk është si një kontejner Docker, në rastin e të cilit makina pritëse gjithmonë sheh proceset brenda depozita. Shihni këtë copë 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 mĂ« krahasoni kĂ«tĂ« me pstree-n e kernelit Linux nĂ« Rejimin e PĂ«rdoruesit:
linuxââŹâ5*[linux]
ââslirpKur punoj me kontejnerĂ« Docker, unĂ« mund tĂ« shoh emrat e proceseve qĂ« janĂ« aktivizuar nĂ« sistemin mik. Me Rejimin e PĂ«rdoruesit tĂ« Linuxit kjo Ă«shtĂ« e pamundur. ĂfarĂ« do tĂ« thotĂ« kjo? Do tĂ« thotĂ« qĂ« mjetet e monitorimit, qĂ« punojnĂ« pĂ«rmes altĂ«sisĂ« sĂ« auditimit tĂ« Linuxit (Linuxâs auditing subsystem) nuk shohin proceset qĂ« ekzekutohen nĂ« sistemin mik. Por nĂ« disa raste, kjo veçori mund tĂ« bĂ«het dyzuar.
NĂ« pĂ«rgjithĂ«si, postimi i gjithĂ« kĂ«tij informacioni Ă«shtĂ« njĂ« grup kĂ«rkimesh dhe pĂ«rpjekjesh tĂ« rĂ«ndomta pĂ«r tĂ« arritur rezultatin e dĂ«shiruar. PĂ«r kĂ«tĂ«, mĂ« ka dashur tĂ« pĂ«rdor mjete tĂ« ndryshme tĂ« lashta, tĂ« lexoj burimet e kernelit, tĂ« angazhohem nĂ« debuggimin intensiv tĂ« kodit qĂ« Ă«shtĂ« shkruar nĂ« kohĂ«n qĂ« unĂ« isha ende nĂ« shkollĂ« fillore dhe gjithashtu tĂ« gĂ«rmoj nĂ« ndĂ«rtimet e Heroku me ndihmĂ«n e njĂ« binar tĂ« veçantĂ« pĂ«r tĂ« gjetur mjetet qĂ« mĂ« nevojiteshin. I gjithĂ« ky punim çoi nĂ« faktin qĂ« shokĂ«t e mi nĂ« IRC filluan tĂ« mĂ« quajnĂ« magjistare (magic). Shpresoj qĂ« ky postim tâu shĂ«rbejĂ« dikujt si njĂ« dokumentacion i besueshĂ«m pĂ«r tĂ« bĂ«rĂ« gjithçka tĂ« njĂ«jtĂ«, por tashmĂ« me kernela dhe versione mĂ« tĂ« reja tĂ« OS-sĂ«.
Configuration
Konfigurimi i Rejimit të Përdoruesit të Linuxit realizohet në disa hapa:
- instalimi i varësive në host;
- shkarkimi i kernelit Linux;
- konfigurimi i ndërtimit të kernelit;
- ndërtimi i kernelit;
- instalimi i binarit;
- konfigurimi i sistemit të skedave të mik;
- zgjedhja e parametrave të nisjes së kernelit;
- konfigurimi i rrjetit të mik;
- nisja e kernelit të mik.
Mendoj se nĂ«se vendosni ta bĂ«ni vetĂ« kĂ«tĂ«, ndoshta do tĂ« pĂ«rdorni njĂ« sistem tĂ« ngjashĂ«m me Ubuntu ose Debian. PĂ«rpiqesha tĂ« realizoja gjithçka tĂ« pĂ«rmendur mĂ« sipĂ«r nĂ« distribucionin tim tĂ« preferuar â Alpine, por asgjĂ« nuk funksionoi, duket se pĂ«r shkak se bĂ«rthama Linux ka njĂ« lidhje strikte me glibc pĂ«r drejtuesit nĂ« Mjedisin e PĂ«rdoruesit. Planifikoj tĂ« raportoj pĂ«r kĂ«tĂ« nĂ« upstream pasi tĂ« kuptoj pĂ«rfundimisht problemin.
Instalimi i varësive në host
Ubuntu kërkon, të paktën, paketat e mëposhtme për ndërtimin e bërthamës Linux (në rast të një instalimi të pastër):
- 'ndërtimi-të-duhur'
- 'fleks'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certifikatat'
- 'bc'
- 'linux-titujt'
Mund t'i instaloni ata me komandën e mëposhtme (me privilegje 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ë konfiguruar 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 privilegje root ose me sudo):
apt-get -y install libncurses-devShkarkimi i bërthamës
Përcaktoni një vend për shkarkimin dhe ndërtimin e mëvonshëm të bërthamës. Për këtë operacion, do t'ju nevojitet rreth 1,3 GB hapësirë në disk, kështu që sigurohuni që e keni atë.
Më pas, shkoni në dhe merrni URL-në për shkarkimin e versionit më të fundit të qëndrueshëm të bërthamës. Në momentin e shkrimit të këtij postimi, ajo është:
Shkarkoni këtë skedar 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 hyjmë në direktoren e krijuar gjatë nxjerrjes 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 me një sërë mjetesh dhe skripta për automatizimin e procesit. Për të filluar, hapni programin interaktiv të konfigurimit:
make ARCH=um menuconfig Ai do tĂ« kryejĂ« pjesĂ«risht ndĂ«rtimin dhe do t'ju japĂ« njĂ« dritare dialogu. Kur nĂ« fund tĂ« dritares tĂ« shfaqet '[Select]', do tĂ« mund tĂ« filloni konfigurimin me çelĂ«sat e HapĂ«sirĂ«s ose Enter. Navigimi nĂ« dritare Ă«shtĂ« si zakonisht me çelĂ«sat e arrow 'lart' dhe 'poshtĂ«', dhe theksimi i elementeve me 'majtas' ose 'djathtas'.TĂ« dhĂ«nat si â> tregojnĂ« se jeni nĂ« njĂ« nĂ«nmenunĂ«, hyrja e sĂ« cilĂ«s bĂ«het me çelĂ«sin Enter. Dalja Ă«shtĂ«, natyrisht, pĂ«rmes '[Exit]'â, mund tĂ« filloni konfigurimin duke pĂ«rdorur çelĂ«sat HapĂ«sirĂ« ose Enter. LĂ«vizja nĂ« dritare, si zakonisht, me çelĂ«sat e kalit âlartâ dhe âposhtĂ«â, ndĂ«rsa zgjedhja e elementeve bĂ«het me âmajtasâ ose âdjathtasâ.
Aktivizoni parametrat e mĂ«poshtĂ«m nĂ« '[', dhe sigurohuni qĂ« pranĂ« tyre tĂ« ketĂ« simbolin '[*]':[Exit]â.
Aktivizoni parametrat e mĂ«poshtĂ«m nĂ« âTĂ« dhĂ«nat si â> tregojnĂ« se jeni nĂ« njĂ« nĂ«nmenunĂ«, hyrja e sĂ« cilĂ«s bĂ«het me çelĂ«sin Enter. Dalja Ă«shtĂ«, natyrisht, pĂ«rmes '[Exit]'â dhe sigurohuni qĂ« ka njĂ« simbol â[*]â pranĂ« tyre:
Opciones specifike UML:
- Sistemi i hostit
Mbështetje për rrjetin (aktivizoni këtë për të shfaqur meny-në):
- Opcione të rrjetit:
- Rrjeti TCP/IP
Dispozitat e rrjetit UML:
- Dispoziti virtual i rrjetit
- Transporti SLiRP TĂ« gjitha, mund tĂ« dilni nga kjo dritare, duke zgjedhur njĂ« pas njĂ« â[Exit]â. Sigurohuni vetĂ«m qĂ« nĂ« fund t'ju ofrohet ruajtja e konfigurimit dhe zgjidhni â[Po]â.
Ju rekomandoj të luani me parametrat e ndërtimit të bërthamës pas leximit të këtij posti. Falë këtyre eksperimenteve, do të mund të mësoni shumë rreth funksionimit të mekanikave të nivelit të ulët të bërthamës dhe ndikimit të flagjeve të ndryshme në ndërtimin e saj.
Ndërtimi i bërthamës
Bërthama Linux është një program i madh që merret me shumë gjëra. Edhe me një konfigurim të tillë minimale në pajisje të vjetra, ndërtimi i saj mund të zgjasë mjaft. Pra, ndërtimi i bërthamës bëhet 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 thread-et e disponueshme gjatë procesit të ndërtimit. Komanda $(nproc) në fund të Ndërtimit zëvendëson daljen e komandës nproc, e cila është një pjesë e coreutils në ndërtimin standard të Ubuntu.
Pas një kohe, bërthama jonë do të ndërtohet në një skedar ekzekutues .\/linux.
Instalimi i binarëve
Pasi User Mode në Linux krijon një binar të zakonshëm, mund ta instaloni si çdo utilitar tjetër. Ja si e kam bërë unë:
mkdir -p ~\/bin
cp linux ~\/bin\/linux Po ashtu, është e rëndësishme të siguroheni që ~\/bin ndodhet në $PATH:
export PATH=$PATH:$HOME\/binKonfigurimi i sistemit të skedarëve të mysafirëve
Krijoni një direktor për sistemin e skedarëve të mysafirëve:
mkdir -p $HOME\/prefix\/uml-demo
cd $HOME\/prefix
Hyni në alpinelinux.org dhe në gjeni linkun aktual për shkarkimin e MINI ROOT FILESYSTEM. Në momentin e shkrimit të 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ë direktorinë e sistemit të skedarëve të mysafirëve dhe nxehni arkivimin:
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ë veçorive të sistemit, instalimi i paketave përmes menaxherit të apk Alpine do të jetë mjaft i vështirë. Por kjo FS do të mjaftojë për të kuptuar idenë e përgjithshme.
Ne gjithashtu do të kemi nevojë për një mjet për të parandaluar konsumimin e memories nga të bërthamor tonë.
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 e Linux-it, si në shumicën e programeve të tjera, ka argumente të linjës së komandës me të cilat mund të njiheni duke treguar çelësin --help.
VetĂ« âhelp
linux --help
User Mode Linux v5.1.16
i disponueshëm në http://user-mode-linux.sourceforge.net/
--showconfig
Printon skedarin e konfigurimit nga i cili është gjeneruar ky binar UML.
iomem=,
Konfiguron si një rajon memorie IO të quajtur .
mem=
Ky parametër kontrollon sa "memorie fizike" rezervon bërthama
për sistemin. Madhësia tregohet si një numër i ndjekur nga
një nga 'k', 'K', 'm', 'M', të cilat kanë kuptime të qarta.
Kjo nuk është e lidhur me sasinë e memories në host. Ajo mund të
jetë më shumë, dhe shuma e tepërt, nëse përdoret ndonjëherë,
do të nxirret jashtë.
Shembuj: mem=64M
--help
Printon këtë mesazh.
debug
ky flag nuk është e nevojshme për të ekzekutuar gdb mbi UML në modin skas
root=
Ky është në të vërtetë përdorur nga bërthama e përgjithshme në mënyrë krejtësisht
si në çdo bërthamë tjetër. Nëse konfiguroni një numër të pajisjeve blok,
dhe dëshironi të bootoni nga diçka tjetër përveç ubd0, do të
përdorni diçka si:
root=/dev/ubd5
--version
Printon numrin e versionit të bërthamës.
umid=
Ky përdoret për t'i dhënë një identitet unik kësaj makine UML
dhe përdoret për të emëruar skedarin e pid dhe socket-in e konsolës së menaxhimit.
con[0-9]*=
Bashkëngjitni një konsolë ose linjë serike në një kanal host. Shihni
http://user-mode-linux.sourceforge.net/old/input.html për një përshkrim të plotë
të këtij kalimi.
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 në 2.6
është i disponueshëm. AIO 2.4 është një thread që trajton një kërkesë në një
kohë, në mënyrë sinkrone. AIO 2.6 është një thread i cili përdor ndërfaqen AIO
2.6 për të trajtuar një numër arbitrar kërkesash në pritje. AIO 2.6
nuk është i disponueshëm në modin tt, mbi 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ë bërthamore në
/usr/include/linux për t'u ndërtuar një UML të aftë për AIO
nosysemu
Ăaktivizon patch-in e emulimit tĂ« syscall pĂ«r ptrace (SYSEMU).
SYSEMU është një patch për performancën i prezantuar nga Laurent Vivier. Ndryshon
sjelljen e ptrace() dhe ndihmon në reduktimin e normave të kalimit të kontekstit të hostit.
Për ta bërë të funksionojë, ju nevojitet një patch bërthame për hostin tuaj gjithashtu.
Shihni http://perso.wanadoo.fr/laurent.vivier/UML/ për informacion të mëtejshëm.
uml_dir=
Lokacioni për të vendosur skedarët pid dhe umid.
quiet
Ăaktivizon mesazhet e informacionit gjatĂ« boot-it.
hostfs=,,...
Ky përdoret për të vendosur parametrat e hostfs. Argumenti i drejtpërdrejtë
përdoret për të kufizuar të gjitha montimet hostfs brenda pemës specifike të drejtorive
në host. Nëse kjo nuk përshkruhet, atëherë një përdorues brenda UML mund
të montojë gjithçka në host që është e aksesueshme për përdoruesin që po e ekzekuton këtë.
Flag-at aktualisht të mbështetur janë 'append', e cila tregon që të gjitha
skedarët e hapur nga hostfs do të hapen në modalitetin e shtimit.
Ky dokument ndriçon parametrat kryesorë të inicializimit. Le të nisim bërthamën me grupin minimal të nevojshëm të opsioneve:
linux
root=/dev/root
rootfstype=hostfs
rootflags=$HOME/prefix/uml-demo
rw
mem=64M
init=/bin/shRreshtat lart i thonë bërthamës sonë këtë:
- Le të supozojmë se sistemi filestore është një pajisje pseudo
/dev/root. - Zgjedh si si një driver për sistemin e skedarëve rrënjësor.
- Montoni sistemin e skedarëve të mysafirëve që ne krijuam në pajisjen rrënjësore.
- Dhe po, në modin e leximit-shkrimit.
- Përdorni vetëm 64 megabajt memorie të përkohshme (mund të përdorni shumë më pak, në varësi të asaj që planifikoni të bëni, por 64 MB duket se është volumi optimal).
- Nuk përfshin automatikisht
/bin/shsiinit-procesin.
Ekzekutoni këtë komandë, dhe duhet të merrni diçka si kjo:
Një tjetër fletë
Kufijt e dump-it të bërthamës :
i butë - 0
i fortĂ« - ASNJĂ
Kërkesa që ptrace mund të ndryshojë numrat e thirrjeve në sistem... OK
Kërkesa për patch-in e simulimit të thirrjeve në sistem për ptrace... OK
Kërkesa për patch-in e avancuar të simulimit të thirrjeve në sistem për ptrace... OK
Kontrollimi i variablave të ambientit për një tempdir... asgjë e gjetur
Kontrollimi nëse /dev/shm është në tmpfs... OK
Kontrollimi i PROT_EXEC mmap në /dev/shm... OK
Shtimi i 32137216 byte në memorjen fizike për të llogaritur hapësirën 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 Di11 7 Korrik 2019, 18:57:19 UTC
Ndërtuar 1 lista zonash, grupimi i lëvizshëm. Total pages: 23898
Linja e komandës së kernelit: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Hyrjet e tabelës së hash-it të caches së dentry: 16384 (renditja: 5, 131072 byte)
Hyrjet e tabelës së hash-it të caches së inode: 8192 (renditja: 4, 65536 byte)
Memoria: 59584K/96920K në dispozicion (2692K kodi i kernelit, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K rezervuar, 0K cma-rezervuar)
SLUB: HWalign=64, Renditja=0-3, MinObjects=0, CPU=1, Nënresa=1
NR_IRQS: 15
burimi i orës: timer: maska: 0xffffffffffffffff maksimale_cycles: 0x1cd42e205, maksimale_idle_ns: 881590404426 ns
Kalibrimi i ciklit të vonesës... 7479.29 BogoMIPS (lpj=37396480)
pid_max: default: 32768 minimum: 301
Hyrjet e tabelës së hash-it të caches së 'mount': 512 (renditja: 0, 4096 byte)
Hyrjet e tabelës së hash-it të caches të pikave të 'mount': 512 (renditja: 0, 4096 byte)
Kontrollimi që ptys e host-it mbështesin daljen SIGIO... Po
Kontrollimi që ptys e host-it mbështesin SIGIO në mbyllje... Jo, duke aktivizuar rregullimin
devtmpfs: inicializuar
raster: get_random_bytes e thirrur nga setup_net+0x48/0x1e0 me crng_init=0
Duke përdorur 2.6 host AIO
burimi i orës: jiffies: maska: 0xffffffff maksimale_cycles: 0xffffffff, maksimale_idle_ns: 19112604462750000 ns
Hyrjet e tabelës së hash-it të futex-it: 256 (renditja: 0, 6144 byte)
NET: Regjistruar familja e protokolleve 16
burimi i orës: Kalimi në burimin e orës të timer
NET: Regjistruar familja e protokolleve 2
tcp_listen_portaddr_hash hyrjet e tabelës së hash-it: 256 (renditja: 0, 4096 byte)
Hyrjet e tabelës së hash-it të TCP të krijuara: 1024 (renditja: 1, 8192 byte)
Hyrjet e tabelës së hash-it të bindjes TCP: 1024 (renditja: 1, 8192 byte)
TCP: Tabelat e hash-it janë konfiguruar (e krijuar 1024 e lidhur 1024)
Hyrjet e tabelës së hash-it UDP: 256 (renditja: 1, 8192 byte)
Hyrjet e tabelës së hash-it UDP-Lite: 256 (renditja: 1, 8192 byte)
NET: Regjistruar familja e protokolleve 1
console [stderr0] e çaktivizuar
mconsole (version 2) e inicializuar në /home/cadey/.uml/tEwIjm/mconsole
Kontrollimi i mbështetjes së host-it MADV_REMOVE... OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Bloku i shtresës SCSI gjenerike (bsg) driver version 0.4 ngarkuar (major 254)
io scheduler noop e regjistruar (default)
io scheduler bfq e regjistruar
loop: module ngarkuar
NET: Regjistruar familja e protokolleve 17
Drejtuar automatikisht drejtuesin e konsolës stdio
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 1 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 2 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 3 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 4 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 5 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 6 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 7 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 8 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 9 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 10 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 11 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 12 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 13 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 14 : Konfigurimi dështoi
Duke përdorur një tip kanali që është konfiguruar jashtë UML
setup_one_line dështoi për pajisjen 15 : Konfigurimi dështoi
Konsola e inicializuar në /dev/tty0
konsola [tty0] e aktivizuar
konsola [mc-1] e aktivizuar
Dështoi të inicializojë pajisjen ubd 0 : Nuk mund të përcaktojë madhësinë e skedarit të pajisjes
VFS: Montuar rrënjën (sistemi dosjes hostfs) në pajisjen 0:11.
devtmpfs: i montuar
Kjo arkitekturë nuk ka mbrojtje të memorjes së kernelit.
Ekzekutoni /bin/sh si procesin init
/bin/sh: nuk mund të aksesosh tty; kontrolli i punëve është fikur
raster: fast init e përfunduar
/# Manipulimet e mësipërme do të na japin një sistem mysafir minimaliste, pa gjëra të tilla si /proc ose emri i hostit të caktuar. Për shembull, provoni të ekzekutoni komandat e mëposhtme:
- uname -av
- cat /proc/self/pid
- hostname
Për të dalë nga sistemi mysafir, shkruani exit ose shtypni control-d. Kjo do të shkaktojë mbylljen e shell-it me një panik kernel:
/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: â./linux root=/dev/root rootflagâŠâ terminated by signal SIGABRT (Abort) Kemi marrĂ« kĂ«tĂ« panik kernel pĂ«r shkak se bĂ«rthama e Linux-it mendon se procesi i inicializimit Ă«shtĂ« gjithmonĂ« i ekzekutuar. Pa tĂ«, sistemi nuk mund tĂ« funksionojĂ« mĂ« dhe mbyllet. Por pasi Ă«shtĂ« njĂ« proces nĂ« modin e pĂ«rdoruesit, rezultati i marrĂ« dĂ«rgon veten nĂ« SIGABRT, çka çon nĂ« dalje.
Konfigurimi i rrjetit mysafir
Por këtu fillojmë të dalim jashtë planit. Rrjeti në User Mode Linux është vendi ku koncepti i kufizuar 'modi të përdoruesit' fillon të shembet. Sepse zakonisht në nivelin sistemor rrjeti është i kufizuar në modalitete të privilegjuara për arsye të njohura për ne.
Shënim: mund të lexoni më shumë për Variantet e ndryshme të punës me rrjetin në UML .
Një udhëtim në slirp
Megjithatë, ekziston një mjet i lashtë dhe praktikisht i papërshtatur i quajtur , me ndihmën e të cilit User Mode Linux mund të ndërveprojë me rrjetin. Ai funksionon përafërsisht si një marrëveshje TCP/IP në nivelin e përdoruesit dhe nuk kërkon ndonjë leje sistemore për të funksionuar. Ky mjet u lëshua në vitin 1995, ndërsa përditësimi më i fundit daton në vitin 2006. Slirp është shumë i vjetër. Gjatë kohës pa mbështetje dhe përditësime, kompjuterët kanë ecur aq shumë përpara, saqë tani ky mjet mund të karakterizohet vetëm si .
Pra, le të instalojmë Slirp nga repozitat e Ubuntu dhe të përpiqemi ta aktivizojmë atë:
sudo apt-get install slirp
/usr/bin/slirp
Slirp v1.0.17 (BETA)
Kopje e drejtësisë (c) 1995,1996 Danny Gasparovski dhe të tjerëve.
Të gjitha të drejtat e rezervuara.
Ky program është me të drejta autori, softuer falas.
Ju lutemi lexoni skedarin COPYRIGHT që erdhi me paketën Slirp
për kushtet e përdorimit.
Adresa IP e hostit Slirp: 127.0.0.1
Adresa IP e DNS-ve tuaja: 1.1.1.1, 10.77.0.7
Adresa juaj është 10.0.2.15
(përndryshe asgjë tjetër që dëshironi)
Shkruani pesë zero (0) për të dalë.
[automatikisht zbuloni SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud]
SLiRP Gati ...
fish: "/usr/bin/slirp" u ndërpre nga sinjali SIGSEGV (Gabim kufiri adrese)Oh, Zot. Le të vendosim një debuger për Slirp dhe të shohim nëse mund të kuptojmë se çfarë po ndodh këtu:
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.Gabimi ndodh në . Le të shohim stek-tracen, ndoshta ajo do na ndihmojë:
(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 gabimi ndodh gjatë fillimit të ciklit kryesor, kur slirp përpiqet të kontrollojë kohët e skadimit. Në këtë moment, unë duhej të hiqja dorë nga përpjekjet për debug. Por le të shohim nëse Slirp, i ndërtuar nga burimet, funksionon. E shkarkova sërish arkivin direkt nga website-i , sepse të tërheqësh diçka nga aty përmes terminalit është e bezdisshme:
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 papërcaktuara të ndërtuara, që do të thotë se është e pamundur të lidhen skedarët binarë që rezultojnë. Duket se midis vitit 2006 dhe këtij momenti, gcc ka ndaluar së krijuari simbolet e përdorura në funksionet e ndërtuara të skedarëve të kompiluar ndërmjetësisht. Le të përpiqemi të zëvendësojmë fjalën kyçe inline me një koment të zbrazët dhe të shohim rezultatin:
vi slirp.h
:6
a
#define inline /**/
:wq
makeJo, kjo gjithashtu nuk funksionon. Akoma nuk mund të gjej simbolët e këtyre funksioneve.
Në këtë fazë, dorëzova dhe fillova të kërkoj në Github . Teoria ime bazohej në atë se ndonjë paketë ndërtimi Heroku do të kishte skedarët binarë që më nevojiteshin. Si rezultat, kërkimi më çoi . E shkarkova dhe e shpërtheva uml.tar.gz dhe gjeta të siguiente:
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ë skedari binar slirp! A funksionon?
.\/slirp
Slirp v1.0.17 (BETA) FULL_BOLT
Copyright (c) 1995,1996 Danny Gasparovski dhe të tjerë.
Të gjitha të drejtat janë të rezervuara.
Ky program është i mbrojtur nga të drejtat e autorit, softuer falas.
Ju lutem, 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-ve tuaj: 1.1.1.1, 10.77.0.7
Adresa juaj është 10.0.2.15
(bari diçka tjetër që dëshiron)
Shkruani pesë zero (0) për të dalë.
[autodetect SLIP\/CSLIP, MTU 1500, MRU 1500]
SLiRP Gati ...
Nuk bie â kĂ«shtu qĂ« duhet tĂ« funksionojĂ«! Le tĂ« fusim kĂ«tĂ« skedar binar nĂ« ~\/bin\/slirp:
cp slirp ~\/bin\/slirpNë rast se krijuesi i paketës e fshin atë, unë .
Konfigurimi i rrjetit
Tani le të përcaktojmë rrjetin në bërthamën tonë të mikut. :
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\/\nmount -t sysfs sys sys\/\n\nifconfig 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 krijon ndĂ«rfaqen rrjetĂ«sore pĂ«r tâu lidhur me Slirp. Komanda rrugĂ«n krijon tabelĂ«n e rrugĂ«s pĂ«r bĂ«rthamĂ«n pĂ«r tĂ« dĂ«rguar tĂ« gjithĂ« trafikun 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ën. : Sipas duket, postimi fillestar u shkrua në një desktop me kartë rrjeti me kabllorë, ose një konfigurim tjetër që nuk kërkon drejtues shtesë. Në një laptop me WiFi 8265 nga Intel, ndodhin gabime gjatë aktivizimit të 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ë lidhet me drejtuesin e kartës rrjetësore. Përpjekja për të kompaktuar firmware në bërthamë nuk e zgjidhi këtë situatë. Në momentin e publikimit, në këtë konfigurim nuk ishte gjetur asnjë zgjidhje. Në konfigurime më të thjeshta (p.sh., në Virtualbox) ndërfaqja ngrihet saktë.
Le të automatizojmë redirektimin me skenarin në vijim:
#!/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.shDhe pastaj bëjmë ndryshimet në komandën e 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 ta përsërisim:
SLiRP Gati ...
rrjeti i vendosur
\/bin\/sh: nuk mund të aksesojë tty; kontrolli i punës u ndal
nslookup google.com 8.8.8.8
Serveri: 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 me stabilitet!
Skedari Docker
Për t'ju lehtësuar gjithë këtë verifikim, kam përgatitur , i cili automatizon shumicën e hapave të përshkruar dhe duhet t'ju ofrojë një konfigurim funksional. Gjithashtu kam , që përmban gjithçka që është përmendur në postim. Por është e rëndësishme të kuptohet që këtu kam përshkruar vetëm konfigurimin minimal.
Shpresoj që ky postim t'ju ketë ndihmuar të kuptoni mënyrën e ngritjes së një bërthame mikpritëse. Doli të jetë një monster, por ky postim u mendua si një udhëzues gjithëpërfshirës mbi ndërtimin, instalimin dhe konfigurimin e Modit të Përdoruesit në Linux nën versionet moderne të sistemeve operative të kësaj familjeje. Veprimet e ardhshme duhet të përfshijnë instalimin e shërbimeve dhe softuerëve të tjerë brenda sistemit mysafir. Duke qenë se imazhet e konteinerëve Docker janë thjesht arkiva tar të eksploruara, duhet të jeni në gjendje të nxirrni imazhin përmes docker export, dhe pastaj të përcaktoni rrugën e instalimit në seksionin kryesor të sistemit të dosjeve të bërthamës mysafire. Pastaj ekzekutoni skenarin shell.
Një falënderim të veçantë për Rkeene në #lobsters në Freenode. Pa ndihmën e tij në debuggimin e Slirp, nuk do të arrija kaq larg. Nuk kam idenë se si funksionon sistemi i tij Slackware siç duhet me slirp, por sistemet e mia Ubuntu dhe Alpine nuk pranuan slirp dhe binarin Rkeene që më ofroi. Por jam e kënaqur që kam diçka që funksionon.
Burimi: habr.com
