Как Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ потрСбитСлски Ρ€Π΅ΠΆΠΈΠΌ Π² 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 Π½Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌ процСси, изпълнявани Π² систСмата Π·Π° гости. Но Π² някои ситуации Ρ‚Π°Π·ΠΈ функция ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π΅ Π² Π½ΠΎΠΆ с Π΄Π²Π΅ остриСта.

ΠšΠ°Ρ‚ΠΎ цяло цялата публикация ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Π΅ колСкция ΠΎΡ‚ изслСдвания ΠΈ Π³Ρ€ΡƒΠ±ΠΈ ΠΎΠΏΠΈΡ‚ΠΈ Π·Π° постиганС Π½Π° ТСлания Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚. Π—Π° Π΄Π° направя Ρ‚ΠΎΠ²Π°, Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Ρ€Π΅Π²Π½ΠΈ инструмСнти, Π΄Π° Ρ‡Π΅Ρ‚Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π½Π° ядрото, Π΄Π° правя ΠΈΠ½Ρ‚Π΅Π½Π·ΠΈΠ²Π½ΠΎ отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΊΠΎΠ΄Π°, написан Π² Π΄Π½ΠΈΡ‚Π΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ бях ΠΎΡ‰Π΅ Π² Π½Π°Ρ‡Π°Π»Π½ΠΎΡ‚ΠΎ ΡƒΡ‡ΠΈΠ»ΠΈΡ‰Π΅, ΠΈ ΡΡŠΡ‰ΠΎ Π΄Π° сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ с ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈ Π½Π° Heroku, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ спСциалСн Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„Π°ΠΉΠ», Π·Π° Π΄Π° намСря инструмСнтитС, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ… . Цялата Ρ‚Π°Π·ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°ΠΊΠ°Ρ€Π° ΠΌΠΎΠΌΡ‡Π΅Ρ‚Π°Ρ‚Π° ΠΎΡ‚ моя IRC Π΄Π° ΠΌΠ΅ Π½Π°Ρ€Π΅ΠΊΠ°Ρ‚ магия. Надявам сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ публикация слуТи ΠΊΠ°Ρ‚ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° докумСнтация Π·Π° някой, ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° ΠΎΠΏΠΈΡ‚Π° ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ с ΠΏΠΎ-Π½ΠΎΠ²ΠΈ ядра ΠΈ вСрсии Π½Π° ОБ.

Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€Π°Π½Π΅

НастройванСто Π½Π° потрСбитСлски Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Linux сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π² няколко ΡΡ‚ΡŠΠΏΠΊΠΈ:

  • инсталиранС Π½Π° зависимости Π½Π° хоста;
  • изтСглянС Π½Π° Linux ядрото;
  • конфигурация Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ядрото;
  • сглобяванС Π½Π° ядрото;
  • Π΄Π²ΠΎΠΈΡ‡Π½Π° инсталация;
  • ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π·Π° гости;
  • ΠΈΠ·Π±ΠΎΡ€ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° стартиранС Π½Π° ядрото;
  • създаванС Π½Π° ΠΌΡ€Π΅ΠΆΠ° Π·Π° гости;
  • стартиранС Π½Π° гост ядрото.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΌ, Ρ‡Π΅ Π°ΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚Π΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ сами, Π½Π°ΠΉ-вСроятно Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ всичко описано Π² някоя систСма, ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Ubuntu ΠΈΠ»ΠΈ Debian. ΠžΠΏΠΈΡ‚Π°Ρ… сС Π΄Π° внСдря всичко ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π² Π»ΡŽΠ±ΠΈΠΌΠ°Ρ‚Π° ΠΌΠΈ дистрибуция - Alpine, Π½ΠΎ Π½ΠΈΡ‰ΠΎ Π½Π΅ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ядрото Π½Π° Linux ΠΈΠΌΠ° Ρ‚Π²ΡŠΡ€Π΄ΠΎ ΠΎΠ±Π²ΡŠΡ€Π·Π²Π°Ρ‰ΠΈ glibc-ΠΈΠ·ΠΌΠΈ Π·Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΈ Π² потрСбитСлски Ρ€Π΅ΠΆΠΈΠΌ. Бмятам Π΄Π° Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°ΠΌ Ρ‚ΠΎΠ²Π° Π½Π° upstream, слСд ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΉ-накрая Ρ€Π°Π·Π±Π΅Ρ€Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° зависимости ΠΎΡ‚ хоста

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 GB пространство Π½Π° Ρ‚Π²ΡŠΡ€Π΄ΠΈΡ диск, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ Π³ΠΎ ΠΈΠΌΠ°Ρ‚Π΅.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° 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]', Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠ»Π°Π²ΠΈΡˆΠΈΡ‚Π΅ Space ΠΈΠ»ΠΈ 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)

Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ? Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅ Π½Π° нашия ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π» Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ процСсорни ядра ΠΈ нишки Π² процСса Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅. Π•ΠΊΠΈΠΏ $(nproc) Π² края Π½Π° Build замСства ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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. Но Ρ‚ΠΎΠ·ΠΈ FS Ρ‰Π΅ бъдС Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½ Π·Π° ΠΎΡ†Π΅Π½ΠΊΠ° Π½Π° ΠΎΠ±Ρ‰Π°Ρ‚Π° идСя.

Врябва Π½ΠΈ ΠΈ инструмСнт Π’ΠΈΠ½ΠΈ Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° консумацията Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π·ΠΎΠΌΠ±ΠΈΡ€Π°Π½ΠΈ процСси Π½Π°ΡˆΠ΅Ρ‚ΠΎ ядро ​​за гости.

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 MB RAM (ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π² зависимост ΠΎΡ‚ Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ‚Π΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅, Π½ΠΎ 64 MB ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ количСство).
  • Π―Π΄Ρ€ΠΎΡ‚ΠΎ сС стартира Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ /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 Ρ‚ΡƒΠΊ.

ΠŸΡŠΡ‚ΡƒΠ²Π°Π½Π΅ Π΄ΠΎ Slirp

Има ΠΎΠ±Π°Ρ‡Π΅ Π΅Π΄ΠΈΠ½ Π΄Ρ€Π΅Π²Π΅Π½ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ инструмСнт, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠΏΠΎΠ΄Ρ…Π»ΡŠΠ·Π²Π°Π½Π΅, с ΠΊΠΎΠΉΡ‚ΠΎ потрСбитСлски Ρ€Π΅ΠΆΠΈΠΌ 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, създадСн ΠΎΡ‚ sorts, Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π˜Π·Ρ‚Π΅Π³Π»ΠΈΡ… ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π°Ρ€Ρ…ΠΈΠ²Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ сайта 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 ΠŸΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Heroku. ΠœΠΎΡΡ‚Π° тСория бСшС, Ρ‡Π΅ някакъв ΠΏΠ°ΠΊΠ΅Ρ‚ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Heroku Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄Π²ΠΎΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ…. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅Ρ‚ΠΎ ΠΌΠ΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Ρ‚ΡƒΠΊ. Π˜Π·Ρ‚Π΅Π³Π»ΠΈΡ… ΠΈ Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Ρ… 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*

Π’ΠΎΠ²Π° Π΅ двоичният Ρ„Π°ΠΉΠ» Π½Π° slip! Π’ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π»ΠΈ?

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

ΠœΡ€Π΅ΠΆΠ°Ρ‚Π° Π΅ стабилна!

Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ»

Π—Π° Π΄Π° Π²ΠΈ улСсня Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ всичко Ρ‚ΠΎΠ²Π°, ΡΡŠΠ±Ρ€Π°Ρ… Π”ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ описанитС ΡΡ‚ΡŠΠΏΠΊΠΈ ΠΈ трябва Π΄Π° Π²ΠΈ Π΄Π°Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° конфигурация. ΠΈΠΌΠ°ΠΌ ΡΡŠΡ‰ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎ ядро, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ описано Π² публикацията. Но Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ Ρ‚ΡƒΠΊ ΠΎΡ‡Π΅Ρ€Ρ‚Π°Ρ… само ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°Ρ‚Π° настройка.

Надявам сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ публикация Π²ΠΈ Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π°Π»Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ядро ​​за гост. Оказа сС, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ някакво Ρ‡ΡƒΠ΄ΠΎΠ²ΠΈΡ‰Π΅, Π½ΠΎ публикацията Π΅ замислСна ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ°Ρ‚Π΅Π»Π½ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅, инсталиранС ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° потрСбитСлски Ρ€Π΅ΠΆΠΈΠΌ Π² Linux ΠΏΠΎΠ΄ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈ вСрсии Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми ΠΎΡ‚ Ρ‚ΠΎΠ²Π° сСмСйство. Π‘Π»Π΅Π΄Π²Π°Ρ‰ΠΈΡ‚Π΅ ΡΡ‚ΡŠΠΏΠΊΠΈ трябва Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ инсталиранС Π½Π° услуги ΠΈ Π΄Ρ€ΡƒΠ³ софтуСр, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π΅ Π² систСмата Π·Π° гости. Въй ΠΊΠ°Ρ‚ΠΎ изобраТСнията Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π° Docker са само ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ΠΈ tarballs, трябва Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‡Ρ€Π΅Π· docker exportΠΈ слСд Ρ‚ΠΎΠ²Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Ρ‚Π΅ инсталационния ΠΌΡƒ ΠΏΡŠΡ‚ Π² ΠΊΠΎΡ€Π΅Π½Π° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π½Π° ядрото Π·Π° гости. Π•, Ρ‚ΠΎΠ³Π°Π²Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ скрипта Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π°.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»Π½ΠΈ благодарности Π½Π° Rkeene ΠΎΡ‚ #lobsters Π½Π° Freenode. Π‘Π΅Π· Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° ΠΏΠΎΠΌΠΎΡ‰ Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² Slirp, нямашС Π΄Π° стигна Π΄ΠΎΡ‚ΡƒΠΊ. Нямам прСдстава ΠΊΠ°ΠΊ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Slackware систСма Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ с slirp, Π½ΠΎ ΠΌΠΎΠΈΡ‚Π΅ Ubuntu ΠΈ Alpine систСми Π½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ…Π° slirp ΠΈ бинарният Rkeene ΠΌΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ. Но ΠΌΠΈ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ΠΏΠΎΠ½Π΅ Π½Π΅Ρ‰ΠΎ Π΄Π° ΠΌΠΈ Π²ΡŠΡ€ΡˆΠΈ Ρ€Π°Π±ΠΎΡ‚Π°.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€