Conas tús a chur le Mód Úsáideora a úsáid i Linux

Réamhrá ón aistritheoir: I gcomhthéacs an iontráil ollmhór inár saol de chineálacha éagsúla coimeádán, is féidir go mbeadh sé suimiúil agus úsáideach a fháil amach cé na teicneolaíochtaí a thosaigh sé uair amháin. Is féidir cuid acu a úsáid go húsáideach go dtí an lá atá inniu ann, ach ní cuimhin le gach duine modhanna den sórt sin (nó tá a fhios acu mura raibh siad gafa le linn a bhforbairt tapa). Teicneolaíocht amháin den sórt sin is ea Mód Úsáideora Linux. Rinne údar an bhunleabhair a lán tochailt, ag fáil amach cé acu de na seanfhorbairtí atá fós ag obair agus nach bhfuil, agus chuir sé le chéile rud éigin cosúil le treoir céim ar chéim maidir le conas UML homebrew a fháil duit féin i 2k19. Agus tá, thugamar cuireadh d'údar an bhunphoist chuig Habr Cadey, mar sin má tá aon cheist agat - cuir ceist i mBéarla sna tuairimí.

Conas tús a chur le Mód Úsáideora a úsáid i Linux

Is é Mód Úsáideora i Linux, go deimhin, port den eithne Linux dó féin. Ligeann an modh seo duit eithne Linux iomlán a reáchtáil mar phróiseas úsáideora agus is minic a úsáideann forbróirí é chun tiománaithe a thástáil. Ach tá an modh seo úsáideach freisin mar uirlis leithlisithe ginearálta, a bhfuil an prionsabal cosúil le hoibriú meaisíní fíorúla. Soláthraíonn an modh seo níos mó aonrúcháin ná Docker, ach níos lú ná meaisín fíorúil lán-chuimsitheach cosúil le KVM nó Bosca Fíorúil.

Go ginearálta, d'fhéadfadh gur cosúil gur uirlis aisteach agus deacair é Mód Úsáideora a úsáid, ach tá a úsáidí fós aige. Tar éis an tsaoil, is eithne Linux lán-chuimsitheach é seo a ritheann ó úsáideoir neamhphribhléideach. Ceadaíonn an ghné seo cód a d'fhéadfadh a bheith neamhiontaofa a rith gan aon bhagairt ar an meaisín óstach. Agus ós rud é gur eithne lán-chuimsitheach é seo, tá a phróisis scoite amach ón meaisín óstach, .i ní bheidh próisis a ritheann taobh istigh de Mhód Úsáideora le feiceáil ag an ósta. Níl sé seo cosúil leis an gcoimeádán Docker is gnách, agus sa chás sin feiceann an meaisín óstach na próisis taobh istigh den stór i gcónaí. Féach ar an bpíosa pstree seo ó cheann de mo fhreastalaithe:

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 cuir é seo i gcomparáid le pstree an eithne Linux i Mód Úsáideora:

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

Agus mé ag obair le coimeádáin Docker, is féidir liom a fheiceáil ón óstach ainmneacha na bpróiseas atá ar siúl san aoi. Le Mód Úsáideora Linux, ní féidir é seo a dhéanamh. Céard is brí leis? Ciallaíonn sé seo go bhfuil uirlisí monatóireachta a ritheann trí fhochóras iniúchta Linux ná féach próisis a ritheann sa chóras aoi. Ach i gcásanna áirithe, is féidir leis an ngné seo a bheith ina claíomh dúbailte-imeall.

Go ginearálta, is éard atá sa phost iomlán thíos ná cnuasach taighde agus iarrachtaí garbha chun an toradh inmhianaithe a bhaint amach. Chun seo a dhéanamh, bhí orm uirlisí ársa éagsúla a úsáid, na foinsí eithne a léamh, dian-dhífhabhtú cód scríofa sna laethanta nuair a bhí mé fós sa bhunscoil, agus freisin tinker le Heroku builds ag baint úsáide as dénártha speisialta chun teacht ar na huirlisí a theastaigh uaim. . Thug an obair seo ar fad draíocht do na guys ar mo IRC. Tá súil agam go bhfeidhmíonn an post seo mar dhoiciméadú iontaofa do dhuine chun an rud céanna a thriail le eithne níos nuaí agus leaganacha OS.

coigeartú

Déantar Mód Úsáideora Linux a shocrú i roinnt céimeanna:

  • spleáchais a shuiteáil ar an ósta;
  • íoslódáil an eithne Linux;
  • cumraíocht thógáil eithne;
  • tionól eithne;
  • suiteáil dénártha;
  • an córas comhaid aoi a chumrú;
  • roghnú paraiméadair seolta eithne;
  • líonra aíonna a bhunú;
  • ag tosú ar an eithne aoi.

Glacaim leis má shocraíonn tú é a dhéanamh leat féin, is dóichí go ndéanfaidh tú gach rud a thuairiscítear i roinnt córas Ubuntu nó Debian. Rinne mé iarracht gach ceann de na nithe thuas a chur i bhfeidhm sa dáileadh is fearr liom - Alpach, ach níor tháinig aon rud de, de réir dealraimh toisc go bhfuil glibc-isms crua-cheangailteach ag an eithne Linux do thiománaithe i Mód Úsáideora. Tá sé beartaithe agam é seo a thuairisciú go dtí an sruth tar éis dom an fhadhb a thuiscint faoi dheireadh.

Suiteáil spleáchais ar an óstach

Tá na pacáistí seo a leanas ar a laghad ag teastáil ó Ubuntu chun an eithne Linux a thógáil (ag glacadh leis suiteáil glan):

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

Is féidir leat iad a shuiteáil leis an ordú seo a leanas (mar fhréamh nó le sudo):

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

Tabhair faoi deara go mbeidh gá le suiteáil an chláir socraithe roghchláir eithne Linux libncurses-dev. Cinntigh le do thoil go bhfuil sé suiteáilte leis an ordú seo a leanas (mar fhréamh nó le sudo):

apt-get -y install libncurses-dev

Íosluchtaigh kernel

Déan cinneadh nuair a íoslódáil agus ansin tóg an eithne. Don oibríocht seo, beidh ort thart ar 1,3 GB de spás diosca crua a leithdháileadh, mar sin déan cinnte go bhfuil sé agat.

Tar éis dul go dtí eithne.org agus faigh an URL chun an t-eithne cobhsaí is déanaí a íoslódáil. Ag am scríofa seo tá: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

Íoslódáil an comhad seo ag baint úsáide as 'wget':

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

Agus sliocht sé le 'tar':

tar xJf linux-5.1.16.tar.xz

Anois cuirimid isteach an t-eolaire a cruthaíodh agus an tarball á dhíphacáil:

cd linux-5.1.16

Socrú tógála eithne

Is sraith é an córas tógála eithne Comhaid a dhéanamh с go leor uirlisí saincheaptha agus scripteanna chun an próiseas a uathoibriú. Ar dtús, oscail an clár socraithe idirghníomhach:

make ARCH=um menuconfig

Tógfaidh sé go páirteach agus taispeánann sé bosca dialóige duit. Cathain '[Select]', beidh tú in ann a chumrú ag baint úsáide as na heochracha Spás nó Iontráil. Déan nascleanúint an fhuinneog, mar is gnách, leis na saigheada méarchlár "suas" agus "síos", agus roghnaigh eilimintí - "clé" nó "ar dheis".

Ciallaíonn an pointeoir amhairc —> go bhfuil tú i bhfo-roghchlár, a bhfuil rochtain air leis an eochair Enter. Is léir go bhfuil an bealach amach as é trí '[Exit]'.

Cuir na roghanna seo a leanas san áireamh i '[Select]' agus déan cinnte go bhfuil '[*]' in aice leo:

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 é, is féidir leat imeacht ón bhfuinneog seo trí '[Exit]'. Cinntigh go n-iarrtar ort an chumraíocht a shábháil ag an deireadh agus roghnaigh '[Yes]'.

Molaim duit imirt timpeall leis na roghanna tógála eithne tar éis duit an post seo a léamh. Trí na turgnaimh seo, is féidir leat go leor a fhoghlaim maidir le tuiscint a fháil ar obair na meicnic eithne íseal-leibhéil agus an tionchar a bhíonn ag bratacha éagsúla ar a thionól.

Ag tógáil an eithne

Is clár mór é an eithne Linux a dhéanann go leor rudaí. Fiú le cumraíocht chomh híseal sin ar sheanchrua-earraí, féadfaidh sé tamall fada a thógáil. Mar sin tóg an eithne leis an ordú seo a leanas:

make ARCH=um -j$(nproc)

I gcomhair Cad? Inseoidh an t-ordú seo dár dtógálaí gach croíleacan agus snáithe LAP atá ar fáil a úsáid sa phróiseas tógála. Foireann $(nproc) ag deireadh Tógann ionadach aschur an ordaithe nproc, atá mar chuid de coreutils i dtógáil caighdeánach Ubuntu.

Tar éis roinnt ama, déanfar ár eithne a thiomsú i gcomhad inrite ./linux.

Suiteáil an dénártha

Ós rud é go gcruthaíonn Mód Úsáideora i Linux dénártha rialta, is féidir leat é a shuiteáil cosúil le haon fóntais eile. Seo mar a rinne mé é:

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

Is fiú a chinntiú freisin go bhfuil ~/bin atá i do $PATH:

export PATH=$PATH:$HOME/bin

Socrú an chórais comhad aoi

Cruthaigh eolaire don chóras comhaid aoi:

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

Oscail alpinelinux.org agus isteach roinn íoslódáil Faigh an nasc fíor íoslódáil MINI ROOT FILESYSTEM. Ag am scríofa seo bhí:

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

Íoslódáil an tarball seo ag baint úsáide as 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

Anois cuir isteach eolaire an chórais comhad aoi agus bain an chartlann amach:

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

Cruthóidh na gníomhartha a thuairiscítear teimpléad córas comhaid beag. Mar gheall ar nádúr an chórais, beidh sé thar a bheith deacair pacáistí a shuiteáil tríd an mbainisteoir apk Alpach. Ach beidh an FS seo go leor chun an smaoineamh ginearálta a mheas.

Teastaíonn uirlis uainn freisin tini chun srian a chur le tomhaltas cuimhne Próisis zombie ár n-eithne aoi.

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

Líne ordaithe eithne a chruthú

Tá argóintí ordaithe ag an eithne Linux, cosúil le formhór na gclár eile, ar féidir rochtain a fháil orthu tríd an eochair a shonrú --help.

Féin - cabhrú

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.

Leagann an painéal seo béim ar phríomhpharaiméadair an tseolta. Rithfimid an t-eithne leis an íosmhéid roghanna atá ag teastáil:

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

Insíonn na línte thuas ár n-eithne an méid seo a leanas:

  • Glac leis gur feiste bréige é an fhréamhchóras comhad /dev/root.
  • Roghnaigh óstafs Mar tiománaí córas comhaid root.
  • Suiteáil an córas comhaid aoi a chruthaigh muid ar an bhfréamhghléas.
  • Agus tá, i mód léamh-scríobh.
  • Ná húsáid ach 64 MB de RAM (is féidir leat i bhfad níos lú a úsáid ag brath ar an méid atá beartaithe agat a dhéanamh, ach is cosúil gurb é 64 MB an méid is fearr).
  • Tosaíonn an eithne go huathoibríoch /bin/sh как init-próiseas.

Rith an t-ordú seo agus ba cheart duit rud éigin mar seo a leanas a fháil:

Bileog amháin 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
/ # 

Tabharfaidh na manipulations thuas dúinn córas aoi ar a laghad, sin rudaí mar /proc nó óstainm sannta. Mar shampla, bain triail as na horduithe seo a leanas:

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

Chun logáil amach as an aoi, cineál exit nó brúigh rialtán-d. Maróidh sé seo an bhlaosc agus scaoll eithne ina dhiaidh sin:

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

Fuair ​​​​muid an scaoll eithne seo toisc go gceapann an eithne Linux go bhfuil an próiseas tosaigh ar siúl i gcónaí. Gan é, ní féidir leis an gcóras feidhmiú a thuilleadh agus tuairteanna. Ach ós rud é gur próiseas de réir mód úsáideora é seo, seolann an t-aschur mar thoradh air féin chuig SIGABRT, as a dtagann aschur.

Socrú líonra aoi

Agus seo nuair a thosaíonn rudaí ag dul amú. Líonrú i Mód Úsáideora Linux is é an áit a dtosaíonn an coincheap iomlán de "mód úsáideora" teoranta ag titim as a chéile. Tar éis an tsaoil, de ghnáth ag leibhéal an chórais, tá an líonra teoranta pribhléideach modhanna forghníomhaithe ar chúiseanna intuigthe dúinn go léir.

Nóta. per.: is féidir leat tuilleadh a léamh faoi na roghanna éagsúla chun oibriú le líonra in UML anseo.

Turas go dtí Sliotán

Mar sin féin, tá uirlis ársa agus beagnach gan tacaíocht ar a dtugtar Sliotán, lena bhféadfaidh Mód Úsáideora Linux idirghníomhú leis an líonra. Oibríonn sé cosúil le cruach TCP/IP ar leibhéal úsáideora agus ní gá aon chead córais a rith. Bhí an uirlis seo scaoileadh i 1995, agus tá an nuashonrú is déanaí dátaithe 2006. Tá slip an-sean. Le linn an ama gan tacaíocht agus nuashonruithe, tá tiomsaitheoirí imithe go dtí seo nach féidir anois ach cur síos a dhéanamh ar an uirlis seo lobhadh cód.

Mar sin déanaimis Slirp a íoslódáil ó stórtha Ubuntu agus déan iarracht é a rith:

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)

Ó déithe. Déanaimis dífhabhtóir Slirp a shuiteáil agus féach an féidir linn a dhéanamh amach cad atá ar siúl anseo:

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.

Buaileann an earráid ionainn an líne seo. Breathnaímis ar an rian cruachta, b’fhéidir go gcuideoidh rud éigin linn ansin:

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

Anseo feicimid go dtarlaíonn an timpiste le linn thús na príomh-lúb nuair a dhéanann slirp iarracht seiceáil le haghaidh teorainneacha ama. Ag an bpointe seo, bhí orm éirí as ag iarraidh dífhabhtú a dhéanamh. Ach a ligean ar a fheiceáil má Slirp tógtha ó shaghas oibreacha. Athíoslódáil mé an chartlann go díreach ón suíomh Foinse, mar is pian é rud éigin a tharraingt as sin tríd an líne ordaithe:

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

Anseo feicimid foláirimh faoi fheidhmeanna neamhshainithe ionsuite, is é sin, faoin neamhábaltacht chun an comhad dénártha mar thoradh air a nascadh. Dealraíonn sé gur stop an gcc idir 2006 agus an pointe seo, ag táirgeadh siombailí a úsáideadh i bhfeidhmeanna ionsuite comhaid tiomsaithe idirmheánacha. Déanaimis iarracht an eochairfhocal a athsholáthar inline ar nóta folamh agus féach ar an toradh:

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

Ní hea. Ní oibríonn sé seo ach an oiread. Ní féidir siombailí a aimsiú do na feidhmeanna seo fós.

Ag an bpointe seo, thug mé suas agus thosaigh mé ag féachaint ar Github Heroku pacáistí a thógáil. Ba é an teoiric a bhí agam ná go mbeadh na binaries a bhí de dhíth orm i bpacáiste tógála Heroku. Sa deireadh, thug an cuardach mé thar anseo. Íoslódáil mé agus dhíphacáil mé uml.tar.gz agus fuair sé an méid seo a 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 é seo an dénártha dénártha! An oibríonn sé?

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

Ní tuairteála - mar sin ba chóir go n-oibreoidh sé! Cuirimis an dénártha seo isteach ~/bin/slirp:

cp slirp ~/bin/slirp

I gcás go mbainfidh cruthaitheoir an phacáiste é, I rinne scáthán.

Cumraíocht líonra

Anois, déanaimis an líonra a bhunú ar ár n-eithne aoi. Nuashonraigh roghanna seolta:

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

Anois cuirimis an líonra ar siúl:

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

An chéad dá ordú cumraíochta /proc и /sys riachtanach don obair ifconfig, a leagann an comhéadan líonra chun cumarsáid a dhéanamh le Slirp. Foireann route socraíonn sé an tábla ródaithe eithne chun iallach a chur ar gach trácht a sheoladh tríd an tollán Slirp. Déanaimis é seo a sheiceáil 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

Oibríonn sé!

Nóta per .: De réir dealraimh, scríobhadh an post bunaidh ar dheasc le cárta líonra sreangaithe, nó cumraíocht éigin eile nach raibh gá le tiománaithe breise. Ar ríomhaire glúine le WiFi 8265 ó Intel, tarlaíonn earráid agus an líonra á ardú

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

De réir dealraimh, ní féidir leis an eithne cumarsáid a dhéanamh le tiománaí an chárta líonra. Ar an drochuair, níor réitigh iarracht an firmware a thiomsú isteach san eithne an cás. Tráth an fhoilsithe, níorbh fhéidir teacht ar réiteach sa chumraíocht seo. Ar chumraíochtaí níos simplí (mar shampla, i Virtualbox), ardaíonn an comhéadan i gceart.

Déanaimis an t-atreorú a uathoibriú leis an script bhlaosc seo 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 marcáil inrite é:

chmod +x init.sh

Agus ansin déanfaimid athruithe ar an líne ordaithe eithne:

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

Agus déanaimis arís:

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

Tá an líonra cobhsaí!

comhad docker

Chun é a dhéanamh níos éasca duit é seo go léir a sheiceáil, bhailigh mé dockerfile, a uathoibríonn an chuid is mó de na céimeanna a thuairiscítear agus ba cheart go dtabharfadh sé cumraíocht oibre duit. Tá agam freisin eithne réamhchumraithe, a bhfuil gach rud a thuairiscítear sa phost. Ach tá sé tábhachtach a thuiscint nach bhfuil leagtha amach agam anseo ach an socrú íosta.

Tá súil agam gur chabhraigh an post seo leat tuiscint a fháil ar conas eithne aoi a ardú. Tharla gur ollphéist de chineál éigin a bhí ann, ach ceapadh an foilseachán mar threoir chuimsitheach ar thógáil, suiteáil agus chumrú Mód Úsáideora i Linux faoi leaganacha nua-aimseartha de chórais oibriúcháin an teaghlaigh seo. Ba cheart go n-áireofaí sna chéad chéimeanna eile seirbhísí agus bogearraí eile a shuiteáil laistigh den chóras aoi cheana féin. Ós rud é nach bhfuil in íomhánna coimeádáin Docker ach tarballs poiblíochta, ba cheart go mbeifeá in ann an íomhá a bhaint as docker export, agus ansin a chonair suiteála a chinneadh i bhfréamh chóras comhaid an eithne aoi. Bhuel, ansin rith an script bhlaosc.

Buíochas ar leith do Rkeene ó #lobsters ar Freenode. Gan a chabhair debugging Slirp, ní bheinn tar éis dul chomh fada seo. Níl aon smaoineamh agam conas a oibríonn a chóras Slackware i gceart le slirp, ach níor ghlac mo chórais Ubuntu agus Alpach le slirp agus mhol an dénártha Rkeene dom. Ach is leor domsa go n-oibríonn rud éigin dom ar a laghad.

Foinse: will.com

Add a comment