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Ä.
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:
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:
Å 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.
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:
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
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 ...
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:
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:
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.