Mar a thòisicheas tu a’ cleachdadh Modh Cleachdaiche ann an Linux

Ro-ràdh bhon eadar-theangair: An aghaidh cùl-raon an t-slighe a-steach do ar beatha de dhiofar sheòrsaichean de shoithichean, faodaidh e a bhith gu math inntinneach agus feumail faighinn a-mach leis na teicneòlasan a thòisich e uile aon uair. Faodar cuid dhiubh a chleachdadh gu feumail chun an latha an-diugh, ach chan eil cuimhne aig a h-uile duine air na dòighean sin (no fios mura deach an glacadh fhad ‘s a bha iad a’ leasachadh gu luath). Is e aon theicneòlas den leithid Modh Cleachdaiche Linux. Rinn ùghdar a’ chiad dreach tòrr cladhach, a’ faighinn a-mach dè na seann leasachaidhean a tha fhathast ag obair agus nach eil, agus chuir e ri chèile rudeigin mar stiùireadh ceum air cheum air mar a gheibh thu UML dachaigh dhut fhèin ann an 2k19. Agus tha, thug sinn cuireadh do ùghdar a’ phuist thùsail gu Habr Cadaidh, mar sin ma tha ceist sam bith agad - faighnich sa Bheurla anns na beachdan.

Mar a thòisicheas tu a’ cleachdadh Modh Cleachdaiche ann an Linux

Tha Modh Cleachdaiche ann an Linux, gu dearbh, na phort den kernel Linux dha fhèin. Leigidh am modh seo leat kernel Linux slàn a ruith mar phròiseas neach-cleachdaidh agus tha e air a chleachdadh gu cumanta le luchd-leasachaidh gus deuchainn a dhèanamh air draibhearan. Ach tha am modh seo cuideachd feumail mar inneal aonaranachd coitcheann, agus tha am prionnsapal sin coltach ri obrachadh innealan brìgheil. Tha am modh seo a’ toirt barrachd aonaranachd na Docker, ach nas lugha na inneal brìgheil làn-chuimseach mar KVM no Virtual Box.

San fharsaingeachd, is dòcha gum bi Modh Cleachdaiche coltach ri inneal neònach agus duilich a chleachdadh, ach tha e fhathast ga chleachdadh. Às deidh na h-uile, is e kernel Linux làn-chuimsichte a tha seo a ’ruith bho neach-cleachdaidh gun bhuannachd. Leigidh am feart seo le còd a dh’ fhaodadh a bhith neo-earbsach a ruith gun chunnart sam bith don inneal aoigheachd. Agus leis gur e kernel làn-chuimseach a tha seo, tha na pròiseasan aige air an sgaradh bhon inneal aoigheachd, is e sin cha bhith pròiseasan a tha a’ ruith taobh a-staigh Modh Cleachdaiche rim faicinn don òstair. Chan eil seo coltach ris an inneal àbhaisteach Docker, agus mar sin bidh an inneal aoigheachd an-còmhnaidh a’ faicinn nam pròiseasan taobh a-staigh an stòr. Seall air a’ phìos pstree seo bho aon de na frithealaichean agam:

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

Agus dèan coimeas eadar seo agus pstree an kernel Linux ann am Modh Cleachdaiche:

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

Nuair a bhios mi ag obair le soithichean Docker, chì mi bhon òstair ainmean nam pròiseasan a tha a’ ruith san aoigh. Le Modh Cleachdaiche Linux, chan eil seo comasach. Dè a tha e a’ ciallachadh? Tha seo a 'ciallachadh gu bheil innealan sgrùdaidh a' ruith tro fho-shiostam sgrùdaidh Linux nach faic pròiseasan a tha a’ ruith san t-siostam aoighean. Ach ann an cuid de shuidheachaidhean faodaidh am feart seo a bhith na chlaidheamh dà-oir.

San fharsaingeachd, tha an dreuchd gu h-ìosal na chruinneachadh de rannsachadh agus oidhirpean garbh gus an toradh a tha thu ag iarraidh a choileanadh. Gus seo a dhèanamh, bha agam ri diofar innealan àrsaidh a chleachdadh, na stòran kernel a leughadh, sgrùdadh dian a dhèanamh air còd a chaidh a sgrìobhadh anns na làithean nuair a bha mi fhathast sa bhun-sgoil, agus cuideachd tinker le togalaichean Heroku a’ cleachdadh binary sònraichte gus na h-innealan a bha a dhìth orm a lorg. . Thug an obair seo gu lèir air na balaich air an IRC agam draoidheachd a ghairm dhomh. Tha mi an dòchas gum bi an dreuchd seo mar sgrìobhainnean earbsach airson cuideigin a bhith a’ feuchainn air an aon rud le kernels nas ùire agus dreachan OS.

adjustment

Tha stèidheachadh Modh Cleachdaiche Linux air a dhèanamh ann an grunn cheumannan:

  • stàladh eisimeileachd air an òstair;
  • luchdachadh sìos an Linux kernel;
  • rèiteachadh togail kernel;
  • co-chruinneachadh kernel;
  • stàladh binary;
  • rèiteachadh an t-siostam faidhle aoighean;
  • taghadh de pharamadairean cur air bhog kernel;
  • stèidheachadh lìonra aoighean;
  • tòiseachadh air an aoigh kernel.

Tha mi a’ gabhail ris ma cho-dhùnas tu a dhèanamh leat fhèin, is coltaiche gun dèan thu a h-uile dad a tha air a mhìneachadh ann an siostam coltach ri Ubuntu no Debian. Dh’ fheuch mi ris a h-uile rud gu h-àrd a chuir an gnìomh anns an sgaoileadh as fheàrr leam - Alpach, ach cha tàinig dad dheth, a rèir coltais air sgàth gu bheil glibc-isms cruaidh-ceangail aig an kernel Linux airson draibhearan ann am Modh Cleachdaiche. Tha mi an dùil seo aithris gu shuas an abhainn às deidh dhomh an duilgheadas a thuigsinn mu dheireadh.

Stàladh eisimeileachd air an òstair

Feumaidh Ubuntu co-dhiù na pacaidean a leanas gus an kernel Linux a thogail (a’ gabhail ris stàladh glan):

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

Faodaidh tu an stàladh leis an àithne a leanas (mar fhreumh no le sudo):

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

Thoir an aire gum feum am prògram rèiteachaidh clàr kernel Linux a bhith air a stàladh libncurses-dev. Dèan cinnteach gu bheil e air a chuir a-steach leis an àithne a leanas (mar fhreumh no le sudo):

apt-get -y install libncurses-dev

Kernel luchdadh a-nuas

Dèan co-dhùnadh càite an luchdaich thu sìos agus an uairsin tog an kernel. Airson an obrachaidh seo, feumaidh tu timcheall air 1,3 GB de dh’ àite diosc cruaidh a riarachadh, mar sin dèan cinnteach gu bheil e agad.

Às deidh a dhol gu kernel.org agus faigh an URL gus an kernel seasmhach as ùire a luchdachadh sìos. Aig àm sgrìobhaidh seo tha: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Luchdaich sìos am faidhle seo a 'cleachdadh 'wget':

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

Agus thoir a-mach e le 'tar':

tar xJf linux-5.1.16.tar.xz

A-nis cuiridh sinn a-steach an eòlaire a chaidh a chruthachadh nuair a bhios sinn a’ dì-phapadh an tarball:

cd linux-5.1.16

Suidheachadh togail kernel

Tha an siostam togail kernel na sheata Dèan faidhlichean с mòran innealan àbhaisteach agus sgriobtaichean gus am pròiseas a dhèanamh fèin-ghluasadach. Gus tòiseachadh, fosgail am prògram rèiteachaidh air-loidhne:

make ARCH=um menuconfig

Togaidh e gu ìre agus seallaidh e bogsa deasbaid dhut. Cuin '[Select]', bidh e comasach dhut a rèiteachadh le bhith a’ cleachdadh na h-iuchraichean Space or Enter. Tha seòladh timcheall na h-uinneige mar as àbhaist a’ cleachdadh na saighdean meur-chlàr “suas” agus “sìos”, agus tha taghadh eileamaidean “clì” no “deas”.

Tha am puing seallaidh -> a’ ciallachadh gu bheil thu ann am fo-chlàr, a gheibh thu thuige leis an iuchair Enter. Tha an t-slighe a-mach gu follaiseach tro '[Exit]'.

Cuir a-steach na roghainnean a leanas ann an '[Select]' agus dèan cinnteach gu bheil samhla '[*]' ri thaobh:

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

Sin agad e, 's urrainn dhut an uinneag seo fhàgail le bhith a' taghadh '[Exit]'. Dìreach dèan cinnteach gu bheil thu air do bhrosnachadh aig an deireadh an rèiteachadh a shàbhaladh agus tagh '[Yes]'.

Tha mi a’ moladh gun cluich thu timcheall leis na roghainnean togail kernel às deidh dhut am post seo a leughadh. Tro na deuchainnean sin, faodaidh tu tòrr ionnsachadh a thaobh tuigse fhaighinn air obair meacanaig kernel aig ìre ìosal agus buaidh diofar bhrataichean air a cho-chruinneachadh.

A 'togail an kernel

Tha an kernel Linux na phrògram mòr a bhios a’ dèanamh tòrr rudan. Eadhon leis an rèiteachadh as lugha seo air seann bhathar-cruaidh, faodaidh co-chruinneachadh ùine mhòr a thoirt. Mar sin tog an kernel a’ cleachdadh an àithne a leanas:

make ARCH=um -j$(nproc)

Airson dè? Innsidh an àithne seo don neach-togail againn na coraichean agus na snàithleanan CPU uile a tha rim faighinn a chleachdadh sa phròiseas togail. Sgioba $(nproc) aig deireadh Build cuir toradh an àithne an àite nproc, a tha na phàirt de coreutils ann an togail àbhaisteach Ubuntu.

Às deidh beagan ùine, thèid an kernel againn a chuir ri chèile ann am faidhle so-ghnìomhaichte ./linux.

A stàladh binary

Leis gu bheil Modh Cleachdaiche ann an Linux a’ cruthachadh binary cunbhalach, faodaidh tu a stàladh mar ghoireas sam bith eile. Seo mar a rinn mi e:

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

Is fhiach a bhith cinnteach sin cuideachd ~/bin tha ann do $PATH:

export PATH=$PATH:$HOME/bin

A’ stèidheachadh an t-siostam faidhle aoighean

Cruthaich eòlaire airson an t-siostam faidhle aoighean:

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

Fosgail alpinelinux.org agus a-steach roinn luchdachadh sìos Lorg an fhìor cheangal luchdaich sìos MINI ROOT FILESYSTEM. Aig àm sgrìobhaidh bha seo:

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

Luchdaich sìos an tarball seo a ’cleachdadh 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

A-nis cuir a-steach eòlaire an t-siostam faidhle aoighean agus thoir a-mach an tasglann:

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

Cruthaichidh na gnìomhan a chaidh a mhìneachadh teamplaid siostam faidhle beag. Air sgàth nàdar an t-siostaim, bidh e air leth duilich pacaidean a chuir a-steach tro mhanaidsear Alpach apk. Ach bidh an FS seo gu leòr airson a’ bheachd choitcheann a mheasadh.

Feumaidh sinn inneal cuideachd tini gus casg a chuir air caitheamh cuimhne pròiseasan zombie ar n-aoigh kernel.

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

A 'cruthachadh loidhne-àithne kernel

Tha argamaidean loidhne-àithne aig an kernel Linux, mar a’ mhòr-chuid de phrògraman eile, a gheibhear thuige le bhith a’ sònrachadh an iuchair --help.

E fhèin - cuidich

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.

Bidh am pannal seo a’ soilleireachadh prìomh pharamadairean an t-seisein. Feuch an ruith sinn an kernel leis an t-seata roghainnean as lugha a tha a dhìth:

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

Tha na loidhnichean gu h-àrd ag innse na leanas don kernel againn:

  • Gabhamaid ris gur e inneal meallta a th’ anns an t-siostam freumh-fhaidhlichean /dev/root.
  • Tagh aoigheachdfs Mar draibhear airson root file system.
  • Stàlaich an siostam faidhlichean aoighean a chruthaich sinn air an inneal root.
  • Agus tha, ann am modh leughaidh-sgrìobhaidh.
  • Cleachd dìreach 64 MB de RAM (faodaidh tu tòrr nas lugha a chleachdadh a rèir na tha thu an dùil a dhèanamh, ach tha coltas gur e 64 MB an ìre as fheàrr).
  • Tòisichidh an kernel gu fèin-ghluasadach /bin/sh ciamar init-pròiseas.

Ruith an àithne seo agus bu chòir dhut rudeigin mar na leanas fhaighinn:

Duilleag eile

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

Bheir na dòighean-làimhseachaidh gu h-àrd dhuinn siostam aoighean as ìsle, gun rudan mar /proc no ainm aoigheachd ainmichte. Mar eisimpleir, feuch na h-òrdughan a leanas:

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

Gus logadh a-mach às an aoigh, dèan seòrsa exit no brùth smachd-d. Marbhaidh seo an t-slige agus an uairsin clisgeadh kernel:

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

Fhuair sinn an clisgeadh kernel seo oir tha an kernel Linux den bheachd gu bheil am pròiseas tòiseachaidh an-còmhnaidh a’ ruith. Às aonais, chan urrainn don t-siostam obrachadh tuilleadh agus tuitidh e. Ach leis gur e pròiseas modh cleachdaiche a tha seo, bidh an toradh a thig às a’ dol gu SIGABRT, a tha a’ leantainn chun t-slighe a-mach.

A 'stèidheachadh lìonra aoighean

Agus seo far a bheil cùisean a’ tòiseachadh a’ dol ceàrr. Is e lìonrachadh ann am Modh Cleachdaiche Linux far a bheil a’ bhun-bheachd iomlan de “modh cleachdaiche” cuibhrichte a’ tòiseachadh a’ tuiteam às a chèile. Às deidh na h-uile, mar as trice aig ìre an t-siostaim, tha an lìonra cuingealaichte sochair modhan cur gu bàs airson adhbharan so-thuigsinn uile.

Thoir an aire per .: Faodaidh tu barrachd a leughadh mu dhiofar roghainnean airson a bhith ag obair le lìonra ann an UML an seo.

Turas gu Slip

Ach, tha inneal àrsaidh agus cha mhòr gun taic ris an canar Sliochd, leis an urrainn User Mode Linux eadar-obrachadh leis an lìonra. Bidh e ag obair gu ìre mar stac TCP/IP aig ìre neach-cleachdaidh agus chan fheum e cead siostam sam bith airson a ruith. Bha an inneal seo fhoillseachadh ann an 1995, agus tha ceann-latha air an ùrachadh as ùire 2006 bliadhna. Tha sliochd gu math sean. Rè na h-ùine às aonais taic agus ùrachaidhean, tha luchd-cruinneachaidh air a thighinn cho fada agus a-nis chan urrainnear an inneal seo a mhìneachadh ach mar "code rot".

Mar sin leig dhuinn Slirp a luchdachadh sìos bho stòran Ubuntu agus feuch ris a ruith:

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)

O dhiathan. Nach stàlaich sinn dì-bhugadair Slirp agus feuch an urrainn dhuinn faighinn a-mach dè a tha a’ dol an seo:

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.

Tha a’ mhearachd a’ bualadh oirnn an loidhne seo. Bheir sinn sùil air an stacan, is dòcha gun cuidich rudeigin sinn an sin:

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

An seo chì sinn gu bheil an tubaist a’ tachairt nuair a thòisicheas a’ phrìomh lùb, nuair a bhios sliprp a’ feuchainn ri sùil a thoirt air na h-ùineachan. B’ ann aig an àm seo a bha agam ri leigeil seachad a’ feuchainn ri dì-bhugachadh. Ach chì sinn a bheil Slirp, a chaidh a thogail bho sheòrsa, ag obair. Rinn mi ath-luchdachadh sìos an tasglann gu dìreach bhon làrach Stòr-dàta, oir tha e na phian a bhith a’ slaodadh rudeigin às an sin tron ​​​​loidhne àithne:

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

An seo chì sinn rabhaidhean mu ghnìomhan togte neo-mhìnichte, is e sin, mu cho neo-chomasach ’s a tha e am faidhle binary a thig às a cheangal. Tha e coltach gun do sguir gcc eadar 2006 agus a-nis a’ cruthachadh samhlaidhean a chaidh a chleachdadh ann an gnìomhan eadar-mheadhanach togte. Feuchaidh sinn ri am prìomh fhacal a chuir na àite inline gu beachd falamh agus thoir sùil air an toradh:

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

Chan eil. Chan eil seo ag obair idir. Chan urrainn dhuinn fhathast samhlaidhean a lorg airson nan gnìomhan sin.

Aig an ìre seo, leig mi seachad agus thòisich mi a 'coimhead air Github Heroku pacaidean togail. B ’e an teòiridh agam gum biodh na binaries a bha a dhìth orm ann am pasgan togail Heroku. Aig a 'cheann thall, thug an rannsachadh mi thall an seo. Rinn mi luchdachadh sìos agus dì-phapadh uml.tar.gz agus lorg e na leanas:

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*

Is e seo am binary sleamhainn! A bheil e ag obair?

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

Chan eil e a’ bualadh - mar sin bu chòir dha obrachadh! Nach cuir sinn am binary seo a-steach ~/bin/slirp:

cp slirp ~/bin/slirp

Air eagal ‘s gun toir neach-cruthachaidh a’ phacaid air falbh e, I rinn sgàthan.

Suidhich lìonra

A-nis leig dhuinn an lìonra a rèiteachadh air cridhe an aoigh againn. Nach ùraich sinn na paramadairean tòiseachaidh:

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

A-nis tionndaidhidh sinn an lìonra:

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

A 'chiad dà òrdugh rèiteachaidh /proc и /sys riatanach airson obair ifconfig, a tha a 'suidheachadh an eadar-aghaidh lìonra gus conaltradh le Slirp. Sgioba route a’ suidheachadh clàr slighe nan kernel gus toirt air a h-uile trafaic a chuir tro thunail Slirp. Feuch an dèan sinn sgrùdadh air seo le ceist 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

Tha e ag obair!

Nota gach .: A rèir coltais, chaidh am post tùsail a sgrìobhadh air deasg le cairt lìonra uèirleas, no rèiteachadh eile nach robh feumach air draibhearan a bharrachd. Air laptop le WiFi 8265 bho Intel, bidh mearachd a ’tachairt nuair a thogas tu an lìonra

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

A rèir coltais, chan urrainn don kernel conaltradh le draibhear a’ chairt lìonraidh. Gu mì-fhortanach, cha do rinn oidhirp gus am firmware a chuir ri chèile a-steach don kernel an suidheachadh a cheartachadh. Aig àm an fhoillseachaidh, cha robh e comasach fuasgladh a lorg san rèiteachadh seo. Air rèiteachaidhean nas sìmplidh (mar eisimpleir, ann an Virtualbox), tha an eadar-aghaidh ag èirigh gu ceart.

Nach dèan sinn fèin-ghluasad air an ath-stiùireadh a’ cleachdadh an sgriobt shligean a leanas:

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

Agus comharraich e so-ghnìomhaichte:

chmod +x init.sh

Agus an uairsin nì sinn atharrachaidhean air an loidhne-àithne kernel:

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

Agus dèanamaid a-rithist:

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

Tha an lìonra seasmhach!

faidhle docker

Gus a dhèanamh nas fhasa dhut seo a sgrùdadh, tha mi air cruinneachadh Faidhle docker, a nì fèin-ghluasad air a’ mhòr-chuid de na ceumannan a chaidh a mhìneachadh agus a bu chòir dhut rèiteachadh obrach a thoirt dhut. Tha agam cuideachd kernel ro-shuidhichte, aig a bheil a h-uile dad a tha air a mhìneachadh anns an dreuchd. Ach tha e cudromach tuigsinn nach do mhìnich mi an seo ach an suidheachadh as ìsle.

Tha mi an dòchas gu bheil an dreuchd seo air do chuideachadh le bhith a’ tuigsinn mar a thogas tu kernel aoigh. Thionndaidh a-mach gur e uilebheist de sheòrsa air choreigin a bh’ ann, ach chaidh am foillseachadh a dhealbhadh mar stiùireadh coileanta air togail, stàladh agus rèiteachadh Modh Cleachdaiche ann an Linux fo dhreachan ùr-nodha de shiostaman obrachaidh an teaghlaich seo. Bu chòir na h-ath cheumannan a bhith a’ toirt a-steach stàladh sheirbheisean agus bathar-bog eile a tha taobh a-staigh an t-siostam aoighean mu thràth. Leis gur e dìreach tarballan sanasachd a th’ ann an ìomhaighean Docker container, bu chòir dhut a bhith comasach air an ìomhaigh a tharraing troimhe docker export, agus an uairsin dearbhaich an t-slighe airson a stàladh ann am freumh siostam faidhle kernel an aoigh. Uill, an uairsin ruith an sgriobt shligean.

Taing shònraichte do Rkeene bho #lobsters air Freenode. Às aonais a chuideachadh a’ debugging Slirp, cha bhithinn air faighinn cho fada seo. Chan eil fios agam ciamar a tha an siostam Slackware aige ag obair gu ceart le slirp, ach cha do ghabh na siostaman Ubuntu agus Alpach agam ri slirp agus mhol am binary Rkeene dhomh. Ach tha e gu leòr dhòmhsa gu bheil co-dhiù rudeigin ag obair dhòmhsa.

Source: www.habr.com

Cuir beachd ann