Kā sākt lietot lietotāja režīmu operētājsistēmā Linux

Ievads no tulka: Ņemot vērā dažādu konteineru masveida ienākÅ”anu mÅ«su dzÄ«vē, var bÅ«t diezgan interesanti un noderÄ«gi uzzināt, ar kādām tehnoloÄ£ijām tas kādreiz sākās. Dažas no tām var lietderÄ«gi izmantot lÄ«dz mÅ«sdienām, taču ne visi atceras Ŕādas metodes (vai zina, vai tās netika noÄ·ertas to straujās attÄ«stÄ«bas laikā). Viena no Ŕādām tehnoloÄ£ijām ir User Mode Linux. OriÄ£ināla autors daudz rakās, izdomājot, kurÅ” no vecajiem uzlabojumiem joprojām darbojas un kurÅ” ne, un salika kaut ko lÄ«dzÄ«gu soli pa solim instrukcijai, kā iegÅ«t sev homebrew UML 2k19 formātā. Un jā, mēs uzaicinājām oriÄ£inālā ieraksta autoru uz Habr Keidijs, tāpēc, ja jums ir jautājumi, jautājiet komentāros angļu valodā.

Kā sākt lietot lietotāja režīmu operētājsistēmā Linux

Lietotāja režīms operētājsistēmā Linux faktiski ir Linux kodola ports uz sevi. Å is režīms ļauj palaist pilnu Linux kodolu kā lietotāja procesu, un izstrādātāji to parasti izmanto, lai pārbaudÄ«tu draiverus. Bet Å”is režīms ir noderÄ«gs arÄ« kā vispārējs izolācijas rÄ«ks, kura darbÄ«bas princips ir lÄ«dzÄ«gs virtuālo maŔīnu darbÄ«bai. Å is režīms nodroÅ”ina lielāku izolāciju nekā Docker, bet mazāk nekā pilnvērtÄ«ga virtuālā maŔīna, piemēram, KVM vai Virtual Box.

Kopumā lietotāja režīms var Ŕķist dÄ«vains un grÅ«ti lietojams rÄ«ks, taču tam joprojām ir savs lietojums. Galu galā Å”is ir pilnvērtÄ«gs Linux kodols, kas darbojas no nepievilcÄ«ga lietotāja. Å Ä« funkcija ļauj palaist potenciāli neuzticamu kodu, neapdraudot saimniekdatoru. Un tā kā Å”is ir pilnvērtÄ«gs kodols, tā procesi ir izolēti no resursdatora maŔīnas, tas ir procesi, kas darbojas lietotāja režīmā, resursdatoram nebÅ«s redzami. Tas nav kā parastais Docker konteiners, un tādā gadÄ«jumā saimniekdators vienmēr redz procesus repozitorijā. 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 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 resursdatora to procesu nosaukumus, kas darbojas viesos. Izmantojot Linux lietotāja režīmu, tas nav iespējams. Ko tas nozÄ«mē? Tas nozÄ«mē, ka uzraudzÄ«bas rÄ«ki, kas darbojas caur Linux audita apakÅ”sistēmu neredzu procesi, kas darbojas viesu sistēmā. Bet dažās situācijās Ŕī funkcija var kļūt par abpusēji griezÄ«gu zobenu.

Kopumā viss zemāk esoÅ”ais ieraksts ir pētÄ«jumu un aptuvenu mēģinājumu apkopojums, lai sasniegtu vēlamo rezultātu. Lai to izdarÄ«tu, man bija jāizmanto dažādi senie rÄ«ki, jālasa kodola avoti, jāveic intensÄ«va koda atkļūdoÅ”ana, kas tika rakstÄ«ta tajās dienās, kad es vēl mācÄ«jos pamatskolā, kā arÄ« jāmācās ar Heroku bÅ«vēm, izmantojot Ä«paÅ”u bināro failu, lai atrastu nepiecieÅ”amos rÄ«kus. . Viss Å”is darbs ir novedis pie tā, ka puiÅ”i no mana IRC mani sauc par maÄ£iju. Es ceru, ka Ŕī ziņa kalpos kā uzticama dokumentācija, lai kāds varētu izmēģināt to paÅ”u ar jaunākiem kodoliem un OS versijām.

koriģēŔana

Linux lietotāja režīma iestatīŔana ietver vairākas darbības:

  • atkarÄ«bu instalÄ“Å”ana no resursdatora;
  • Linux kodola lejupielāde;
  • kodola uzbÅ«ves konfigurācija;
  • kodola montāža;
  • binārā instalācija;
  • viesu failu sistēmas konfigurÄ“Å”ana;
  • kodola palaiÅ”anas parametru izvēle;
  • viesu tÄ«kla izveide;
  • viesa kodola palaiÅ”ana.

Es pieņemu, ka, ja jÅ«s nolemjat to izdarÄ«t pats, jÅ«s, visticamāk, darÄ«sit visu, kas aprakstÄ«ts kādā Ubuntu vai Debian lÄ«dzÄ«gā sistēmā. Mēģināju visu iepriekÅ”minēto ieviest savā iecienÄ«tākajā distribÅ«cijā - Alpine, bet nekas nesanāca, acÄ«mredzot tāpēc, ka Linux kodolam ir grÅ«ti saistoÅ”s glibc-isms draiveriem User Mode. Es plānoju ziņot par to augÅ”pus, kad beidzot sapratÄ«Å”u problēmu.

Atkarību instalēŔana no resursdatora

Lai izveidotu Linux kodolu (pieņemot tÄ«ru instalÄ“Å”anu), Ubuntu ir nepiecieÅ”amas vismaz Ŕādas pakotnes:

- 'build-essential'
- 'flex'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certificates'
- 'bc'
- 'linux-headers'

Varat tos instalēt ar Ŕādu komandu (kā root vai ar sudo):

apt-get -y install build-essential flex bison xz-utils wget ca-certificates bc 
                   linux-headers-$(uname -r)

Ņemiet vērā, ka, lai palaistu Linux kodola izvēlnes iestatÄ«Å”anas programmu, bÅ«s jāinstalē libncurses-dev. LÅ«dzu, pārliecinieties, vai tā ir instalēta ar Ŕādu komandu (kā root vai ar sudo):

apt-get -y install libncurses-dev

Kodola lejupielāde

Izlemiet, kur lejupielādēt, un pēc tam izveidojiet kodolu. Lai veiktu Å”o darbÄ«bu, jums bÅ«s jāpieŔķir aptuveni 1,3 GB vietas cietajā diskā, tāpēc pārliecinieties, ka jums tā ir.

Pēc tam dodieties uz kernel.org un iegÅ«stiet URL, lai lejupielādētu jaunāko stabilo kodola versiju. Å Ä«s ziņas rakstÄ«Å”anas laikā: 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 izvelciet to ar 'tar':

tar xJf linux-5.1.16.tar.xz

Tagad mēs ievadām direktoriju, kas izveidots, izpakojot tarbolu:

cd linux-5.1.16

Kodola versijas iestatīŔana

Kodola veidoÅ”anas sistēma ir komplekts Makefaili с daudzi pielāgotus rÄ«kus un skriptus, lai automatizētu procesu. Vispirms atveriet interaktÄ«vo iestatÄ«Å”anas programmu:

make ARCH=um menuconfig

Tas daļēji izveidos un parādÄ«s jums dialoglodziņu. Kad '[Select]', jÅ«s varēsiet konfigurēt, izmantojot taustiņu Space vai Enter. Pārvietojieties pa logu, kā parasti, ar tastatÅ«ras bultiņām "uz augÅ”u" un "uz leju" un atlasiet elementus - "pa kreisi" vai "pa labi".

Skata rādÄ«tājs ā€”> nozÄ«mē, ka atrodaties apakÅ”izvēlnē, kurai var piekļūt, izmantojot taustiņu Enter. AcÄ«mredzot izeja no tā ir caur "[Exit]".

Iekļaujiet tālāk norādÄ«tās opcijas[Select]un pārliecinieties, vai tiem blakus ir ā€œ[*]ā€:

UML-specific Options:
  - Host filesystem
Networking support (enable this to get the submenu to show up):
  - Networking options:
    - TCP/IP Networking
UML Network devices:
  - Virtual network device
  - SLiRP transport

Tas arī viss, jūs varat iziet no Ŕī loga, secīgi atlasot '[Exit]'. VienkārŔi pārliecinieties, vai beigās tiek piedāvāts saglabāt konfigurāciju un atlasiet '[Yes]".

Pēc Ŕīs ziņas izlasÄ«Å”anas iesaku paspēlēties ar kodola veidoÅ”anas opcijām. Izmantojot Å”os eksperimentus, jÅ«s varat daudz uzzināt, lai izprastu zema lÄ«meņa kodola mehānikas darbu un dažādu karogu ietekmi uz tā montāžu.

Kodola veidoŔana

Linux kodols ir liela programma, kas veic daudzas lietas. Pat ar tik minimālu vecās aparatÅ«ras konfigurāciju, tā izveide var aizņemt diezgan ilgu laiku. Tāpēc izveidojiet kodolu ar Ŕādu komandu:

make ARCH=um -j$(nproc)

Par ko? Šī komanda liks mūsu veidotājam izmantot visus pieejamos CPU kodolus un pavedienus veidoŔanas procesā. Komanda $(nproc) Build beigās aizstāj komandas izvadi nproc, kas ir daļa no coreutils standarta Ubuntu būvniecībā.

Pēc kāda laika mūsu kodols tiks apkopots izpildāmā failā ./linux.

Binārā faila instalÄ“Å”ana

Tā kā lietotāja režīms operētājsistēmā Linux izveido parastu bināro failu, varat to instalēt tāpat kā jebkuru citu utilītu. Lūk, kā es to izdarīju:

mkdir -p ~/bin
cp linux ~/bin/linux

Par to arī ir vērts pārliecināties ~/bin ir tavā $PATH:

export PATH=$PATH:$HOME/bin

Viesu failu sistēmas iestatÄ«Å”ana

Izveidojiet direktoriju viesu failu sistēmai:

mkdir -p $HOME/prefix/uml-demo
cd $HOME/prefix

Atveriet alpinelinux.org un tajā lejupielādes sadaļa atrodiet paÅ”reizējo lejupielādes saiti MINI ROOT FILESYSTEM. RakstÄ«Å”anas laikā 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 tarbolu, 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 ievadiet viesu failu sistēmas direktoriju un izpakojiet arhīvu:

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

AprakstÄ«tās darbÄ«bas izveidos nelielu failu sistēmas veidni. Sistēmas rakstura dēļ pakotnes, izmantojot Alpine apk pārvaldnieku, bÅ«s ārkārtÄ«gi grÅ«ti instalēt. Bet ar Å”o FS pietiks, lai izvērtētu kopējo ideju.

Mums ir vajadzīgs arī instruments Tini lai ierobežotu atmiņas patēriņu zombiju procesi mūsu viesu kodols.

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

Kodola komandrindas izveide

Linux kodolam, tāpat kā lielākajai daļai citu programmu, ir komandrindas argumenti, kuriem var piekļūt, norādot atslēgu --help.

Pats ā€” palÄ«dzi

linux --help
User Mode Linux v5.1.16
        available at http://user-mode-linux.sourceforge.net/

--showconfig
    Prints the config file that this UML binary was generated from.

iomem=<name>,<file>
    Configure <file> as an IO memory region named <name>.

mem=<Amount of desired ram>
    This controls how much "physical" memory the kernel allocates
    for the system. The size is specified as a number followed by
    one of 'k', 'K', 'm', 'M', which have the obvious meanings.
    This is not related to the amount of memory in the host.  It can
    be more, and the excess, if it's ever used, will just be swapped out.
        Example: mem=64M

--help
    Prints this message.

debug
    this flag is not needed to run gdb on UML in skas mode

root=<file containing the root fs>
    This is actually used by the generic kernel in exactly the same
    way as in any other kernel. If you configure a number of block
    devices and want to boot off something other than ubd0, you
    would use something like:
        root=/dev/ubd5

--version
    Prints the version number of the kernel.

umid=<name>
    This is used to assign a unique identity to this UML machine and
    is used for naming the pid file and management console socket.

con[0-9]*=<channel description>
    Attach a console or serial line to a host channel.  See
    http://user-mode-linux.sourceforge.net/old/input.html for a complete
    description of this switch.

eth[0-9]+=<transport>,<options>
    Configure a network device.
    
aio=2.4
    This is used to force UML to use 2.4-style AIO even when 2.6 AIO is
    available.  2.4 AIO is a single thread that handles one request at a
    time, synchronously.  2.6 AIO is a thread which uses the 2.6 AIO
    interface to handle an arbitrary number of pending requests.  2.6 AIO
    is not available in tt mode, on 2.4 hosts, or when UML is built with
    /usr/include/linux/aio_abi.h not available.  Many distributions don't
    include aio_abi.h, so you will need to copy it from a kernel tree to
    your /usr/include/linux in order to build an AIO-capable UML

nosysemu
    Turns off syscall emulation patch for ptrace (SYSEMU).
    SYSEMU is a performance-patch introduced by Laurent Vivier. It changes
    behaviour of ptrace() and helps reduce host context switch rates.
    To make it work, you need a kernel patch for your host, too.
    See http://perso.wanadoo.fr/laurent.vivier/UML/ for further
    information.

uml_dir=<directory>
    The location to place the pid and umid files.

quiet
    Turns off information messages during boot.

hostfs=<root dir>,<flags>,...
    This is used to set hostfs parameters.  The root directory argument
    is used to confine all hostfs mounts to within the specified directory
    tree on the host.  If this isn't specified, then a user inside UML can
    mount anything on the host that's accessible to the user that's running
    it.
    The only flag currently supported is 'append', which specifies that all
    files opened by hostfs will be opened in append mode.

Šajā panelī ir izcelti galvenie palaiŔanas parametri. Palaidīsim kodolu ar minimālo nepiecieŔamo opciju kopu:

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ņemsim, ka saknes failu sistēma ir pseido ierÄ«ce /dev/root.
  • Izvēlieties hostfs kā saknes failu sistēmas draiveris.
  • Pievienojiet mÅ«su izveidoto viesu failu sistēmu saknes ierÄ«cē.
  • Un jā, lasÄ«Å”anas-rakstÄ«Å”anas režīmā.
  • Izmantojiet tikai 64 MB RAM (var izmantot daudz mazāk atkarÄ«bā no tā, ko plānojat darÄ«t, bet 64 MB Ŕķiet optimālais daudzums).
  • Kodols tiek startēts automātiski /bin/sh kā init- process.

Palaidiet Å”o komandu, un jums vajadzētu iegÅ«t kaut ko lÄ«dzÄ«gu Å”im:

Vēl viena lapa

Core dump limits :
        soft - 0
        hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking environment variables for a tempdir...none found
Checking if /dev/shm is on tmpfs...OK
Checking PROT_EXEC mmap in /dev/shm...OK
Adding 32137216 bytes to physical memory to account for exec-shield gap
Linux version 5.1.16 (cadey@kahless) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 Sun Jul 7 18:57:19 UTC 2019
Built 1 zonelists, mobility grouping on.  Total pages: 23898
Kernel command line: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh
Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)
Inode-cache hash table entries: 8192 (order: 4, 65536 bytes)
Memory: 59584K/96920K available (2692K kernel code, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K reserved, 0K cma-reserved)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS: 15
clocksource: timer: mask: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns
Calibrating delay loop... 7479.29 BogoMIPS (lpj=37396480)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes)
Checking that host ptys support output SIGIO...Yes
Checking that host ptys support SIGIO on close...No, enabling workaround
devtmpfs: initialized
random: get_random_bytes called from setup_net+0x48/0x1e0 with crng_init=0
Using 2.6 host AIO
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 256 (order: 0, 6144 bytes)
NET: Registered protocol family 16
clocksource: Switched to clocksource timer
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
console [stderr0] disabled
mconsole (version 2) initialized on /home/cadey/.uml/tEwIjm/mconsole
Checking host MADV_REMOVE support...OK
workingset: timestamp_bits=62 max_order=14 bucket_order=0
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
io scheduler noop registered (default)
io scheduler bfq registered
loop: module loaded
NET: Registered protocol family 17
Initialized stdio console driver
Using a channel type which is configured out of UML
setup_one_line failed for device 1 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 2 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 3 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 4 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 5 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 6 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 7 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 8 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 9 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 10 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 11 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 12 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 13 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 14 : Configuration failed
Using a channel type which is configured out of UML
setup_one_line failed for device 15 : Configuration failed
Console initialized on /dev/tty0
console [tty0] enabled
console [mc-1] enabled
Failed to initialize ubd device 0 :Couldn't determine size of device's file
VFS: Mounted root (hostfs filesystem) on device 0:11.
devtmpfs: mounted
This architecture does not have kernel memory protection.
Run /bin/sh as init process
/bin/sh: can't access tty; job control turned off
random: fast init done
/ # 

IepriekÅ” minētās manipulācijas mums dos viesu sistēma vismaz, bez tādām lietām kā /proc vai pieŔķirto resursdatora nosaukumu. Piemēram, izmēģiniet Ŕādas komandas:

- uname -av
- cat /proc/self/pid
- hostname

Lai izietu no viesu sistēmas, ievadiet exit vai nospiediet Control-d. Tas nogalinās apvalku, kam sekos kodola panika:

/ # 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, jo Linux kodols uzskata, ka inicializācijas process vienmēr darbojas. Bez tā sistēma vairs nevar darboties un avarē. Bet, tā kā Å”is ir lietotāja režīma process, iegÅ«tā izvade tiek nosÅ«tÄ«ta uz SIGABRT, kas rada izvadi.

Viesu tīkla iestatīŔana

Un Å”eit lietas sāk iet greizi. TÄ«kloÅ”ana lietotāja režīmā Linux ir vieta, kur visa ierobežotā "lietotāja režīma" koncepcija sāk izjukt. Galu galā parasti sistēmas lÄ«menÄ« tÄ«kls ir ierobežots priviliģēts izpildes režīmi mums visiem saprotamu iemeslu dēļ.

PiezÄ«me per.: JÅ«s varat lasÄ«t vairāk par dažādām iespējām darbam ar tÄ«klu UML Å”eit.

Ceļojums uz Slirp

Tomēr ir sens un gandrÄ«z neatbalstÄ«ts rÄ«ks, ko sauc Slirp, ar kuru lietotāja režīms Linux var mijiedarboties ar tÄ«klu. Tas darbojas aptuveni kā lietotāja lÄ«meņa TCP/IP steks, un tā darbÄ«bai nav nepiecieÅ”amas sistēmas atļaujas. Å is rÄ«ks bija izlaists 1995. gadā, un jaunākais atjauninājums ir datēts 2006 gads. Slirp ir ļoti vecs. Laikā bez atbalsta un atjauninājumiem kompilatori ir nonākuÅ”i tik tālu, ka tagad Å”o rÄ«ku var raksturot tikai kā "koda puve".

Tātad, lejupielādēsim Slirp no Ubuntu krātuvēm un mēģināsim to palaist:

sudo apt-get install slirp
/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 ...
fish: ā€œ/usr/bin/slirpā€ terminated by signal SIGSEGV (Address boundary error)

Ak dievi. Instalēsim Slirp atkļūdotāju un pārbaudÄ«sim, vai mēs varam noskaidrot, 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 <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
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 mÅ«sos pārspēj Ŕī lÄ«nija. ApskatÄ«sim stacktrace, varbÅ«t kaut kas mums palÄ«dzēs:

(gdb) bt full
#0  ip_slowtimo () at ip_input.c:457
        fp = 0x55784a40
#1  0x000055555556a57c in main_loop () at ./main.c:980
        so = <optimized out>
        so_next = <optimized out>
        timeout = {tv_sec = 0, tv_usec = 0}
        ret = 0
        nfds = 0
        ttyp = <optimized out>
        ttyp2 = <optimized out>
        best_time = <optimized out>
        tmp_time = <optimized out>
#2  0x000055555555b116 in main (argc=1, argv=0x7fffffffdc58) at ./main.c:95
No locals.

Å eit redzams, ka avārija notiek galvenās cilpas sākuma laikā, kad slirp mēģina pārbaudÄ«t taimautus. Å ajā brÄ«dÄ« man bija jāatsakās no mēģinājuma atkļūdot. Bet paskatÄ«simies, vai Slirp builded from sorts strādā. Es atkārtoti lejupielādēju arhÄ«vu tieÅ”i no vietnes Sourceforge, jo vilkt kaut ko no turienes caur komandrindu 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 nedefinētām iebÅ«vētām funkcijām, tas ir, par nespēju saistÄ«t iegÅ«to bināro failu. Å Ä·iet, ka laika posmā no 2006. gada lÄ«dz Å”im brÄ«dim gcc pārtrauca veidot simbolus, kas tiek izmantoti starpposma kompilēto failu iebÅ«vētajās funkcijās. Mēģināsim aizstāt atslēgvārdu inline uz tukÅ”u komentāru un apskatiet rezultātu:

vi slirp.h
:6
a
<enter>
#define inline /**/
<escape>
:wq
make

Nē. Tas arÄ« nedarbojas. Joprojām nevar atrast simbolus Ŕīm funkcijām.

Å ajā brÄ«dÄ« es padevos un sāku meklēt Github Heroku bÅ«vniecÄ«bas pakotnes. Mana teorija bija tāda, ka kādā Heroku bÅ«vÄ“Å”anas pakotnē bÅ«tu man nepiecieÅ”amie binārie faili. Beigās mani meklējumi noveda Å”eit. Es lejupielādēju un izpakoju uml.tar.gz un atrada sekojoÅ”o:

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*

Tas ir slirp binārs! Vai viņŔ strādā?

./slirp
Slirp v1.0.17 (BETA) FULL_BOLT

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]

SLiRP Ready ...

NekrÄ«t - tātad vajadzētu strādāt! StādÄ«sim Å”o bināru ~/bin/slirp:

cp slirp ~/bin/slirp

Ja pakotnes veidotājs to noņem, es uztaisīja spoguli.

Tīkla iestatīŔana

Tagad konfigurēsim tÄ«klu mÅ«su viesu kodolā. 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 ieslēdzam tīklu:

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

Pirmās divas konfigurācijas komandas /proc Šø /sys nepiecieÅ”ams darbam ifconfig, kas iestata tÄ«kla saskarni saziņai ar Slirp. Komanda route iestata kodola marÅ”rutÄ“Å”anas tabulu, lai piespiestu visu trafiku nosÅ«tÄ«t caur Slirp tuneli. PārbaudÄ«sim to ar DNS vaicājumu:

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:4006:81b::200e lga25s63-in-x0e.1e100.net

Tas darbojas!

PiezÄ«me par .: AcÄ«mredzot sākotnējā ziņa tika rakstÄ«ta uz darbvirsmas ar vadu tÄ«kla karti vai kādu citu konfigurāciju, kurai nebija nepiecieÅ”ami papildu draiveri. Klēpjdatorā ar WiFi 8265 no Intel, paaugstinot 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 kodols nevar sazināties ar tÄ«kla kartes draiveri. Mēģinājums apkopot programmaparatÅ«ru kodolā, diemžēl, situāciju neatrisināja. PublicÄ“Å”anas brÄ«dÄ« Å”ajā konfigurācijā risinājumu atrast nebija iespējams. VienkārŔākās konfigurācijās (piemēram, Virtualbox) interfeiss paceļas pareizi.

Automatizēsim novirzÄ«Å”anu ar Ŕādu čaulas 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ējiet to kā izpildāmu:

chmod +x init.sh

Un tad mēs veiksim izmaiņas kodola 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 Ready ...
networking set up
/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 ir stabils!

docker fails

Lai jums bÅ«tu vieglāk to visu pārbaudÄ«t, esmu apkopojis Dockerfile, kas automatizē lielāko daļu aprakstÄ«to darbÄ«bu un nodroÅ”ina funkcionējoÅ”u konfigurāciju. man arÄ« ir gatava kodola konfigurācija, kurā ir viss, kas ir aprakstÄ«ts ierakstā. Bet ir svarÄ«gi saprast, ka Å”eit esmu izklāstÄ«jis tikai minimālo iestatÄ«jumu.

Es ceru, ka Ŕī ziņa palÄ«dzēja jums saprast, kā izveidot viesu kodolu. Tas izrādÄ«jās sava veida briesmonis, taču publikācija bija paredzēta kā visaptveroÅ”s ceļvedis par lietotāja režīma montāžu, instalÄ“Å”anu un konfigurÄ“Å”anu operētājsistēmā Linux mÅ«sdienu Ŕīs saimes operētājsistēmu versijās. Turpmākajās darbÄ«bās jāietver pakalpojumu un citas programmatÅ«ras instalÄ“Å”ana jau viesu sistēmā. Tā kā Docker konteinera attēli ir tikai reklamēti tarboli, jums vajadzētu bÅ«t iespējai iegÅ«t attēlu, izmantojot docker export, un pēc tam nosakiet ceļu, lai to instalētu viesu kodola failu sistēmas saknē. Tad palaidiet čaulas skriptu.

ÄŖpaÅ”s paldies Rkeene no #lobsters vietnē 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 pareizi darbojas ar slirp, bet manas Ubuntu un Alpine sistēmas nepieņēma slirp, un binārais Rkeene man ieteica. Bet man pietiek ar to, ka vismaz kaut kas man der.

Avots: www.habr.com

Pievieno komentāru