Чӣ тавр истифода бурдани Ҳолати корбарро дар Linux оғоз кардан мумкин аст

Муқаддима аз тарҷумон: Дар пасманзари воридшавии оммавии контейнерҳои гуногун ба ҳаёти мо, фаҳмидани он, ки ҳамааш як маротиба бо кадом технологияҳо оғоз шудааст, хеле ҷолиб ва муфид буда метавонад. Баъзеи онҳоро метавон ба таври муфид то имрӯз истифода бурд, аммо на ҳама чунин усулҳоро дар хотир доранд (ё медонад, ки оё онҳо ҳангоми рушди босуръати худ дастгир нашудаанд). Яке аз чунин технологияҳо User Mode Linux мебошад. Муаллифи нусхаи аслӣ бисёр кофтуков кард, муайян кард, ки кадоме аз таҳаввулоти кӯҳна то ҳол кор мекунад ва кадомаш кор намекунад ва чизеро ба мисли дастури қадам ба қадам дар бораи чӣ гуна ба даст овардани UML-и хонагӣ дар 2k19 ҷамъ овардааст. Ва ҳа, мо муаллифи паёми аслиро ба Ҳабр даъват кардем Кадей, Пас, агар шумо ягон савол дошта бошед - дар шарҳҳо ба забони англисӣ пурсед.

Чӣ тавр истифода бурдани Ҳолати корбарро дар Linux оғоз кардан мумкин аст

Ҳолати корбар дар Linux, воқеан, бандари ядрои Linux барои худ аст. Ин режим ба шумо имкон медиҳад, ки ядрои пурраи Linuxро ҳамчун раванди корбар иҷро кунед ва маъмулан аз ҷониби таҳиягарон барои санҷиши драйверҳо истифода мешавад. Аммо ин режим ҳамчун воситаи умумии ҷудокунӣ низ муфид аст, ки принсипи он ба кори мошинҳои виртуалӣ монанд аст. Ин режим нисбат ба Docker ҷудокунии бештарро таъмин мекунад, аммо камтар аз як мошини мукаммали виртуалӣ ба монанди KVM ё Virtual Box.

Умуман, Ҳолати корбар метавонад як воситаи аҷиб ва душвор барои истифода ба назар расад, аммо он ҳанӯз ҳам истифода дорад. Дар ниҳоят, ин як ядрои мукаммали Linux аст, ки аз корбари беимтиёз кор мекунад. Ин хусусият имкон медиҳад, ки рамзи эҳтимолан эътимоднок бидуни ягон таҳдид ба мошини мизбон кор кунад. Ва азбаски ин як ядрои мукаммал аст, равандҳои он аз мошини мизбон ҷудо карда шудаанд, яъне равандҳое, ки дар дохили Режими корбар иҷро мешаванд, ба мизбон намоён нахоҳанд шуд. Ин ба контейнери муқаррарии Docker монанд нест, дар ин ҳолат мошини мизбон ҳамеша равандҳои дохили анборро мебинад. Ба ин порчаи pstree аз яке аз серверҳои ман нигаред:

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}]

Ва инро бо pstree ядрои Linux дар режими корбар муқоиса кунед:

linux─┬─5*[linux]
      └─slirp

Ҳангоми кор бо контейнерҳои Docker, ман метавонам аз мизбон номҳои равандҳоеро, ки дар меҳмон иҷро мешаванд, бубинам. Бо режими корбари Linux, ин имконнопазир аст. Ин чӣ маъно дорад? Ин маънои онро дорад, ки воситаҳои мониторинг, ки тавассути зерсистемаи аудити Linux кор мекунанд намебинам равандҳое, ки дар системаи меҳмонон кор мекунанд. Аммо дар баъзе ҳолатҳо, ин хусусият метавонад шамшери дудама гардад.

Умуман, тамоми мақолаи дар поён овардашуда маҷмӯи тадқиқот ва кӯшишҳои ноҳамвор барои ба даст овардани натиҷаи дилхоҳ аст. Барои ин ба ман лозим омад, ки абзорҳои гуногуни қадимиро истифода барам, манбаъҳои ядроро хонам, ислоҳи пуршиддати коди дар айёми дар мактаби ибтидоӣ навишташударо анҷом диҳам ва инчунин бо сохтани Ҳероку бо истифода аз бинарии махсус барои пайдо кардани абзорҳои лозимӣ кор кунам. . Ҳамаи ин корҳо бачаҳоро дар IRC-и худ водор карданд, ки маро ҷодугарӣ номиданд. Ман умедворам, ки ин паём ҳамчун ҳуҷҷати боэътимод барои касе хидмат мекунад, ки бо ядроҳои навтар ва версияҳои OS ҳамон чизро санҷад.

танзим

Танзими Ҳолати корбарии Linux дар якчанд марҳила анҷом дода мешавад:

  • насб кардани вобастагӣ аз ҳост;
  • зеркашии ядрои Linux;
  • конфигуратсияи сохтани ядро;
  • маҷмӯи ядро;
  • насби бинарӣ;
  • конфигуратсияи системаи файлии меҳмонон;
  • интихоби параметрҳои оғози ядро;
  • ташкили шабакаи меҳмонон;
  • ядрои меҳмонро оғоз мекунад.

Ман гумон мекунам, ки агар шумо қарор диҳед, ки ин корро худатон анҷом диҳед, шумо эҳтимолан ҳама чизеро, ки дар баъзе системаҳои ба монанди Ubuntu ё Debian тавсиф шудаанд, иҷро хоҳед кард. Ман кӯшиш кардам, ки ҳамаи гуфтаҳои дар боло зикршударо дар тақсимоти дӯстдоштаи худ - Alpine амалӣ кунам, аммо аз он чизе ба даст наомад, зоҳиран аз он сабаб, ки ядрои Linux дорои glibc-isms барои драйверҳо дар режими корбар аст. Ман нақша дорам, ки пас аз он ки ниҳоят мушкилотро дарк кунам, дар ин бора ба болооб хабар диҳам.

Насб кардани вобастагӣ аз ҳост

Ubuntu барои сохтани ядрои Linux ҳадди аққал бастаҳои зеринро талаб мекунад (бо назардошти насби тоза):

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

Шумо метавонед онҳоро бо фармони зерин насб кунед (ҳамчун root ё бо sudo):

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

Дар хотир доред, ки иҷро кардани барномаи менюи ядрои Linux насби онро талаб мекунад libncurses-dev. Лутфан боварӣ ҳосил кунед, ки он бо фармони зерин насб шудааст (ҳамчун root ё бо sudo):

apt-get -y install libncurses-dev

Зеркашии ядро ​​​​

Муайян кунед, ки дар куҷо зеркашӣ кунед ва сипас ядроро созед. Барои ин амалиёт ба шумо лозим меояд, ки тақрибан 1,3 ГБ фазои диски сахт ҷудо кунед, аз ин рӯ боварӣ ҳосил кунед, ки онро доред.

Пас аз рафтан ба kernel.org ва URL-ро барои зеркашии охирин ядрои устувор гиред. Дар замони навиштан ин аст: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Бо истифода аз ин файл зеркашӣ кунед 'wget':

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Ва онро бо 'tar':

tar xJf linux-5.1.16.tar.xz

Акнун мо ба директорияе ворид мешавем, ки ҳангоми кушодани tarball сохта шудааст:

cd linux-5.1.16

Танзимоти сохтани ядро

Системаи сохтани ядро ​​маҷмӯи аст Makefiles с бисьёр асбобҳо ва скриптҳои фармоишӣ барои автоматикунонии раванд. Аввалан, барномаи танзимоти интерактивиро кушоед:

make ARCH=um menuconfig

Он барои шумо қуттии муколамаро қисман сохта ва намоиш медиҳад. Кай '[Select]', шумо метавонед бо истифода аз тугмаҳои Фосила ё Enter танзим кунед. Дар равзанаи маъмулӣ, бо тирҳои клавиатура "боло" ва "поён" ҳаракат кунед ва унсурҳоро интихоб кунед - "чап" ё "рост".

Нишондиҳандаи намоиш —> маънои онро дорад, ки шумо дар зерменю қарор доред, ки бо тугмаи Enter дастрас аст. Роҳи раҳоӣ аз он бешубҳа тавассути '[Exit]'.

Вариантҳои зеринро дар ' дохил кунед[Select]' ва боварӣ ҳосил кунед, ки онҳо дар паҳлӯи онҳо аломати '[*]' доранд:

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

Ин аст, шумо метавонед аз ин равзана бо интихоби пай дар пай '[Exit]'. Танҳо боварӣ ҳосил кунед, ки дар охир аз шумо хоҳиш карда мешавад, ки конфигуратсияро захира кунед ва '-ро интихоб кунед.[Yes]'.

Ман тавсия медиҳам, ки пас аз хондани ин мақола бо имконоти сохтани ядро ​​​​бозӣ кунед. Тавассути ин тачрибахо дар бобати фахмидани кори механикони ядрои дарачаи паст ва таъсири байракхои гуногун ба васлкунии он бисьёр чизхоро омухтан мумкин аст.

Сохтани ядро

Ядрои Linux як барномаи бузургест, ки корҳои зиёдеро иҷро мекунад. Ҳатто бо чунин конфигуратсияи ҳадди ақал дар сахтафзори кӯҳна, сохтани он метавонад вақти зиёдеро талаб кунад. Пас, ядроро бо фармони зерин созед:

make ARCH=um -j$(nproc)

Барои чӣ? Ин фармон ба меъмори мо мегӯяд, ки дар раванди сохтмон ҳамаи ядроҳо ва риштаҳои мавҷудаи CPU-ро истифода барад. Дастаи $(nproc) дар охири Сохта баромади фармонро иваз мекунад nproc, ки як қисми coreutils дар сохтмони стандартии Ubuntu.

Пас аз чанд вақт, ядрои мо ба файли иҷрошаванда тартиб дода мешавад ./linux.

Насб кардани бинар

Азбаски Ҳолати корбар дар Linux як дуии муқаррариро эҷод мекунад, шумо метавонед онро мисли ҳама гуна утилитаҳои дигар насб кунед. Ин аст, ки чӣ тавр ман инро кардам:

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

Инчунин боварӣ ҳосил кардан лозим аст, ки ~/bin дар шумост $PATH:

export PATH=$PATH:$HOME/bin

Танзими системаи файлии меҳмонон

Барои системаи файлии меҳмон феҳрист эҷод кунед:

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

alpinelinux.org ва дарро кушоед фасли зеркашӣ пайванди воқеии зеркашӣ пайдо кунед MINI ROOT FILESYSTEM. Дар замони навиштан ин чунин буд:

http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gz

Ин тарболро бо истифода аз 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

Акнун феҳристи системаи файлии меҳмонро ворид кунед ва архивро хориҷ кунед:

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

Амалҳои тавсифшуда як қолаби хурди системаи файлиро эҷод мекунанд. Аз сабаби хусусияти система насб кардани бастаҳо тавассути менеҷери apk Alpine ниҳоят душвор хоҳад буд. Аммо ин ФС барои баҳодиҳии ақидаи умумӣ кофӣ хоҳад буд.

Ба мо низ асбоб лозим аст тини барои маҳдуд кардани истеъмоли хотира равандҳои зомби ядрои мехмони мо.

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

Эҷоди хати фармони ядро

Ядрои Linux, ба монанди аксари барномаҳои дигар, дорои далелҳои сатри фармон мебошад, ки онҳоро тавассути муайян кардани калид дастрас кардан мумкин аст. --help.

Худ — ёрй

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.

Ин панел параметрҳои асосии оғозро таъкид мекунад. Биёед ядроро бо маҷмӯи ҳадди ақали интихобҳо иҷро кунем:

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

Сатрҳои дар боло овардашуда ядрои моро мегӯянд:

  • Фарз мекунем, ки системаи файлии реша як дастгоҳи псевдо аст /dev/root.
  • Интихоб кунед hostfs ҳамчун драйвери системаи файлии реша.
  • Системаи файлии меҳмонро, ки мо дар дастгоҳи решавӣ сохтаем, насб кунед.
  • Ва ҳа, дар ҳолати хондан-навиштан.
  • Танҳо 64 МБ хотираи оперативиро истифода баред (вобаста ба он, ки чӣ кор кардан мехоҳед, шумо метавонед хеле камтар истифода баред, аммо 64 МБ маблағи оптималӣ ба назар мерасад).
  • Ядро ба таври худкор оғоз меёбад /bin/sh чи тавр init-раванд.

Ин фармонро иҷро кунед ва шумо бояд чизе монанди зеринро ба даст оред:

Боз як варақ

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

Манипуляцияҳои дар боло овардашуда ба мо хоҳанд дод системаи меҳмон ҳадди ақал, бе чизҳои монанди /proc ё номи мизбони таъиншуда. Масалан, фармонҳои зеринро санҷед:

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

Барои баромадан аз меҳмон, нависед exit ё control-d-ро пахш кунед. Ин қабатро мекушад ва пас аз он ваҳми ядро ​​​​мебошад:

/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: “./linux root=/dev/root rootflag…” terminated by signal SIGABRT (Abort)

Мо ин воҳимаи ядроро гирифтем, зеро ядрои Linux фикр мекунад, ки раванди оғозёбӣ ҳамеша иҷро мешавад. Бе он, система дигар кор карда наметавонад ва ба садама дучор мешавад. Аммо азбаски ин як раванди реҷаи корбар аст, натиҷаи натиҷа худ ба он мефиристад SIGABRT, ки дар натичаи он баромад.

Танзимоти шабакаи меҳмонон

Ва ин аст, ки корҳо ба хатогӣ шурӯъ мекунанд. Шабака дар режими корбар Linux дар он ҷоест, ки тамоми мафҳуми маҳдуди "режими корбар" аз ҳам ҷудо мешавад. Баъд аз ҳама, одатан дар сатҳи система, шабака маҳдуд аст имтиёздор усулҳои иҷро барои ҳамаи мо сабабҳои фаҳмо.

Шарҳ. per .: шумо метавонед бештар дар бораи имконоти гуногуни кор бо шабака дар UML хонед дар ин ҷо.

Сафар ба Слирп

Бо вуҷуди ин, як асбоби қадимӣ ва қариб дастгирӣнашаванда мавҷуд аст Слип, ки бо он Ҳолати User Linux метавонад бо шабака ҳамкорӣ кунад. Он ба мисли стеки сатҳи корбар TCP/IP кор мекунад ва барои кор кардан ягон иҷозати системаро талаб намекунад. Ин асбоб буд соли 1995 бароварда шудааст, ва навсозии охирин санаи Соли 2006. Slirp хеле кӯҳна аст. Дар тӯли муддате, ки бидуни дастгирӣ ва навсозӣ, компиляторҳо то ҳадде рафтанд, ки ҳоло ин асбобро танҳо метавон тавсиф кард пӯсидаи код.

Пас, биёед Slirp-ро аз анбори Ubuntu зеркашӣ кунем ва кӯшиш кунем, ки онро иҷро кунем:

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)

Эй худоён. Биёед ислоҳкунандаи Slirp-ро насб кунем ва бубинем, ки оё мо метавонем фаҳмем, ки дар ин ҷо чӣ рӯй дода истодааст:

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.

Хатогӣ дар мо мезанад ин хат. Биёед ба stacktrace нигарем, шояд чизе ба мо дар он ҷо кӯмак кунад:

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

Дар ин ҷо мо мебинем, ки садама ҳангоми оғози гардиши асосӣ вақте рух медиҳад, ки slirp кӯшиши санҷиши вақтро тафтиш мекунад. Дар ин лаҳза, ман маҷбур шудам, ки аз кӯшиши ислоҳ кардан даст кашам. Аммо биёед бубинем, ки оё Slirp аз навъҳо сохта шудааст, кор мекунад. Ман архивро мустақиман аз сайт дубора зеркашӣ кардам sourceforge, зеро кашидани чизе аз он ҷо тавассути сатри фармон дард аст:

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

Дар ин ҷо мо огоҳиҳоро дар бораи функсияҳои дарунсохташуда мебинем, яъне дар бораи имконнопазирии пайваст кардани файли дуии натиҷавӣ. Чунин ба назар мерасад, ки аз соли 2006 то ин лаҳза, gcc истеҳсоли рамзҳоеро, ки дар функсияҳои дохилии файлҳои фосилавии тартибдодашуда истифода мешаванд, қатъ кардааст. Биёед кӯшиш кунем, ки калимаи калидиро иваз кунем inline дар як шарҳи холӣ ва ба натиҷа нигаред:

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

Не. Ин ҳам кор намекунад. То ҳол рамзҳои ин функсияҳоро пайдо карда наметавонанд.

Дар ин лаҳза ман таслим шудам ва ба ҷустуҷӯи Github шурӯъ кардам Ҳероку бастаҳо месозад. Назарияи ман ин буд, ки баъзе бастаи сохтани Ҳероку дорои дуликҳои ба ман лозим аст. Ниҳоят, ҷустуҷӯ маро роҳнамоӣ кард дар ин ҷо. Ман зеркашӣ ва кушодам uml.tar.gz ва инҳоро ёфтанд:

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*

Ин бинарии slirp аст! Оё ӯ кор мекунад?

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

Суқут намекунад - пас он бояд кор кунад! Биёед ин бинариро дар ~/bin/slirp:

cp slirp ~/bin/slirp

Дар ҳолате, ки созандаи баста онро хориҷ кунад, ман оина сохт.

Танзимоти шабака

Акнун биёед шабакаро дар ядрои меҳмони худ созем. Навсозии имконоти оғоз:

linux 
  root=/dev/root 
  rootfstype=hostfs 
  rootflags=$HOME/prefix/uml-demo 
  rw 
  mem=64M 
  eth0=slirp,,$HOME/bin/slirp 
  init=/bin/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

Ду фармони конфигуратсияи аввал /proc и /sys барои кор зарур аст ifconfig, ки интерфейси шабакаро барои муошират бо Slirp муқаррар мекунад. Дастаи route ҷадвали масиркунии ядроро муқаррар мекунад, то тамоми трафикро тавассути нақби Slirp интиқол диҳад. Биёед инро бо дархости DNS тафтиш кунем:

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

Ин кор!

Эзоҳ барои .: Эҳтимол, паёми аслӣ дар мизи корӣ бо корти сими шабакавӣ ё ягон конфигуратсияи дигаре, ки драйверҳои иловагӣ талаб намекунад, навишта шудааст. Дар ноутбук бо WiFi 8265 аз Intel, ҳангоми баланд бардоштани шабака хатогӣ рух медиҳад

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

Эҳтимол, ядро ​​​​бо драйвери корти шабакавӣ муошират карда наметавонад. Кӯшиши тартиб додани нармафзор дар ядро, мутаассифона, вазъиятро ислоҳ накард. Дар замони нашр дар ин конфигуратсия роҳи ҳалли масъаларо пайдо кардан имкон надошт. Дар конфигуратсияҳои соддатар (масалан, дар Virtualbox), интерфейс дуруст баланд мешавад.

Биёед масирро бо скрипти зерин автоматӣ кунем:

#!/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

Ва онро иҷрошаванда қайд кунед:

chmod +x init.sh

Ва он гоҳ мо ба сатри фармони ядро ​​тағирот ворид мекунем:

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

Ва боз такрор мекунем:

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

Шабака устувор аст!

файли docker

Барои осон кардани тафтиши ҳамаи ин, ман ҷамъ овардам файли докер, ки аксари қадамҳои тавсифшударо автоматӣ мекунад ва бояд ба шумо конфигуратсияи корӣ диҳад. Ман ҳам дорам ядрои пешакӣ танзимшуда, ки дорои ҳама чизест, ки дар пост тасвир шудааст. Аммо фаҳмидани он муҳим аст, ки ман дар ин ҷо танҳо ҳадди ақали танзимро тавсиф кардам.

Умедворам, ки ин паём ба шумо дар фаҳмидани он ки чӣ гуна ядрои меҳмонро парвариш кардан лозим аст, кӯмак кардааст. Ин як навъ ҳаюло буд, аммо нашрия ҳамчун дастури мукаммал оид ба сохтан, насб кардан ва танзим кардани режими корбар дар Linux дар зери версияҳои муосири системаҳои оператсионии ин оила таҳия шудааст. Қадамҳои оянда бояд насб кардани хидматҳо ва нармафзори дигарро, ки аллакай дар дохили системаи меҳмонон ҷойгиранд, дар бар гиранд. Азбаски тасвирҳои контейнерии Docker танҳо тарболҳои оммавӣ мебошанд, шумо бояд тасвирро тавассути он истихроҷ кунед docker export, ва сипас роҳи насби онро дар решаи системаи файлии ядрои меҳмон муайян кунед. Хуб, пас скрипти ҷилдиро иҷро кунед.

Ташаккури махсус ба Rkeene аз #lobsters дар Freenode. Бе кӯмаки ӯ дар ислоҳи Slirp, ман ин қадар дур намерафтам. Ман намедонам, ки чӣ тавр системаи Slackware-и ӯ бо slirp дуруст кор мекунад, аммо системаҳои Ubuntu ва Alpine ман slirp-ро қабул накарданд ва бинарии Rkeene ба ман пешниҳод кард. Аммо барои ман кофӣ аст, ки ҳадди аққал чизе барои ман кор кунад.

Манбаъ: will.com

Илова Эзоҳ