Как Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ User Mode Π² Linux

ВступлСниС ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: На Ρ„ΠΎΠ½Π΅ массового Π²Ρ…ΠΎΠ΄Π° Π² Π½Π°ΡˆΡƒ Тизнь Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно интСрСсно ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ это всё Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ с пользой ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ ΠΏΠΎ сСй дСнь, Π½ΠΎ Π½Π΅ всС ΠΎ Ρ‚Π°ΠΊΠΈΡ… способах помнят (ΠΈΠ»ΠΈ Π·Π½Π°ΡŽΡ‚, Ссли Π½Π΅ застали Π²ΠΎ врСмя ΠΈΡ… Π±ΡƒΡ€Π½ΠΎΠ³ΠΎ развития). Одной ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ являСтся User Mode Linux. Автор ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π° изрядно покопалась, Ρ€Π°Π·Π±ΠΈΡ€Π°ΡΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· старых Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ Π΅Ρ‰Ρ‘ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π° Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ, ΠΈ собрала Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ пошаговой инструкции ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ самому сСбС завСсти Π΄ΠΎΠΌΠΎΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ UML Π² 2ΠΊ19. И Π΄Π°, ΠΌΡ‹ пригласили Π½Π° Π₯Π°Π±Ρ€ Π°Π²Ρ‚ΠΎΡ€Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ поста Cadey, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π΅ΡΡ‚ΡŒ вопросы β€” Π·Π°Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° английском Π² коммСнтариях.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ User Mode Π² Linux

User Mode Π² Linux β€” это, фактичСски, ΠΏΠΎΡ€Ρ‚ ядра Linux Π½Π° само сСбя. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ позволяСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ ядро Linux Π² качСствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ для тСстирования Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ². Но Ρ‚Π°ΠΊΠΆΠ΅ этот Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΈ Π² качСствС инструмСнта ΠΎΠ±Ρ‰Π΅ΠΉ изоляции, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ схоТ с Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин. Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ, Ρ‡Π΅ΠΌ Docker, Π½ΠΎ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ, Ρ‡Π΅ΠΌ полноцСнная Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Π²Ρ€ΠΎΠ΄Π΅ KVM ΠΈΠ»ΠΈ Virtual Box.

Π’ Ρ†Π΅Π»ΠΎΠΌ, User Mode ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным ΠΈ слоТным Π² использовании инструмСнтом, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ всё ΠΆΠ΅ Π΅ΡΡ‚ΡŒ свои области примСнСния. Π’Π΅Π΄ΡŒ это ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ Linux-ядро, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ ΠΎΡ‚ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΡƒΠ³Ρ€ΠΎΠ· для хост-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ ядро, Π΅Π³ΠΎ процСссы ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ хост-ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ процСссы, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ User Mode, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ для хоста. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ 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 Π² User Mode:

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

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ я ΠΌΠΎΠ³Ρƒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ с хоста ΠΈΠΌΠ΅Π½Π° процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ Π² гостСвой систСмС. Π‘ Linux User Mode это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ инструмСнты ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· подсистСму Π°ΡƒΠ΄ΠΈΡ‚Π° Linux (Linux’s auditing subsystem) Π½Π΅ видят процСссы, исполняСмыС Π² гостСвой систСмС. Но Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях эта ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Π»ΠΊΠΎΠΉ ΠΎ Π΄Π²ΡƒΡ… ΠΊΠΎΠ½Ρ†Π°Ρ….

Π’ΠΎΠΎΠ±Ρ‰Π΅ вСсь пост Π½ΠΈΠΆΠ΅ β€” это Π½Π°Π±ΠΎΡ€ исслСдований ΠΈ Π³Ρ€ΡƒΠ±Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Для этого ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π΄Ρ€Π΅Π²Π½ΠΈΠ΅ инструмСнты, Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ исходники ядра, Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ интСнсивной ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ ΠΊΠΎΠ΄Π°, написанного Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π°, ΠΊΠΎΠ³Π΄Π° я Π΅Ρ‰Π΅ Ρ…ΠΎΠ΄ΠΈΠ»Π° Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΊΠΎΠ»Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ²Ρ‹Ρ€ΡΡ‚ΡŒΡΡ Π² сборках Heroku с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ бинаря Π² поисках Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΌΠ½Π΅ инструмСнтов. Вся эта Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ рСбята Π² ΠΌΠΎΠ΅ΠΌ IRC стали Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ мСня Π²ΠΎΠ»ΡˆΠ΅Π±Π½ΠΈΡ†Π΅ΠΉ (magic). Π― надСюсь, Ρ‡Ρ‚ΠΎ этот пост послуТит ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ всС Ρ‚ΠΎΠΆΠ΅ самоС, Π½ΠΎ ΡƒΠΆΠ΅ с Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΌΠΈ ядрами ΠΈ вСрсиями ОБ.

Настройка

Настройка Linux User Mode выполняСтся Π² нСсколько этапов:

  • установка зависимостСй Π½Π° хостС;
  • скачиваниС ядра Linux;
  • настройка сборки ядра;
  • сборка ядра;
  • инсталляция Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°;
  • настройка гостСвой Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы;
  • ΠΏΠΎΠ΄Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² запуска ядра;
  • настройка гостСвой сСти;
  • запуск гостСвого ядра.

Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ это всё ΠΏΡ€ΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ, скорСС всСго, Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ всС описанноС Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ubuntu ΠΈΠ»ΠΈ Debian-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ систСмС. Π― ΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π² ΠΌΠΎΠ΅ΠΌ любимом дистрибутивС β€” Alpine, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²Ρ‹ΡˆΠ»ΠΎ, ΠΏΠΎ всСй видимости, ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ядро Linux ΠΈΠΌΠ΅Π΅Ρ‚ ΠΆΠ΅ΡΡ‚ΠΊΡƒΡŽ привязку ΠΏΠΎ glibc-isms для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π² User Mode. ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом Π² апстрим послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π±Π΅Ρ€ΡƒΡΡŒ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.

Установка зависимостСй Π½Π° хостС

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

Настройка сборки ядра

БистСма сборки ядра β€” это Π½Π°Π±ΠΎΡ€ Make-Ρ„Π°ΠΉΠ»ΠΎΠ² с мноТСством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… инструмСнтов ΠΈ скриптов для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса. Для Π½Π°Ρ‡Π°Π»Π° ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ настройки:

make ARCH=um menuconfig

Она частично ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Ρ‚ сборку ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π²Π°ΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Когда Π²Π½ΠΈΠ·Ρƒ ΠΎΠΊΠ½Π° высвСтится ‘[Select]‘, Π²Ρ‹ смоТСтС Π·Π°Π½ΡΡ‚ΡŒΡΡ настройкой с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ клавиш ΠŸΡ€ΠΎΠ±Π΅Π» ΠΈΠ»ΠΈ Π’Π²ΠΎΠ΄. Навигация ΠΏΠΎ ΠΎΠΊΠ½Ρƒ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, стрСлками ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Β«Π²Π²Π΅Ρ€Ρ…Β» ΠΈ Β«Π²Π½ΠΈΠ·Β», Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ элСмСнтов β€” Β«Π²Π»Π΅Π²ΠΎΒ» ΠΈΠ»ΠΈ Β«Π²ΠΏΡ€Π°Π²ΠΎΒ».

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄Π° —> ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² подмСню, Π²Ρ…ΠΎΠ΄ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ осущСствляСтся клавишСй Π’Π²ΠΎΠ΄. Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π½Π΅Π³ΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Π΅Ρ€Π΅Π· ‘[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.

Π˜Π½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°

Π’Π°ΠΊ ΠΊΠ°ΠΊ User Mode Π² 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

Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ этот tarball, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ 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 Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ слоТно. Но Π΄Π°Π½Π½ΠΎΠΉ Π€Π‘ Π±ΡƒΠ΄Π΅Ρ‚ достаточно для ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈΠ΄Π΅ΠΈ.

Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ потрСбуСтся инструмСнт tini для прСсСчСния потрСблСния памяти Π·ΠΎΠΌΠ±ΠΈ-процСссами нашСго гостСвого ядра.

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

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ядра

Π’ ядрС Linux, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ, ΡƒΠΊΠ°Π·Π°Π² ΠΊΠ»ΡŽΡ‡ --help.

Π‘Π°ΠΌ —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 Π² качСствС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы.
  • Π‘ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠΉ Π³ΠΎΡΡ‚Π΅Π²ΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ создали Π² root-устройствС.
  • И Π΄Π°, Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния-записи.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 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. Π­Ρ‚ΠΎ пристрСлит ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ kernel panic:

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

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ этот kernel panic ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ядро Linux считаСт, Ρ‡Ρ‚ΠΎ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСгда Π·Π°ΠΏΡƒΡ‰Π΅Π½. Π‘Π΅Π· Π½Π΅Π³ΠΎ систСма большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это процСсс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ отправляСт сам сСбя Π² SIGABRT, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ.

Настройка гостСвой сСти

А Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ Ρƒ нас всё Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ Π½Π΅ ΠΏΠΎ ΠΏΠ»Π°Π½Ρƒ. Π‘Π΅Ρ‚ΡŒ Π² User Mode Linux β€” это Ρ‚ΠΎ мСсто, Π³Π΄Π΅ вся концСпция ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Β«ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°Β» Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π·Π²Π°Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π’Π΅Π΄ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° систСмном ΡƒΡ€ΠΎΠ²Π½Π΅ ΡΠ΅Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ исполнСния ΠΏΠΎ всСм Π½Π°ΠΌ понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ.

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.: большС ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ Π² UML ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь.

ΠŸΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠ΅ Π² slirp

Однако ΠΆΠ΅ сущСствуСт Π΄Ρ€Π΅Π²Π½ΠΈΠΉ ΠΈ практичСски Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ инструмСнт ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Slirp, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ User Mode Linux ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΡΠ΅Ρ‚ΡŒΡŽ. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΊ стСк TCP/IP Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ систСмных Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для запуска. Π­Ρ‚ΠΎΡ‚ инструмСнт Π±Ρ‹Π» Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Π² 1995 Π³ΠΎΠ΄Ρƒ, Π° послСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ датируСтся 2006 Π³ΠΎΠ΄ΠΎΠΌ. Slirp ΠΎΡ‡Π΅Π½ΡŒ стар. Π—Π° врСмя Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ компиляторы ΡƒΡˆΠ»ΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π»Π΅ΠΊΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ этот инструмСнт ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ Β«code rotΒ».

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΊΠ°Ρ‚ΠΈΠΌ 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 ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ сборки 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*

Π­Ρ‚ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» 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
/ #

Π’ΠΈΠ΄ΠΈΠΌΠΎ, ядро Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ сСтСвухи. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ‚ΡŒ firmware Π² ядро ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊ соТалСнию, Π½Π΅ исправила. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠΊΠ° Π½Π°ΠΉΡ‚ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ. На Π±ΠΎΠ»Π΅Π΅ простых ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Virtualbox) интСрфСйс поднимаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ shell-скрипта:

#!/bin/sh
# init.sh

mount -t proc proc proc/
mount -t sysfs sys sys/
ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15
route add default gw 10.0.2.2

echo "networking set up"

exec /tini /bin/sh

И ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Π΅Π³ΠΎ исполняСмым:

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

Π‘Π΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ!

Π”ΠΎΠΊΠ΅Ρ€-Ρ„Π°ΠΉΠ»

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ всС это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, я собрала Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ описанных шагов ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²Π°ΠΌ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ. Π•Ρ‰Π΅ Ρƒ мСня Π΅ΡΡ‚ΡŒ готовая конфигурация ядра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ описано Π² постС. Но Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ я ΠΈΠ·Π»ΠΎΠΆΠΈΠ»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ настройку.

Π― надСюсь, Ρ‡Ρ‚ΠΎ этот пост ΠΏΠΎΠΌΠΎΠ³ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ гостСвоС ядро. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ монстр, Π½ΠΎ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»Π°ΡΡŒ публикация Π² качСствС Π²ΡΠ΅ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅Π³ΠΎ руководства Π½Π° Ρ‚Π΅ΠΌΡƒ сборки, установки ΠΈ настройки User Mode Π² Linux ΠΏΠΎΠ΄ соврСмСнными вСрсиями ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм этого сСмСйства. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя установку сСрвисов ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΡƒΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ гостСвой систСмы. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Docker β€” это просто распиарСнныС tar-Π°Ρ€Ρ…ΠΈΠ²Ρ‹, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² состоянии ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΎΠ±Ρ€Π°Π· Ρ‡Π΅Ρ€Π΅Π· docker export, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π΅Π³ΠΎ установки Π² ΠΊΠΎΡ€Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы гостСвого ядра. Ну, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ shell-скрипт.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо Rkeene с #lobsters Π½Π° Freenode. Π‘Π΅Π· Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Slirp я Π±Ρ‹ Π½Π΅ зашла Ρ‚Π°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ. Π― понятия Π½Π΅ имСю, ΠΊΠ°ΠΊ Π΅Π³ΠΎ систСма Slackware ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со slirp, Π½ΠΎ ΠΌΠΎΠΈ систСмы Ubuntu ΠΈ Alpine Π½Π΅ приняли slirp ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ½Π΅ Rkeene Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ. Но ΠΌΠ½Π΅ достаточно ΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΠΎΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ.

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