ProHoster > Blog > Rianachd > Mar a thòisicheas tu a’ cleachdadh Modh Cleachdaiche ann an Linux
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.
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:
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):
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.
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:
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.
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:
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:
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.