Introduction du traducteur: Dans le contexte de l'entrĂ©e massive dans notre vie de diffĂ©rents types de conteneurs, il peut ĂȘtre trĂšs intĂ©ressant et utile de dĂ©couvrir avec quelles technologies tout a commencĂ© une fois. Certaines d'entre elles peuvent ĂȘtre utilisĂ©es Ă ce jour, mais tout le monde ne se souvient pas de telles mĂ©thodes (ou sait si elles n'ont pas Ă©tĂ© trouvĂ©es lors de leur dĂ©veloppement rapide). L'une de ces technologies est le mode utilisateur Linux. L'auteur de l'original a farfouillĂ©, trouvant ce qui fonctionnait encore et ce qui ne fonctionnait pas beaucoup, et a rassemblĂ© quelque chose comme une instruction Ă©tape par Ă©tape sur la façon de dĂ©marrer UML maison en 2k19 pour moi-mĂȘme. Et oui, nous avons invitĂ© l'auteur du post original de Cadey Ă Habr , donc si vous avez des questions, posez-les en anglais dans les commentaires.
Le mode utilisateur Linux est, en fait, le port du noyau Linux lui-mĂȘme. Ce mode vous permet d'exĂ©cuter un noyau Linux Ă part entiĂšre en tant que processus utilisateur et est gĂ©nĂ©ralement utilisĂ© par les dĂ©veloppeurs pour tester les pilotes. Mais ce mode est Ă©galement utile comme outil d'isolement gĂ©nĂ©ral, dont le principe est similaire au fonctionnement des machines virtuelles. Ce mode offre plus d'isolement que Docker, mais moins qu'une machine virtuelle Ă part entiĂšre comme KVM ou Virtual Box.
En général, le mode utilisateur peut sembler étrange et difficile à utiliser, mais il a toujours ses propres domaines d'application. AprÚs tout, c'est un noyau Linux à part entiÚre, travaillant à partir d'un utilisateur non privilégié. Cette fonctionnalité vous permet d'exécuter du code potentiellement non fiable sans aucune menace pour la machine hÎte. Et comme il s'agit d'un noyau à part entiÚre, ses processus sont isolés de la machine hÎte, c'est-à -dire que les
processus exĂ©cutĂ©s en mode utilisateur ne seront pas visibles pour l'hĂŽte . Ce n'est pas comme le conteneur Docker habituel, auquel cas la machine hĂŽte voit toujours les processus Ă l'intĂ©rieur du rĂ©fĂ©rentiel. Jetez un Ćil Ă ce morceau de pstree depuis l'un de mes serveurs:
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}]
Et comparez cela au noyau Linux pstree en mode utilisateur:
linuxââŹâ5*[linux] ââslirp
Lorsque je travaille avec des conteneurs Docker, je peux voir les noms des processus qui s'exécutent sur le systÚme invité à partir de l'hÎte. Avec le mode utilisateur Linux, ce n'est pas possible. Qu'est-ce que cela signifie? Cela signifie que les outils de surveillance qui fonctionnent via le sous-systÚme d'audit de Linux
ne voient pas les processus s'exécuter sur le systÚme invité. Mais dans certaines situations, cette fonction peut devenir une épée à double tranchant.
En gĂ©nĂ©ral, l'intĂ©gralitĂ© du post ci-dessous est un ensemble d'Ă©tudes et de tentatives grossiĂšres pour obtenir le rĂ©sultat souhaitĂ©. Pour ce faire, j'ai dĂ» utiliser divers outils anciens, lire les sources du noyau, dĂ©boguer intensivement le code Ă©crit alors que j'Ă©tais encore Ă l'Ă©cole primaire, et aussi parcourir les assemblages Heroku Ă l'aide d'un binaire spĂ©cial Ă la recherche des outils dont j'avais besoin. Tout ce travail a amenĂ© les gars de mon IRC Ă m'appeler magique. J'espĂšre que ce message servira de documentation fiable Ă quelqu'un afin de tout lancer de la mĂȘme maniĂšre, mais avec des noyaux et des versions de systĂšme d'exploitation plus rĂ©cents.
Personnalisation
La configuration du mode utilisateur Linux prend plusieurs étapes:
- installation de dépendances sur l'hÎte;
- Téléchargement du noyau Linux
- configuration de l'assemblage du noyau;
- assemblage du noyau;
- installation binaire;
- configuration du systÚme de fichiers invité;
- sélection des paramÚtres de lancement du noyau;
- configuration du réseau invité;
- démarrage du noyau invité.
Je suppose que si vous dĂ©cidez de tout lancer vous-mĂȘme, vous ferez probablement tout ce qui est dĂ©crit dans certains systĂšmes Ubuntu ou Debian. J'ai essayĂ© d'implĂ©menter tout ce qui prĂ©cĂšde dans ma distribution prĂ©fĂ©rĂ©e - Alpine, mais rien n'en est sorti, apparemment, car le noyau Linux avait une liaison stricte sur les glibc-isms pour les pilotes en mode utilisateur. J'ai l'intention de signaler cela Ă l'amont aprĂšs avoir enfin compris le problĂšme.
Installer les dépendances sur l'hÎte
Ubuntu nécessite au moins les packages suivants pour construire le noyau Linux (à condition d'une installation propre):
- 'build-essential'
- 'flex'
- 'bison'
- 'xz-utils'
- 'wget'
- 'ca-certificates'
- 'bc'
- 'linux-headers'
Vous pouvez les installer en utilisant la commande suivante (avec les privilĂšges root ou en utilisant sudo):
apt-get -y install build-essential flex bison xz-utils wget ca-certificates bc \ linux-headers-$(uname -r)
Notez que l'exécution du programme de configuration du menu pour le noyau Linux nécessitera l'installation de
libncurses-dev
. Veuillez vous assurer qu'il est installé à l'aide de la commande suivante (avec les privilÚges root ou avec sudo):
apt-get -y install libncurses-dev
Téléchargement du noyau
Déterminez l'emplacement de chargement et d'assemblage ultérieur du noyau. Pour cette opération, vous devrez allouer environ 1,3 Go d'espace disque dur, alors assurez-vous d'en avoir un.
Allez ensuite sur
kernel.org et obtenez l'URL pour télécharger la derniÚre version stable du noyau. Au moment de la rédaction de cet article:
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xzTéléchargez ce fichier en utilisant
'wget'
:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz
Et extrayez-le avec
'tar'
:
tar xJf linux-5.1.16.tar.xz
Maintenant, nous entrons dans le répertoire créé lors du déballage de l'archive tar:
cd linux-5.1.16
Configuration de la construction du noyau
Le systĂšme de construction du noyau est une collection de
Makefiles avec de
nombreux outils et scripts personnalisés pour automatiser le processus. Pour commencer, ouvrez le programme d'installation en ligne:
make ARCH=um menuconfig
Il terminera partiellement l'assemblage et affichera une boßte de dialogue pour vous. Lorsque «
[Select]
» s'affiche en bas de la fenĂȘtre, vous pouvez effectuer la configuration Ă l'aide des touches Espace ou EntrĂ©e. Navigation sur la fenĂȘtre, comme d'habitude, avec les flĂšches haut et bas du clavier, et la sĂ©lection des Ă©lĂ©ments - «gauche» ou «droite».
Un pointeur de vue ---> signifie que vous vous trouvez dans un sous-menu accessible par la touche Entrée. Le moyen de s'en sortir est évidemment par «
[Exit]
».
Incluez les paramÚtres suivants dans «
[Select]
» et assurez-vous qu'il y a un symbole «[*]» à cÎté d'eux:
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
Tout de cette fenĂȘtre peut ĂȘtre quittĂ© en sĂ©lectionnant sĂ©quentiellement «
[Exit]
». Assurez-vous simplement qu'Ă la fin, vous ĂȘtes invitĂ© Ă enregistrer la configuration et sĂ©lectionnez «
[Yes]
».
Je vous recommande de jouer avec les options de construction du noyau aprÚs avoir lu ce post. Grùce à ces expériences, vous pouvez en apprendre beaucoup en termes de compréhension du travail de la mécanique du noyau de bas niveau et de l'influence de différents drapeaux sur son assemblage.
Assemblage du noyau
Le noyau Linux est un excellent programme qui fait beaucoup de choses. MĂȘme avec une configuration aussi minimale sur un ancien Ă©quipement, son assemblage peut prendre un certain temps. Par consĂ©quent, crĂ©ez le noyau avec la commande suivante:
make ARCH=um -j$(nproc)
Pourquoi? Cette commande indiquera Ă notre assembleur d'utiliser tous les cĆurs et threads de processeur disponibles pendant le processus de gĂ©nĂ©ration. La commande
$(nproc)
Ă la fin de Build remplace la sortie de la
nproc
, qui fait partie de
coreutils
dans la build Ubuntu standard.
AprÚs un certain temps, notre noyau sera compilé dans un fichier exécutable
./linux
.
Installation binaire
Puisque le mode utilisateur sur Linux crée un binaire normal, vous pouvez l'installer comme n'importe quel autre utilitaire. Voici comment je l'ai fait:
mkdir -p ~/bin cp linux ~/bin/linux
Cela vaut également la peine de vérifier que
~/bin
est dans votre
$PATH
:
export PATH=$PATH:$HOME/bin
Configuration du systÚme de fichiers invité
Créez un répertoire pour le systÚme de fichiers invité:
mkdir -p $HOME/prefix/uml-demo cd $HOME/prefix
Ouvrez alpinelinux.org et dans
la section des téléchargements, trouvez le lien actuel pour télécharger
MINI ROOT FILESYSTEM
. Au moment d'écrire ces lignes, c'était:
http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.0-x86_64.tar.gz
Téléchargez cette archive tar en utilisant 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
Entrez maintenant dans le répertoire du systÚme de fichiers invité et décompressez l'archive:
cd uml-demo tar xf ../alpine-rootfs.tgz
Les Ă©tapes dĂ©crites crĂ©eront un petit modĂšle de systĂšme de fichiers. En raison de la nature du systĂšme, l'installation de packages via Alpine Apk Manager sera extrĂȘmement difficile. Mais ce FS suffira pour Ă©valuer l'idĂ©e gĂ©nĂ©rale.
Nous avons également besoin de l'outil
tini pour supprimer la consommation de mémoire par les
processus zombies de notre noyau invité.
wget -O tini https://github.com/krallin/tini/releases/download/v0.18.0/tini-static chmod +x tini
Création d'une ligne de commande du noyau
Le noyau Linux, comme la plupart des autres programmes, possÚde des arguments de ligne de commande accessibles en spécifiant le commutateur
--help
.
Sam - aide 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.
Cette banniÚre éclaire les principales options de lancement. Lançons le noyau avec l'ensemble d'options minimal requis:
linux \ root=/dev/root \ rootfstype=hostfs \ rootflags=$HOME/prefix/uml-demo \ rw \ mem=64M \ init=/bin/sh
Les lignes ci-dessus indiquent Ă notre noyau ce qui suit:
- Supposons que le systÚme de fichiers racine soit le pseudo périphérique
/dev/root
. - Choisissez hostfs comme pilote du systĂšme de fichiers racine.
- Montez le systÚme de fichiers invité que nous avons créé sur le périphérique racine.
- Et oui, en mode lecture-écriture.
- Utilisez seulement 64 mĂ©gaoctets de RAM (vous pouvez en utiliser beaucoup moins, selon ce que vous prĂ©voyez de faire, mais 64 Mo semblent ĂȘtre la taille optimale).
- Le noyau démarre automatiquement
/bin/sh
tant que processus d' init
.
Exécutez cette commande et vous devriez obtenir quelque chose comme ceci:
Une autre feuille 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 / #
La manipulation de ce qui précÚde nous donnera un
systÚme invité au minimum , sans choses comme
/proc
ou un nom d'hÎte attribué. Par exemple, essayez les commandes suivantes:
- uname -av
- cat /proc/self/pid
- hostname
Pour quitter le systÚme invité, tapez
exit
ou appuyez sur control-d. Cela tirera la coquille suivie d'une panique du noyau:
/ # exit Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000 fish: â./linux root=/dev/root rootflagâŠâ terminated by signal SIGABRT (Abort)
Nous avons eu cette panique du noyau parce que le noyau Linux croit que le processus d'initialisation est toujours en cours d'exĂ©cution. Sans cela, le systĂšme ne peut plus fonctionner et s'arrĂȘte. Mais comme il s'agit d'un processus en mode utilisateur, le rĂ©sultat se transmet Ă
SIGABRT
, ce qui conduit Ă la sortie.
Configuration du réseau invité
Et ici, chez nous, tout commence Ă ne pas se dĂ©rouler comme prĂ©vu. Le rĂ©seau en mode utilisateur Linux est l'endroit oĂč tout le concept d'un «mode utilisateur» limitĂ© commence Ă s'effondrer. AprĂšs tout, gĂ©nĂ©ralement au niveau du systĂšme, le rĂ©seau est limitĂ© Ă
des modes d'exécution
privilégiés pour nous tous des raisons claires.
Remarque trans.: plus d'informations sur les diffĂ©rentes options pour travailler avec un rĂ©seau en UML peuvent ĂȘtre lues ici .Voyage Ă Slirp
Cependant, il existe un outil ancien et presque non pris en charge appelé
Slirp , avec lequel le mode utilisateur Linux peut interagir avec le réseau. Il fonctionne à peu prÚs comme une pile TCP / IP au niveau de l'utilisateur et ne nécessite aucune autorisation systÚme pour s'exécuter. Cet outil a été
publiĂ© en 1995 et la derniĂšre mise Ă jour remonte Ă
2006 . Slirp est trĂšs vieux. Pendant un temps sans support ni mises Ă jour, les compilateurs sont allĂ©s si loin que maintenant cet outil ne peut ĂȘtre dĂ©crit que comme une
«pourriture de code» .
Alors, roulons Slirp à partir des référentiels Ubuntu et essayons de l'exécuter:
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)
Oh dieux. Installons un débogueur pour Slirp et voyons si nous pouvons comprendre ce qui se passe ici:
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.
L'erreur bat dans
cette ligne . Regardons stacktrace, peut-ĂȘtre que quelque chose nous y aidera:
(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.
Ici, nous voyons qu'un échec se produit au début de la boucle principale, lorsque slirp essaie de vérifier les délais d'attente. à ce stade, j'ai dû renoncer à essayer de déboguer. Mais voyons si Slirp compilé à partir de tris fonctionne. J'ai rechargé l'archive directement depuis le site Web de
Sourceforge , car faire glisser quelque chose Ă partir de lĂ via la ligne de commande est une douleur:
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
Ici, nous voyons des alertes sur les fonctions intégrées non définies, c'est-à -dire sur l'impossibilité de lier le fichier binaire résultant. Il semble qu'entre 2006 et ce moment, gcc ait cessé de créer des caractÚres utilisés dans les fonctions intégrées des fichiers compilés intermédiaires. Essayons de remplacer le
inline
par un commentaire vide et regardons le résultat:
vi slirp.h :6 a <enter> #define inline /**/ <escape> :wq make
Non. Cela ne fonctionne pas non plus. Vous ne trouvez toujours pas les caractĂšres de ces fonctions.
à ce stade, j'ai abandonné et j'ai commencé à chercher des
packages de construction Heroku sur Github. Ma théorie était basée sur le fait que certains paquets de construction Heroku contiendront les binaires dont j'ai besoin. En conséquence, la recherche m'a conduit
ici . J'ai téléchargé et décompressé
uml.tar.gz
et
uml.tar.gz
trouvé ce qui suit:
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*
Ceci est un fichier slirp binaire! Travaille-t-il?
./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 ...
Ne tombe pas en panne - cela devrait donc fonctionner!
~/bin/slirp
ce binaire dans
~/bin/slirp
:
cp slirp ~/bin/slirp
Dans le cas oĂč le crĂ©ateur du package l'enlĂšve, j'ai
fait un miroir .
Configuration du réseau
Maintenant, configurons le réseau sur notre noyau invité.
Mettre Ă jour les options de lancement :
linux \ root=/dev/root \ rootfstype=hostfs \ rootflags=$HOME/prefix/uml-demo \ rw \ mem=64M \ eth0=slirp,,$HOME/bin/slirp \ init=/bin/sh
Allumons maintenant le réseau:
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
Les deux premiĂšres commandes de configuration
/proc
et
/sys
nécessaires au fonctionnement d'
ifconfig
, qui configure une interface réseau pour communiquer avec Slirp. La commande
route
configure une table de routage du noyau pour forcer tout le trafic Ă travers le tunnel Slirp. VĂ©rifions cela avec une requĂȘte 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
Ăa marche!
Remarque: Apparemment, le message d'origine a été écrit sur le bureau avec une carte réseau filaire ou une autre configuration qui ne nécessite pas de pilotes supplémentaires. Sur un ordinateur portable avec WiFi 8265 d'Intel, lorsque vous augmentez le réseau, une erreur se produit /
Apparemment, le noyau ne peut pas communiquer avec le pilote réseau. Malheureusement, une tentative de compilation du micrologiciel dans le noyau n'a pas résolu le problÚme. Au moment de la publication, il n'était pas possible de trouver une solution dans cette configuration particuliÚre. Sur des configurations plus simples (par exemple, dans Virtualbox) l'interface monte correctement.Automatisons la redirection à l'aide du script shell suivant:
#!/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
Et marquez-le comme exécutable:
chmod +x init.sh
Et puis apportez des modifications Ă la ligne de commande du noyau:
linux \ root=/dev/root \ rootfstype=hostfs \ rootflags=$HOME/prefix/uml-demo \ rw \ mem=64M \ eth0=slirp,,$HOME/bin/slirp \ init=/init.sh
Et répétez:
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
Le réseau est stable!
Fichier Docker
,
Dockerfile , .
, , . , .
, , . - , , User Mode Linux . . Docker â tar-,
docker export
, . , shell-.
Rkeene #lobsters Freenode. Slirp . , Slackware slirp, Ubuntu Alpine slirp Rkeene . , -.