рд▓рд┐рдирдХреНрд╕рд╡рд░ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рд╡рд╛рдкрд░рдгреЗ рдХрд╕реЗ рд╕реБрд░реВ рдХрд░рд╛рд╡реЗ

рдЕрдиреБрд╡рд╛рджрдХрд╛рдХрдбреВрди рдкрд░рд┐рдЪрдп: рдЖрдкрд▓реНрдпрд╛ рдЬреАрд╡рдирд╛рдд рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдХрдВрдЯреЗрдирд░реНрд╕рдЪреНрдпрд╛ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдкреНрд░рд╡реЗрд╢рд╛рдЪреНрдпрд╛ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрд╡рд░, рд╣реЗ рд╕рд░реНрд╡ рдХреЛрдгрддреНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдиреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗ рд╣реЗ рд╢реЛрдзрдгреЗ рдЦреВрдк рдордиреЛрд░рдВрдЬрдХ рдЖрдгрд┐ рдЙрдкрдпреБрдХреНрдд рдард░реВ рд╢рдХрддреЗ. рддреНрдпрд╛рдкреИрдХреА рдХрд╛рд╣реА рдЖрдЬрдкрд░реНрдпрдВрдд рдЙрдкрдпреБрдХреНрддрдкрдгреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдкрд░рдВрддреБ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЕрд╢рд╛ рдкрджреНрдзрддреА рдЖрдард╡рдд рдирд╛рд╣реАрдд (рдХрд┐рдВрд╡рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдЬрд░ рддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡реЗрдЧрд╡рд╛рди рд╡рд┐рдХрд╛рд╕рд╛рджрд░рдореНрдпрд╛рди рдкрдХрдбрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реАрдд). рдЕрд╕реЗрдЪ рдПрдХ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдореНрд╣рдгрдЬреЗ рдпреВрдЬрд░ рдореЛрдб рд▓рд┐рдирдХреНрд╕. рдореВрд│рдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рдиреЗ рдмрд░реНтАНрдпрд╛рдЪ рдкреНрд░рдорд╛рдгрд╛рдд рдЦреЛрджрдХрд╛рдо рдХреЗрд▓реЗ, рдЬреБрдиреНрдпрд╛ рдШрдбрд╛рдореЛрдбреАрдВрдкреИрдХреА рдХреЛрдгрддреЗ рдХрд╛рд░реНрдп рдЕрджреНрдпрд╛рдк рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ рдХреЛрдгрддреЗ рдирд╛рд╣реА рд╣реЗ рд╢реЛрдзреВрди рдХрд╛рдврд▓реЗ рдЖрдгрд┐ рд╕реНрд╡рддрдГрд╕рд╛рдареА рдШрд░рдЧреБрддреА UML рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╕реВрдЪрдирд╛рдВрд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рдПрдХрддреНрд░ рдХреЗрд▓реЗ. 2k19. рдЖрдгрд┐ рд╣реЛ, рдЖрдореНрд╣реА рдореВрд│ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рд▓рд╛ Habr рд╡рд░ рдЖрдордВрддреНрд░рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ рдХреЕрдбреЗ, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рд╢реНрди рдЕрд╕рд▓реНрдпрд╛рд╕, рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдЗрдВрдЧреНрд░рдЬреАрдордзреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд╛.

рд▓рд┐рдирдХреНрд╕рд╡рд░ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рд╡рд╛рдкрд░рдгреЗ рдХрд╕реЗ рд╕реБрд░реВ рдХрд░рд╛рд╡реЗ

рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рдпреБрдЬрд░ рдореЛрдб рд╣реЗ рдЦрд░реЗ рддрд░ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдПрдХ рдкреЛрд░реНрдЯ рдЖрд╣реЗ. рд╣рд╛ рдореЛрдб рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореНрд╣рдгреВрди рдкреВрд░реНрдг рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрджреНрд╡рд╛рд░реЗ рдбреНрд░рд╛рдпрд╡реНрд╣рд░реНрд╕рдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. рдкрд░рдВрддреБ рд╣рд╛ рдореЛрдб рд╕рд╛рдорд╛рдиреНрдп рдЕрд▓рдЧрд╛рд╡рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрди рдореНрд╣рдгреВрди рджреЗрдЦреАрд▓ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪреЗ рддрддреНрддреНрд╡ рдЖрднрд╛рд╕реА рдорд╢реАрдирдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ. рд╣рд╛ рдореЛрдб рдбреЙрдХрд░рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд▓рдЧрд╛рд╡ рдкреНрд░рджрд╛рди рдХрд░рддреЛ, рдкрд░рдВрддреБ KVM рдХрд┐рдВрд╡рд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдмреЙрдХреНрд╕ рд╕рд╛рд░рдЦреНрдпрд╛ рдкреВрд░реНрдг рд╡рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдкреЗрдХреНрд╖рд╛ рдХрдореА.

рдПрдХрдВрджрд░реАрдд, рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рдЪрд┐рддреНрд░ рдЖрдгрд┐ рдХрдареАрдг рд╕рд╛рдзрди рд╡рд╛рдЯреВ рд╢рдХрддреЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪреЗ рдЙрдкрдпреЛрдЧ рдЖрд╣реЗрдд. рд╢реЗрд╡рдЯреА, рд╣рд╛ рдПрдХ рдкреВрд░реНрдг рд╡рд╛рдв рдЭрд╛рд▓реЗрд▓рд╛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рдЖрд╣реЗ рдЬреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдирд╕рд▓реЗрд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореНрд╣рдгреВрди рдЪрд╛рд▓рддреЛ. рд╣реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╕рдВрднрд╛рд╡реНрдп рдЕрд╡рд┐рд╢реНрд╡рд╛рд╕реВ рдХреЛрдб рд╣реЛрд╕реНрдЯ рдорд╢реАрдирд▓рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдзреЛрдХреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЖрдгрд┐ рд╣реЗ рдкреВрд░реНрдг рдХрд░реНрдирд▓ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрдЬрдорд╛рди рдорд╢реАрдирдкрд╛рд╕реВрди рд╡реЗрдЧрд│реА рдХреЗрд▓реА рдЬрд╛рддреЗ, рдореНрд╣рдгрдЬреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдбрдордзреНрдпреЗ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрд╕реНрдЯрд▓рд╛ рджрд┐рд╕рдгрд╛рд░ рдирд╛рд╣реАрдд. рд╣реЗ рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рд╕рд╛рд░рдЦреЗ рдирд╛рд╣реА, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдиреЗрд╣рдореА рд╕реНрдЯреЛрд░реЗрдЬрдордзреАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рд╣рддреЗ. рдорд╛рдЭреНрдпрд╛ рдПрдХрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди 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тФАтФмтФА5*[linux]
      тФФтФАslirp

рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛, рдореА рд╣реЛрд╕реНрдЯрдХрдбреВрди рдЕрддрд┐рдереАрдордзреНрдпреЗ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреА рдирд╛рд╡реЗ рдкрд╛рд╣реВ рд╢рдХрддреЛ. рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдбрд╕рд╣ рд╣реЗ рд╢рдХреНрдп рдирд╛рд╣реА. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдХрд╛рдп? рдпрд╛рдЪрд╛ рдЕрд░реНрде рд▓рд┐рдирдХреНрд╕рдЪреНрдпрд╛ рдСрдбрд┐рдЯрд┐рдВрдЧ рд╕рдмрд╕рд┐рд╕реНрдЯрдорджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рдгрд╛рд░реА рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдЯреВрд▓реНрд╕ рдкрд╛рд╣реВ рдирдХрд╛ рдЕрддрд┐рдереА рдкреНрд░рдгрд╛рд▓реАрдордзреНрдпреЗ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛. рдкрд░рдВрддреБ рдХрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рд╣реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рджреБрдзрд╛рд░реА рддрд▓рд╡рд╛рд░ рдЕрд╕реВ рд╢рдХрддреЗ.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЦрд╛рд▓реА рджрд┐рд▓реЗрд▓реА рд╕рдВрдкреВрд░реНрдг рдкреЛрд╕реНрдЯ рд╕рдВрд╢реЛрдзрди рдЖрдгрд┐ рдЗрдЪреНрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдзреНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдареЛрд░ рдкреНрд░рдпрддреНрдирд╛рдВрдЪрд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ рд╡рд┐рд╡рд┐рдз рдкреНрд░рд╛рдЪреАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░рд╛рд╡реА рд▓рд╛рдЧрд▓реА, рдХрд░реНрдирд▓ рд╕реНрд░реЛрдд рд╡рд╛рдЪрд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ, рдореА рдкреНрд░рд╛рдердорд┐рдХ рд╢рд╛рд│реЗрдд рдЕрд╕рддрд╛рдирд╛ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдЪреНрдпрд╛ рдЧрд╣рди рдбреАрдмрдЧрд┐рдВрдЧрдордзреНрдпреЗ рдЧреБрдВрддрд▓реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдорд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдзрдирд╛рдВрдЪреНрдпрд╛ рд╢реЛрдзрд╛рдд рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрд╛рдпрдирд░реА рд╡рд╛рдкрд░реВрди Heroku рдмрд┐рд▓реНрдбрд╕рд╣ рдЯрд┐рдВрдХрд░ рджреЗрдЦреАрд▓ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ. рдпрд╛ рд╕рд░реНрд╡ рдХрд╛рдорд╛рдореБрд│реЗ рдорд╛рдЭреНрдпрд╛ IRC рд╡рд░реАрд▓ рд▓реЛрдХ рдорд▓рд╛ рдЬрд╛рджреВрдЧрд╛рд░ рдореНрд╣рдгреВ рд▓рд╛рдЧрд▓реЗ. рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реЗ рдкреЛрд╕реНрдЯ рдПрдЦрд╛рджреНрдпрд╛ рд╡реНрдпрдХреНрддреАрд╕рд╛рдареА рд╕рдорд╛рди рдЧреЛрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░реЗрд▓, рдкрд░рдВрддреБ рдирд╡реАрди рдХрд░реНрдирд▓ рдЖрдгрд┐ OS рдЖрд╡реГрддреНрддреНрдпрд╛рдВрд╕рд╣.

рд╕рдорд╛рдпреЛрдЬрди

рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЪрд░рдгрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ:

  • рд╣реЛрд╕реНрдЯрд╡рд░ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ;
  • рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ;
  • рдХрд░реНрдирд▓ рдмрд┐рд▓реНрдб рд╕реЗрдЯрдЕрдк;
  • рдХрд░реНрдирд▓ рдЕрд╕реЗрдВрдмреНрд▓реА;
  • рдмрд╛рдпрдирд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ;
  • рдЕрддрд┐рдереА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯ рдХрд░рдгреЗ;
  • рдХрд░реНрдирд▓ рд▓реЙрдиреНрдЪ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рдирд┐рд╡рдб;
  • рдЕрддрд┐рдереА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯ рдХрд░рдгреЗ;
  • рдЕрддрд┐рдереА рдХрд░реНрдирд▓ рд▓рд╛рдБрдЪ рдХрд░рдд рдЖрд╣реЗ.

рдореА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рдЬрд░ рддреБрдореНрд╣реА рд╣реЗ рд╕рд░реНрд╡ рд╕реНрд╡рддрдГ рдХрд░рд╛рдпрдЪреЗ рдард░рд╡рд▓реЗ, рддрд░ рдмрд╣реБрдзрд╛ рддреБрдореНрд╣реА рдХрд╛рд╣реА рдЙрдмрдВрдЯреВ рдХрд┐рдВрд╡рд╛ рдбреЗрдмрд┐рдпрди рд╕рд╛рд░рдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдордзреНрдпреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреА рдХрд░рд╛рд▓. рдореА рд╡рд░реАрд▓ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреА рдорд╛рдЭреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рд╡рд┐рддрд░рдгрд╛рдордзреНрдпреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ - рдЕрд▓реНрдкрд╛рдЗрди, рдкрд░рдВрддреБ рдХрд╛рд╣реАрд╣реА рдХрд╛рд░реНрдп рдХреЗрд▓реЗ рдирд╛рд╣реА, рдХрд╛рд░рдг рдЙрдШрдбрдкрдгреЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдбрдордзреАрд▓ рдбреНрд░рд╛рдпрд╡реНрд╣рд░реНрд╕рд╕рд╛рдареА glibc-isms рд▓рд╛ рдШрдЯреНрдЯ рдмрд╛рдВрдзрд▓реЗрд▓реЗ рдЖрд╣реЗ. рдорд▓рд╛ рд╢реЗрд╡рдЯреА рд╕рдорд╕реНрдпрд╛ рд╕рдордЬрд▓реНрдпрд╛рдирдВрддрд░ рдЕрдкрд╕реНрдЯреНрд░реАрдорд╡рд░ рдпрд╛рдЪреА рддрдХреНрд░рд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдорд╛рдЭреА рдпреЛрдЬрдирд╛ рдЖрд╣реЗ.

рд╣реЛрд╕реНрдЯрд╡рд░ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдмрдВрдЯреВрд▓рд╛ рдХрд┐рдорд╛рди рдЦрд╛рд▓реАрд▓ рдкреЕрдХреЗрдЬреЗрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ (рд╕реНрд╡рдЪреНрдЫ рд╕реНрдерд╛рдкрдирд╛ рдЧреГрд╣реАрдд рдзрд░реВрди):

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

рддреБрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢рд╛рдиреЗ (рд░реВрдЯ рдХрд┐рдВрд╡рд╛ sudo рд╕рд╣) рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрддрд╛:

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

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рд╕рд╛рдареА рдореЗрдиреВ рдХрд╕реНрдЯрдорд╛рдпрдЭреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рдирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓ libncurses-dev. рдХреГрдкрдпрд╛ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢ (рд░реВрдЯ рдореНрд╣рдгреВрди рдХрд┐рдВрд╡рд╛ 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

рдЖрддрд╛ рдЖрдореНрд╣реА рдЯрд╛рд░рдмреЙрд▓ рдЕрдирдкреЕрдХ рдХрд░рддрд╛рдирд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ:

cd linux-5.1.16

рдХрд░реНрдирд▓ рдмрд┐рд▓реНрдб рд╕реЗрдЯ рдЕрдк рдХрд░рдд рдЖрд╣реЗ

рдХрд░реНрдирд▓ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдПрдХ рд╕рдВрдЪ рдЖрд╣реЗ рдлрд╛рдЗрд▓реНрд╕ рдмрдирд╡рд╛ ╤Б рдЕрдиреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдиреБрдХреВрд▓ рд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ. рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдСрдирд▓рд╛рдЗрди рд╕реЗрдЯрдЕрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрдШрдбрд╛:

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]'.

рд╣реЗ рдкреЛрд╕реНрдЯ рд╡рд╛рдЪрд▓реНрдпрд╛рдирдВрддрд░ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд░реНрдирд▓ рдмрд┐рд▓реНрдб рдкрд░реНрдпрд╛рдпрд╛рдВрд╕рд╣ рдЦреЗрд│рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ. рдпрд╛ рдкреНрд░рдпреЛрдЧрд╛рдВрдордзреВрди рддреБрдореНрд╣реА рд▓реЛ-рд▓реЗрд╡реНрд╣рд▓ рдХрд░реНрдирд▓ рдореЗрдХреЕрдирд┐рдХреНрд╕ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ рдХрд░реНрдирд▓ рдХрд╕рд╛ рдмрдирд╡рд▓рд╛ рдЬрд╛рддреЛ рдпрд╛рд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдзреНрд╡рдЬ рдХрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛рдд рдпрд╛рдмрджреНрджрд▓ рдмрд░реЗрдЪ рдХрд╛рд╣реА рд╢рд┐рдХреВ рд╢рдХрддрд╛.

рдХрд░реНрдирд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рд╣рд╛ рдПрдХ рдореЛрдард╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрд╣реЗ рдЬреЛ рдмрд░реНтАНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдХрд░рддреЛ. рдЬреБрдиреНрдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╡рд░ рдпрд╛ рдХрд┐рдорд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣, рдЕрд╕реЗрдВрдмрд▓реАрд▓рд╛ рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧреВ рд╢рдХрддреЛ. рддрд░ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢ рд╡рд╛рдкрд░реВрди рдХрд░реНрдирд▓ рддрдпрд╛рд░ рдХрд░рд╛:

make ARCH=um -j$(nproc)

рдХрд╢рд╛рд╕рд╛рдареА? рд╣рд╛ рдЖрджреЗрд╢ рдЖрдордЪреНрдпрд╛ рдмрд┐рд▓реНрдбрд░рд▓рд╛ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рд╕рд░реНрд╡ рдЙрдкрд▓рдмреНрдз CPU рдХреЛрд░ рдЖрдгрд┐ рдереНрд░реЗрдбреНрд╕ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧреЗрд▓. рд╕рдВрдШ $(nproc) Build рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдХрдорд╛рдВрдбрдЪреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рддреЗ nproc, рдЬреЛ рднрд╛рдЧ рдЖрд╣реЗ coreutils рдорд╛рдирдХ рдЙрдмрдВрдЯреВ рдмрд┐рд▓реНрдбрдордзреНрдпреЗ.

рдХрд╛рд╣реА рдХрд╛рд│рд╛рдирдВрддрд░, рдЖрдордЪрд╛ рдХрд░реНрдирд▓ рдПрдХреНрдЭрд┐рдХреНрдпреВрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ ./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

рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЪрд░рдгрд╛рдВрдореБрд│реЗ рдПрдХ рд▓рд╣рд╛рди рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рддрдпрд╛рд░ рд╣реЛрдИрд▓. рдкреНрд░рдгрд╛рд▓реА рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдореБрд│реЗ, Alpine apk рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рджреНрд╡рд╛рд░реЗ рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЕрддреНрдпрдВрдд рдХрдареАрдг рд╣реЛрдИрд▓. рдкрд░рдВрддреБ рд╣реЗ рдПрдлрдПрд╕ рд╕рд╛рдорд╛рдиреНрдп рдХрд▓реНрдкрдирд╛рдВрдЪреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓.

рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдзрди рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЯрд┐рдиреА рдореЗрдорд░реА рд╡рд╛рдкрд░ рдерд╛рдВрдмрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЭреЛрдореНрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдордЪреЗ рдЕрддрд┐рдереА рдХрд░реНрдирд▓.

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

рдХрд░реНрдирд▓ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрдпрд╛рд░ рдХрд░рдгреЗ

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рдордзреНрдпреЗ, рдЗрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдкреНрд░рдорд╛рдгреЗ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рддрд░реНрдХ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. --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 рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ 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
/ # 

рд╡рд░реАрд▓ manipulations рдЖрдореНрд╣рд╛рд▓рд╛ рджреЗрдИрд▓ рдХрд┐рдорд╛рди рдЕрддрд┐рдереА рдкреНрд░рдгрд╛рд▓реА, рд╕рд╛рд░рдЦреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╢рд┐рд╡рд╛рдп /proc рдХрд┐рдВрд╡рд╛ рдирд┐рдпреБрдХреНрдд рд╣реЛрд╕реНрдЯрдирд╛рд╡. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЦрд╛рд▓реАрд▓ рдЖрдЬреНрдЮрд╛ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛:

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

рдЕрддрд┐рдереА рдкреНрд░рдгрд╛рд▓реАрддреВрди рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛ exit рдХрд┐рдВрд╡рд╛ рдХрдВрдЯреНрд░реЛрд▓-рдбреА рджрд╛рдмрд╛. рд╣реЗ рд╢реЗрд▓ рдлрд╛рдпрд░ рдХрд░реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░ рдХрд░реНрдирд▓ рдкреЕрдирд┐рдХ рд╣реЛрдИрд▓:

/ # exit
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
fish: тАЬ./linux root=/dev/root rootflagтАжтАЭ terminated by signal SIGABRT (Abort)

рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реА рдХрд░реНрдирд▓ рдкреЕрдирд┐рдХ рдорд┐рд│рд╛рд▓реА рдХрд╛рд░рдг рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдпрдЭреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗрд╣рдореАрдЪ рдЪрд╛рд▓реВ рдЕрд╕рддреЗ. рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп, рд╕рд┐рд╕реНрдЯрдо рдпрд╛рдкреБрдвреЗ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рдмрдВрдж рд╣реЛрдИрд▓. рдкрд░рдВрддреБ рд╣реА рдПрдХ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рддрдГрд▓рд╛ рдкрд╛рдард╡рддреЛ SIGABRT, рдЬреЗ рдмрд╛рд╣реЗрд░ рдкрдбрддреЗ.

рдЕрддрд┐рдереА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдкрдг рдЗрдереЗрдЪ рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдЧреЛрд╖реНрдЯреА рдЪреБрдХреАрдЪреНрдпрд╛ рд╣реЛрдК рд▓рд╛рдЧрддрд╛рдд. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╣реЗ рдЖрд╣реЗ рдЬреЗрдереЗ рдорд░реНрдпрд╛рджрд┐рдд "рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб" рдЪреА рд╕рдВрдкреВрд░реНрдг рд╕рдВрдХрд▓реНрдкрдирд╛ рдЦрдВрдбрд┐рдд рд╣реЛрдК рд▓рд╛рдЧрддреЗ. рд╢реЗрд╡рдЯреА, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рд╕рд╛ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░рд╛рд╡рд░ рдорд░реНрдпрд╛рджрд┐рдд рдЕрд╕рддреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЖрдкрд▓реНрдпрд╛ рд╕рд░реНрд╡рд╛рдВрд╕рд╛рдареА рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╛рдВрд╕рд╛рдареА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдореЛрдб.

рдиреЛрдВрдж рдкреНрд░рддрд┐.: рддреБрдореНрд╣реА UML рдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХрд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз рдкрд░реНрдпрд╛рдпрд╛рдВрдмрджреНрджрд▓ рдЕрдзрд┐рдХ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рдпреЗрдереЗ.

рд╕рд░рдХрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рд╡рд╛рд╕

рддрдерд╛рдкрд┐, рдирд╛рд╡рд╛рдЪреЗ рдПрдХ рдкреНрд░рд╛рдЪреАрди рдЖрдгрд┐ рдЕрдХреНрд╖рд░рд╢рдГ рдЕрд╕рдорд░реНрдерд┐рдд рд╕рд╛рдзрди рдЖрд╣реЗ рд╕реНрд▓рд┐рд░реНрдк, рдЬреНрдпрд╛рд╕рд╣ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореЛрдб Linux рдиреЗрдЯрд╡рд░реНрдХрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзреВ рд╢рдХрддреЛ. рд╣реЗ рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛-рд╕реНрддрд░реАрдп TCP/IP рд╕реНрдЯреЕрдХрдкреНрд░рдорд╛рдгреЗ рдЪрд╛рд▓рддреЗ рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рд┐рд╕реНрдЯрдо рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реАрдд. рд╣реЗ рд╕рд╛рдзрди рд╣реЛрддреЗ 1995 рдордзреНрдпреЗ рдкреНрд░рд╕рд┐рджреНрдз рдЭрд╛рд▓реЗ, рдЖрдгрд┐ рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рджрд┐рдирд╛рдВрдХ рдЖрд╣реЗ 2006. рд╕реНрд▓реАрд░реНрдк рдЦреВрдк рдЬреБрдиреА рдЖрд╣реЗ. рд╕рдорд░реНрдерди рдЖрдгрд┐ рдЕрджреНрдпрддрдирд╛рдВрд╢рд┐рд╡рд╛рдп, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрддрдХреЗ рдЖрд▓реЗ рдЖрд╣реЗрдд рдХреА рдЖрддрд╛ рдпрд╛ рд╕рд╛рдзрдирд╛рдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ "рдХреЛрдб рд░реЙрдЯ".

рддрд░, рдЙрдмрдВрдЯреВ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬрдордзреВрди рд╕реНрд▓рд┐рд░реНрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рдЖрдгрд┐ рддреЗ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛:

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.

рддреНрд░реБрдЯреА рдЖрдкрд▓реНрдпрд╛рд╡рд░ рдорд╛рд░рдд рдЖрд╣реЗ рд╣реА рдУрд│. рдЪрд▓рд╛ рд╕реНрдЯреЕрдХрдЯреНрд░реЗрд╕ рдкрд╛рд╣реВрдпрд╛, рдХрджрд╛рдЪрд┐рдд рдХрд╛рд╣реАрддрд░реА рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗрдереЗ рдорджрдд рдХрд░реЗрд▓:

(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, рдкреНрд░рдХрд╛рд░рд╛рдВрдкрд╛рд╕реВрди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ, рдХрд╛рд░реНрдп рдХрд░рддреЗ рдХрд╛ рддреЗ рдкрд╛рд╣реВ. рдореА рдереЗрдЯ рд╕рд╛рдЗрдЯрд╡рд░реВрди рд╕рдВрдЧреНрд░рд╣рдг рдкреБрдиреНрд╣рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗ рд╕реЛрд░реНрд╕рдлреЛрд░реНрдЬ, рдХрд╛рд░рдг рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рддреЗрдереВрди рдХрд╛рд╣реАрддрд░реА рдбреНрд░реЕрдЧ рдХрд░рдгреЗ рдПрдХ рд╡реЗрджрдирд╛ рдЖрд╣реЗ:

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

рдирд╛рд╣реА. рд╣реЗ рджреЗрдЦреАрд▓ рдХрд╛рдо рдХрд░рдд рдирд╛рд╣реА. рдЕрджреНрдпрд╛рдк рдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрд╕рд╛рдареА рдЪрд┐рдиреНрд╣реЗ рд╕рд╛рдкрдбрдд рдирд╛рд╣реАрдд.

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдореА рд╣рд╛рд░ рдорд╛рдирд▓реА рдЖрдгрд┐ рдЧрд┐рдереБрдмрд╡рд░ рд╢реЛрдзрдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА 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 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

рдкреЕрдХреЗрдЬрдЪреНрдпрд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдиреЗ рддреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реНрдпрд╛рд╕, I рдЖрд░рд╕рд╛ рдмрдирд╡рд▓рд╛.

рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

рдЖрддрд╛ рдЖрдордЪреНрдпрд╛ рдЕрддрд┐рдереА рдХреЛрд░рд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВрдпрд╛. рдЪрд▓рд╛ рд▓реЙрдиреНрдЪ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░реВрдпрд╛:

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 рд╕рд╣ рд▓реЕрдкрдЯреЙрдкрд╡рд░, рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рдврд╡рддрд╛рдирд╛ рдПрдХ рддреНрд░реБрдЯреА рдпреЗрддреЗ

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

рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛, рдХрд░реНрдирд▓ рдиреЗрдЯрд╡рд░реНрдХ рдбреНрд░рд╛рдЗрд╡реНрд╣ рдбреНрд░рд╛рдпрд╡реНрд╣рд░рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзреВ рд╢рдХрдд рдирд╛рд╣реА. рдХрд░реНрдирд▓рдордзреНрдпреЗ рдлрд░реНрдорд╡реЗрдЕрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди, рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдкрд░рд┐рд╕реНрдерд┐рддреА рд╕реБрдзрд╛рд░рд▓реА рдирд╛рд╣реА. рдкреНрд░рдХрд╛рд╢рдирд╛рдЪреНрдпрд╛ рд╡реЗрд│реА, рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЕрджреНрдпрд╛рдк рдХреЛрдгрддреЗрд╣реА рд╕рдорд╛рдзрд╛рди рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реА. рд╕реЛрдкреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд╡рд░ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓рдмреЙрдХреНрд╕рдордзреНрдпреЗ), рдЗрдВрдЯрд░рдлреЗрд╕ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд╡рд╛рдврд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ.

рдЦрд╛рд▓реАрд▓ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рдкрд░реВрди рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░реВрдпрд╛:

#!/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 export, рдЖрдгрд┐ рдирдВрддрд░ рдЕрддрд┐рдереА рдХрд░реНрдирд▓ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рд░реВрдЯрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рд╛. рдмрд░рдВ, рдордЧ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рд╛.

Freenode рд╡рд░ #lobsters рдХрдбреВрди Rkeene рдЪреЗ рд╡рд┐рд╢реЗрд╖ рдЖрднрд╛рд░. Slirp рдбреАрдмрдЧ рдХрд░рдгреНрдпрд╛рдд рддреНрдпрд╛рдЪреНрдпрд╛ рдорджрддреАрд╢рд┐рд╡рд╛рдп, рдореА рдЗрдердкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрд▓реЛ рдирд╕рддреЛ. рддреНрдпрд╛рдЪреА рд╕реНрд▓реЕрдХрд╡реЗрдЕрд░ рд╕рд┐рд╕реНрдЯреАрдо рд╕реНрд▓рд┐рд░реНрдкрд╕рд╣ рдХрд╢реА рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреА рдорд▓рд╛ рдХрд▓реНрдкрдирд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдорд╛рдЭреНрдпрд╛ рдЙрдмрдВрдЯреВ рдЖрдгрд┐ рдЕрд▓реНрдкрд╛рдЗрди рд╕рд┐рд╕реНрдЯреАрдордиреЗ рд╕реНрд▓рд┐рд░реНрдк рд╕реНрд╡реАрдХрд╛рд░рд▓реЗ рдирд╛рд╣реА рдЖрдгрд┐ рдмрд╛рдпрдирд░реА рд░рдХреАрдиреЗ рдорд▓рд╛ рд╕реБрдЪрд╡рд▓реЗ. рдкрд░рдВрддреБ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ рдХреА рдХрдореАрддрдХрдореА рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реАрддрд░реА рдХрд╛рд░реНрдп рдХрд░рддреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛