Si si filloni të përdorni Modin e Përdoruesit në Linux

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 Cadey, kĂ«shtu qĂ« nĂ«se keni ndonjĂ« pyetje — mos hezitoni tĂ« pyesni nĂ« anglisht nĂ« komentet.

Si si filloni të përdorni Modin e Përdoruesit në Linux

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

Duke 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-dev

Shkarkimi 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ë kernel.org 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ë: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

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

Tani hyni në direktoren që u krijua gjatë shpërndarjes së tarball-it:

cd linux-5.1.16

Konfigurimi i ndërtimit të bërthamës

Sistemi i ndërtimit të bërthamës është një grup Make-fajlësh 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/bin

Konfigurimi 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ë seksionin e shkarkimeve 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.gz

Shkarkoni 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.gz

Tani hyni në drejtorinë e sistemit të files për mysafirët dhe shpërndani arkivën:

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

Veprimet 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 tini për të ndaluar konsumimin e memories nga proceset zombie të bërthamës tonë të hostit.

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

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

Rreshtat 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 hostfs 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/sh si procesiinit.

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 këtu.

Udhëtimi në slirp

Megjithatë, ekziston një mjet i vjetër dhe praktikisht i papërcaktuar i quajtur Slirp, 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 «shkalla e kodimit».

. 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ë këtë rresht. 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. Sourceforge, 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
make

Jo. 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 paket e ndërtimit të Heroku. 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 këtu. 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/slirp

Në rast se krijuesi i paketës e heq atë, unë bëra një pasqyrë.

Konfigurimi i rrjetit

Tani le të konfiguroni rrjetin në bërthamën tonë të mysafirëve. Do të azhurnojmë parametrat e nisjes:

linux 
  root=/dev/root 
  rootfstype=hostfs 
  rootflags=$HOME/prefix/uml-demo 
  rw 
  mem=64M 
  eth0=slirp,,$HOME/bin/slirp 
  init=/bin/sh

Tani 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.net

Funksionon!

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

Dhe ta shënojmë si ekzekutues:

chmod +x init.sh

Pastaj 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.net

Rrjeti funksionon stabilisht!

Dockerfile

Për t'ju lehtësuar të provoni gjithçka, unë kam mbledhur Dockerfile, e cila automatizon shumicën e hapave të përshkruar dhe duhet t'ju sigurojë një konfigurim funksional. Gjithashtu kam një konfigurim të gatshëm të bërthamës, 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

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster