كيفية البدء في استخدام وضع المستخدم على لينكس

مقدمة من المترجم: على خلفية الدخول الهائل في حياتنا لأنواع مختلفة من الحاويات ، قد يكون من المثير للاهتمام ومفيد للغاية معرفة التقنيات التي بدأتها جميعًا مرة واحدة. يمكن استخدام بعضها حتى يومنا هذا ، ولكن لا يتذكر الجميع هذه الأساليب (أو يعرف ما إذا لم يتم العثور عليها أثناء تطوره السريع). واحدة من هذه التكنولوجيا هي وضع المستخدم لينكس. قام مؤلف الأصل الأصلي بالتفتيش حوله ، لمعرفة ما كان لا يزال يعمل من التطورات القديمة ، وما لم يكن كثيرًا ، وجمع شيئًا ما كتعليمات خطوة بخطوة حول كيفية بدء UML محلي المنشأ في 2k19 لنفسي. ونعم ، قمنا بدعوة مؤلف منشور Cadey الأصلي إلى Habr ، لذلك إذا كانت لديك أسئلة ، فاطرح باللغة الإنجليزية في التعليقات.

صورة

وضع مستخدم Linux هو ، في الواقع ، منفذ kernel Linux نفسه. يتيح لك هذا الوضع تشغيل نواة Linux كاملة كعملية مستخدم وعادة ما يستخدمه المطورون لاختبار برامج التشغيل. ولكن هذا الوضع مفيد أيضًا كأداة للعزل العام ، يشبه مبدأه تشغيل الأجهزة الافتراضية. يوفر هذا الوضع عزلة أكثر من Docker ، لكن أقل من جهاز افتراضي كامل مثل KVM أو Virtual Box.

بشكل عام ، قد يبدو وضع المستخدم غريبًا وصعب الاستخدام ، ولكن لا يزال يحتوي على مناطق تطبيق خاصة به. بعد كل شيء ، هذه نواة Linux كاملة ، تعمل من مستخدم غير محترم. تتيح لك هذه الميزة تشغيل تعليمات برمجية غير موثوق بها دون أي تهديدات للجهاز المضيف. ونظرًا لأنه نواة كاملة ، فإن عملياته معزولة عن الجهاز المضيف ، أي أن العمليات التي تعمل داخل وضع المستخدم لن تكون مرئية للمضيف . هذا لا يشبه حاوية Docker المعتادة ، وفي هذه الحالة يرى الجهاز المضيف دائمًا العمليات داخل المستودع. ألقِ نظرة على هذه القطعة من pstree من أحد خوادمي:

containerd─┬─containerd-shim─┬─tini─┬─dnsd───19*[{dnsd}] │ │ └─s6-svscan───s6-supervise │ └─10*[{containerd-shim}] ├─containerd-shim─┬─tini─┬─aerial───21*[{aerial}] │ │ └─s6-svscan───s6-supervise │ └─10*[{containerd-shim}] ├─containerd-shim─┬─tini─┬─s6-svscan───s6-supervise │ │ └─surl │ └─9*[{containerd-shim}] ├─containerd-shim─┬─tini─┬─h───13*[{h}] │ │ └─s6-svscan───s6-supervise │ └─10*[{containerd-shim}] ├─containerd-shim─┬─goproxy───14*[{goproxy}] │ └─9*[{containerd-shim}] └─32*[{containerd}] 

وقارن هذا مع pstree Linux kernel في وضع المستخدم:

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

عند العمل مع حاويات Docker ، أستطيع أن أرى أسماء العمليات التي تعمل على نظام الضيف من المضيف. مع وضع مستخدم Linux ، هذا غير ممكن. ماذا يعني هذا؟ هذا يعني أن أدوات المراقبة التي تعمل من خلال النظام الفرعي لتدقيق Linux لا ترى العمليات التي تعمل على نظام الضيف. ولكن في بعض الحالات ، يمكن أن تصبح هذه الميزة سيفًا ذا حدين.

بشكل عام ، المنشور بأكمله أدناه عبارة عن مجموعة من الدراسات والمحاولات الوقحة لتحقيق النتيجة المرجوة. للقيام بذلك ، اضطررت إلى استخدام العديد من الأدوات القديمة ، وقراءة مصادر النواة ، وتصحيح التعليمات البرمجية بشكل مكثف مكتوبًا بينما كنت لا أزال في المدرسة الابتدائية ، وكذلك اخترت جمعيات Heroku باستخدام مجهر خاص للبحث عن الأدوات التي أحتاج إليها. كل هذا العمل قاد اللاعبين في IRC إلى الاتصال بي بالسحر. آمل أن يكون هذا المنشور بمثابة وثائق يمكن الاعتماد عليها من قِبَل شخص ما من أجل التمسك بكل شيء على نحو مماثل ، ولكن مع الإصدارات الأحدث من نظام التشغيل وإصدارات نظام التشغيل.

تعديل


يتطلب إعداد وضع مستخدم Linux عدة خطوات:

  • تثبيت التبعيات على المضيف ؛
  • تنزيل نواة لينكس
  • إعداد تجميع النواة.
  • تجميع النواة
  • التثبيت الثنائي ؛
  • إعداد نظام ملفات الضيف ؛
  • اختيار معلمات إطلاق النواة ؛
  • إعداد شبكة الضيف ؛
  • بدء نواة الضيف.

أفترض أنك إذا قررت أن تعمل كل شيء بنفسك ، فمن المرجح أنك ستقوم بكل ما هو موصوف في نظام Ubuntu أو دبيان. لقد حاولت تنفيذ كل ما سبق في توزيعتي المفضلة - جبال الألب ، لكن لم يأت أي شيء منها ، على ما يبدو لأن نواة لينكس لديها ارتباطات مشددة على علامات glibc للسائقين في وضع المستخدم. أخطط للإبلاغ عن ذلك إلى المنبع بعد اكتشاف المشكلة في النهاية.

تثبيت التبعيات على المضيف


يتطلب Ubuntu على الأقل الحزم التالية لإنشاء نواة Linux (بشرط تثبيت نظيف):

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


يمكنك تثبيتها باستخدام الأمر التالي (مع امتيازات الجذر أو باستخدام sudo):

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

لاحظ أن تشغيل برنامج إعداد القائمة لنظام Linux kernel سيتطلب تثبيت libncurses-dev . يرجى التأكد من تثبيته باستخدام الأمر التالي (مع امتيازات الجذر أو مع sudo):

 apt-get -y install libncurses-dev 

نواة التحميل


تحديد موقع التحميل والتجميع اللاحق للنواة. في هذه العملية ، ستحتاج إلى تخصيص حوالي 1.3 جيجا بايت من مساحة القرص الثابت ، لذا تأكد من وجود واحد.

ثم انتقل إلى kernel.org واحصل على عنوان URL لتنزيل أحدث إصدار ثابت من kernel. في وقت كتابة هذا المقال: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.16.tar.xz

قم بتنزيل هذا الملف باستخدام 'wget' :

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

واستخلصها باستخدام 'tar' :

 tar xJf linux-5.1.16.tar.xz 

الآن ندخل الدليل الذي تم إنشاؤه عند تفريغ القارطة:

 cd linux-5.1.16 

نواة بناء التكوين


نظام بناء kernel هو عبارة عن مجموعة من Makefiles مع العديد من الأدوات والبرامج النصية المخصصة لأتمتة العملية. للبدء ، افتح برنامج الإعداد عبر الإنترنت:

 make ARCH=um menuconfig 

سيتم إكمال التجميع جزئيًا وعرض مربع حوار لك. عندما يتم عرض " [Select] " في الجزء السفلي من النافذة ، يمكنك إجراء التكوين باستخدام مفتاحي Space أو Enter. تنقل في النافذة ، كالعادة ، باستخدام السهمين العلوي والسفلي من لوحة المفاتيح ، واختيار العناصر - "يسار" أو "يمين".

يشير مؤشر العرض ---> إلى أنك في قائمة فرعية يمكن الوصول إليها بواسطة مفتاح Enter. من الواضح أن [Exit] منه هو [Exit] .

قم بتضمين المعلمات التالية في " [Select] " وتأكد من وجود رمز "[*]" بجانبها:

 UML-specific Options: - Host filesystem Networking support (enable this to get the submenu to show up): - Networking options: - TCP/IP Networking UML Network devices: - Virtual network device - SLiRP transport 

يمكن إنهاء كل شيء من هذه النافذة عن طريق تحديد " [Exit] " بالتسلسل. فقط تأكد من أنه في النهاية سيُطلب منك حفظ التكوين وحدد " [Yes] ".

أوصي بأن تلعب مع خيارات بناء kernel بعد قراءة هذا المنشور. بفضل هذه التجارب ، يمكنك أن تتعلم الكثير من حيث فهم عمل ميكانيكا النواة المنخفضة المستوى وتأثير مختلف الأعلام على التجميع.

تجميع النواة


Linux kernel هو برنامج رائع يقوم بالكثير من الأشياء. حتى مع وجود الحد الأدنى من التكوين على المعدات القديمة ، قد يستغرق الأمر بعض الوقت لتجميعه. لذلك ، قم بإنشاء kernel باستخدام الأمر التالي:

 make ARCH=um -j$(nproc) 

لماذا؟ سيُعلم هذا الأمر المجمّع الخاص بنا باستخدام جميع النوى وخيوط المعالج المتاحة أثناء عملية الإنشاء. $(nproc) في نهاية Build إخراج nproc ، والذي يعد جزءًا من coreutils في بناء Ubuntu القياسي.

بعد مرور بعض الوقت ، سيتم تجميع kernel لدينا في ملف قابل للتنفيذ. / ./linux .

التثبيت الثنائي


نظرًا لأن وضع المستخدم على نظام Linux ينشئ ثنائيًا عاديًا ، يمكنك تثبيته مثل أي أداة مساعدة أخرى. إليك كيف فعلت ذلك:

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

من الجدير أيضًا التحقق من وجود ~/bin في $PATH :

 export PATH=$PATH:$HOME/bin 

إعداد نظام ملفات الضيف


قم بإنشاء دليل لنظام ملفات الضيف:

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

افتح alpinelinux.org وفي قسم التنزيلات ، ابحث عن الرابط الحالي لتنزيل MINI ROOT FILESYSTEM . في وقت كتابة هذا التقرير ، كان:

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

قم بتنزيل لعبة tarball هذه باستخدام wget:

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

أدخل الآن دليل نظام ملفات الضيف وقم بفك ضغط الأرشيف:

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

ستقوم الخطوات الموضحة بإنشاء قالب نظام ملفات صغير. نظرًا لطبيعة النظام ، سيكون من الصعب للغاية تثبيت الحزم من خلال مدير Alpine apk. ولكن هذا FS سيكون كافيا لتقييم الفكرة العامة.

نحتاج أيضًا إلى أداة tini لقمع استهلاك الذاكرة من خلال عمليات الزومبي الخاصة بضيفنا الأساسي.

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

إنشاء سطر أوامر kernel


يحتوي Linux kernel ، مثله مثل معظم البرامج الأخرى ، على وسيطات سطر الأوامر التي يمكن الوصول إليها من خلال تحديد مفتاح التبديل --help .

سام - المساعدة
 linux --help User Mode Linux v5.1.16 available at http://user-mode-linux.sourceforge.net/ --showconfig Prints the config file that this UML binary was generated from. iomem=<name>,<file> Configure <file> as an IO memory region named <name>. mem=<Amount of desired ram> This controls how much "physical" memory the kernel allocates for the system. The size is specified as a number followed by one of 'k', 'K', 'm', 'M', which have the obvious meanings. This is not related to the amount of memory in the host. It can be more, and the excess, if it's ever used, will just be swapped out. Example: mem=64M --help Prints this message. debug this flag is not needed to run gdb on UML in skas mode root=<file containing the root fs> This is actually used by the generic kernel in exactly the same way as in any other kernel. If you configure a number of block devices and want to boot off something other than ubd0, you would use something like: root=/dev/ubd5 --version Prints the version number of the kernel. umid=<name> This is used to assign a unique identity to this UML machine and is used for naming the pid file and management console socket. con[0-9]*=<channel description> Attach a console or serial line to a host channel. See http://user-mode-linux.sourceforge.net/old/input.html for a complete description of this switch. eth[0-9]+=<transport>,<options> Configure a network device. aio=2.4 This is used to force UML to use 2.4-style AIO even when 2.6 AIO is available. 2.4 AIO is a single thread that handles one request at a time, synchronously. 2.6 AIO is a thread which uses the 2.6 AIO interface to handle an arbitrary number of pending requests. 2.6 AIO is not available in tt mode, on 2.4 hosts, or when UML is built with /usr/include/linux/aio_abi.h not available. Many distributions don't include aio_abi.h, so you will need to copy it from a kernel tree to your /usr/include/linux in order to build an AIO-capable UML nosysemu Turns off syscall emulation patch for ptrace (SYSEMU). SYSEMU is a performance-patch introduced by Laurent Vivier. It changes behaviour of ptrace() and helps reduce host context switch rates. To make it work, you need a kernel patch for your host, too. See http://perso.wanadoo.fr/laurent.vivier/UML/ for further information. uml_dir=<directory> The location to place the pid and umid files. quiet Turns off information messages during boot. hostfs=<root dir>,<flags>,... This is used to set hostfs parameters. The root directory argument is used to confine all hostfs mounts to within the specified directory tree on the host. If this isn't specified, then a user inside UML can mount anything on the host that's accessible to the user that's running it. The only flag currently supported is 'append', which specifies that all files opened by hostfs will be opened in append mode. 


تضيء هذه الراية خيارات الإطلاق الرئيسية. لنشغل النواة مع الحد الأدنى المطلوب من الخيارات:

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

الأسطر أعلاه تخبرنا بما يلي:

  • لنفترض أن نظام ملفات الجذر هو الجهاز الزائف /dev/root .
  • اختر hostfs كبرنامج تشغيل نظام الملفات الجذرية.
  • قم بتثبيت نظام ملفات الضيف الذي أنشأناه على جهاز الجذر.
  • ونعم ، في وضع القراءة والكتابة.
  • استخدم فقط 64 ميغابايت من ذاكرة الوصول العشوائي (يمكنك استخدام أقل من ذلك بكثير ، بناءً على ما تنوي القيام به ، ولكن يبدو أن حجم 64 ميجابايت هو الحجم الأمثل).
  • تبدأ النواة /bin/sh تلقائيًا كعملية init .

قم بتشغيل هذا الأمر وستحصل على شيء مثل التالي:

ورقة أخرى
 Core dump limits : soft - 0 hard - NONE Checking that ptrace can change system call numbers...OK Checking syscall emulation patch for ptrace...OK Checking advanced syscall emulation patch for ptrace...OK Checking environment variables for a tempdir...none found Checking if /dev/shm is on tmpfs...OK Checking PROT_EXEC mmap in /dev/shm...OK Adding 32137216 bytes to physical memory to account for exec-shield gap Linux version 5.1.16 (cadey@kahless) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #30 Sun Jul 7 18:57:19 UTC 2019 Built 1 zonelists, mobility grouping on. Total pages: 23898 Kernel command line: root=/dev/root rootflags=/home/cadey/dl/uml/alpine rootfstype=hostfs rw mem=64M init=/bin/sh Dentry cache hash table entries: 16384 (order: 5, 131072 bytes) Inode-cache hash table entries: 8192 (order: 4, 65536 bytes) Memory: 59584K/96920K available (2692K kernel code, 708K rwdata, 588K rodata, 104K init, 244K bss, 37336K reserved, 0K cma-reserved) SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 NR_IRQS: 15 clocksource: timer: mask: 0xffffffffffffffff max_cycles: 0x1cd42e205, max_idle_ns: 881590404426 ns Calibrating delay loop... 7479.29 BogoMIPS (lpj=37396480) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes) Checking that host ptys support output SIGIO...Yes Checking that host ptys support SIGIO on close...No, enabling workaround devtmpfs: initialized random: get_random_bytes called from setup_net+0x48/0x1e0 with crng_init=0 Using 2.6 host AIO clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns futex hash table entries: 256 (order: 0, 6144 bytes) NET: Registered protocol family 16 clocksource: Switched to clocksource timer NET: Registered protocol family 2 tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes) TCP established hash table entries: 1024 (order: 1, 8192 bytes) TCP bind hash table entries: 1024 (order: 1, 8192 bytes) TCP: Hash tables configured (established 1024 bind 1024) UDP hash table entries: 256 (order: 1, 8192 bytes) UDP-Lite hash table entries: 256 (order: 1, 8192 bytes) NET: Registered protocol family 1 console [stderr0] disabled mconsole (version 2) initialized on /home/cadey/.uml/tEwIjm/mconsole Checking host MADV_REMOVE support...OK workingset: timestamp_bits=62 max_order=14 bucket_order=0 Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254) io scheduler noop registered (default) io scheduler bfq registered loop: module loaded NET: Registered protocol family 17 Initialized stdio console driver Using a channel type which is configured out of UML setup_one_line failed for device 1 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 2 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 3 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 4 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 5 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 6 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 7 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 8 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 9 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 10 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 11 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 12 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 13 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 14 : Configuration failed Using a channel type which is configured out of UML setup_one_line failed for device 15 : Configuration failed Console initialized on /dev/tty0 console [tty0] enabled console [mc-1] enabled Failed to initialize ubd device 0 :Couldn't determine size of device's file VFS: Mounted root (hostfs filesystem) on device 0:11. devtmpfs: mounted This architecture does not have kernel memory protection. Run /bin/sh as init process /bin/sh: can't access tty; job control turned off random: fast init done / # 


سيوفر لنا التعامل مع ما ورد أعلاه نظام ضيف على الأقل ، بدون أشياء مثل /proc أو اسم مضيف معين. على سبيل المثال ، جرب الأوامر التالية:

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


للخروج من نظام الضيف ، اكتب exit أو اضغط على control-d. هذا سيطلق النار على الصدفة يليه ذعر النواة:

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

لقد شعرنا بالذعر هذا kernel لأن Linux kernel يعتقد أن عملية التهيئة تعمل دائمًا. وبدون ذلك ، لم يعد النظام قادرًا على العمل وإيقاف التشغيل. ولكن نظرًا لأن هذه عملية وضع المستخدم ، فإن النتيجة ترسل نفسها إلى SIGABRT ، مما يؤدي إلى الخروج.

إعداد شبكة الضيف


وهنا في كل شيء لدينا يبدأ في الذهاب لا وفقا للخطة. الشبكة في وضع المستخدم Linux هي حيث يبدأ مفهوم "وضع المستخدم" المحدود في الانهيار. بعد كل شيء ، عادة ما تكون الشبكة على مستوى النظام محصورة في أوضاع التنفيذ المتميزة لكلنا أسباب واضحة.

تقريبا. عبر: يمكن قراءة المزيد حول الخيارات المختلفة للعمل مع الشبكة في UML هنا .

السفر إلى slirp


ومع ذلك ، هناك أداة قديمة وغير مدعومة تقريبًا تسمى Slirp ، والتي يمكن من خلالها وضع المستخدم Linux التفاعل مع الشبكة. إنه يعمل بشكل شبه مكدس TCP / IP على مستوى المستخدم ولا يتطلب أي أذونات نظام لتشغيل. تم إصدار هذه الأداة في عام 1995 ، ويعود آخر تحديث إلى عام 2006 . سلق قديم جدا. لفترة من دون دعم وتحديثات ، ذهب المترجمون حتى الآن بحيث لا يمكن الآن وصف هذه الأداة بأنها "تعفن الكود" .

لذلك ، دعنا نلف Slirp من مستودعات Ubuntu ونحاول تشغيله:

 sudo apt-get install slirp /usr/bin/slirp Slirp v1.0.17 (BETA) Copyright (c) 1995,1996 Danny Gasparovski and others. All rights reserved. This program is copyrighted, free software. Please read the file COPYRIGHT that came with the Slirp package for the terms and conditions of the copyright. IP address of Slirp host: 127.0.0.1 IP address of your DNS(s): 1.1.1.1, 10.77.0.7 Your address is 10.0.2.15 (or anything else you want) Type five zeroes (0) to exit. [autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud] SLiRP Ready ... fish: “/usr/bin/slirp” terminated by signal SIGSEGV (Address boundary error) 

يا آلهة. لنقم بتثبيت مصحح أخطاء لـ Slirp ونرى ما إذا كان يمكننا معرفة ما يحدث هنا:

 sudo apt-get install gdb slirp-dbgsym gdb /usr/bin/slirp GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from /usr/bin/slirp...Reading symbols from /usr/lib/debug/.build-id/c6/2e75b69581a1ad85f72ac32c0d7af913d4861f.debug...done. done. (gdb) run Starting program: /usr/bin/slirp Slirp v1.0.17 (BETA) Copyright (c) 1995,1996 Danny Gasparovski and others. All rights reserved. This program is copyrighted, free software. Please read the file COPYRIGHT that came with the Slirp package for the terms and conditions of the copyright. IP address of Slirp host: 127.0.0.1 IP address of your DNS(s): 1.1.1.1, 10.77.0.7 Your address is 10.0.2.15 (or anything else you want) Type five zeroes (0) to exit. [autodetect SLIP/CSLIP, MTU 1500, MRU 1500, 115200 baud] SLiRP Ready ... Program received signal SIGSEGV, Segmentation fault. ip_slowtimo () at ip_input.c:457 457 ip_input.c: No such file or directory. 

الخطأ هو الضرب في هذا الخط . دعنا ننظر إلى stacktrace ، ربما هناك شيء سوف يساعدنا هناك:

 (gdb) bt full #0 ip_slowtimo () at ip_input.c:457 fp = 0x55784a40 #1 0x000055555556a57c in main_loop () at ./main.c:980 so = <optimized out> so_next = <optimized out> timeout = {tv_sec = 0, tv_usec = 0} ret = 0 nfds = 0 ttyp = <optimized out> ttyp2 = <optimized out> best_time = <optimized out> tmp_time = <optimized out> #2 0x000055555555b116 in main (argc=1, argv=0x7fffffffdc58) at ./main.c:95 No locals. 

هنا نرى حدوث فشل أثناء بداية الحلقة الرئيسية ، عندما يحاول slirp التحقق من المهلات. في هذه المرحلة ، اضطررت إلى التخلي عن محاولة تصحيح الأخطاء. ولكن دعونا نرى ما إذا كان Slirp جمعت من أنواع الأعمال. لقد قمت بإعادة تحميل الأرشيف مباشرة من موقع Sourceforge ، لأن سحب شيء من هناك عبر سطر الأوامر يمثل ألمًا:

 cd ~/dl wget https://xena.greedo.xeserv.us/files/slirp-1.0.16.tar.gz tar xf slirp-1.0.16.tar.gz cd slirp-1.0.16/src ./configure --prefix=$HOME/prefix/slirp make 

نرى هنا تنبيهات حول وظائف مدمجة غير محددة ، أي حول استحالة ربط الملف الثنائي الناتج. يبدو أنه بين عام 2006 وهذه اللحظة ، توقف gcc عن إنشاء الأحرف المستخدمة في الوظائف المدمجة للملفات المترجمة المتوسطة. دعونا نحاول استبدال inline بتعليق فارغ وإلقاء نظرة على النتيجة:

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

كلا. هذا لا يعمل ايضا. لا يزال يتعذر عليك العثور على الأحرف لهذه الوظائف.

في هذه المرحلة ، استسلمت وبدأت أبحث عن حزم بناء Heroku على جيثب. استندت نظريتي إلى حقيقة أن بعض حزمة بناء Heroku سوف تحتوي على الثنائيات التي أحتاج إليها. نتيجة لذلك ، قادني البحث هنا . قمت بتنزيل uml.tar.gz والعثور على ما يلي:

 total 6136 -rwxr-xr-x 1 cadey cadey 79744 Dec 10 2017 ifconfig* -rwxr-xr-x 1 cadey cadey 373 Dec 13 2017 init* -rwxr-xr-x 1 cadey cadey 149688 Dec 10 2017 insmod* -rwxr-xr-x 1 cadey cadey 66600 Dec 10 2017 route* -rwxr-xr-x 1 cadey cadey 181056 Jun 26 2015 slirp* -rwxr-xr-x 1 cadey cadey 5786592 Dec 15 2017 uml* -rwxr-xr-x 1 cadey cadey 211 Dec 13 2017 uml_run* 

هذا هو ملف slirp ثنائي! هل هو يعمل؟

 ./slirp Slirp v1.0.17 (BETA) FULL_BOLT Copyright (c) 1995,1996 Danny Gasparovski and others. All rights reserved. This program is copyrighted, free software. Please read the file COPYRIGHT that came with the Slirp package for the terms and conditions of the copyright. IP address of Slirp host: 127.0.0.1 IP address of your DNS(s): 1.1.1.1, 10.77.0.7 Your address is 10.0.2.15 (or anything else you want) Type five zeroes (0) to exit. [autodetect SLIP/CSLIP, MTU 1500, MRU 1500] SLiRP Ready ... 

لا تعطل - لذلك يجب أن تعمل! دعونا ربط هذا ثنائي في ~/bin/slirp :

 cp slirp ~/bin/slirp 

في حالة قيام مُنشئ الحزمة بإزالته ، فقد صنعت مرآة .

إعداد الشبكة


الآن دعنا ننشئ الشبكة على ضيفنا الأساسي. تحديث خيارات التشغيل :

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

الآن لنقم بتشغيل الشبكة:

 mount -t proc proc proc/ mount -t sysfs sys sys/ ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15 route add default gw 10.0.2.2 

أول أمرين للتهيئة /proc و /sys ضروريان لـ ifconfig ، الذي يقوم بإعداد واجهة شبكة للتواصل مع Slirp. يقوم أمر التوجيه بإعداد جدول توجيه kernel لفرض كل حركة المرور عبر نفق Slirp. دعنا نتحقق من ذلك باستخدام استعلام DNS:

 nslookup google.com 8.8.8.8 Server: 8.8.8.8 Address 1: 8.8.8.8 dns.google Name: google.com Address 1: 172.217.12.206 lga25s63-in-f14.1e100.net Address 2: 2607:f8b0:4006:81b::200e lga25s63-in-x0e.1e100.net 

إنه يعمل!

ملاحظة: على ما يبدو ، تمت كتابة المنشور الأصلي على سطح المكتب باستخدام بطاقة شبكة سلكية ، أو بعض التهيئة الأخرى التي لا تتطلب برامج تشغيل إضافية. على جهاز كمبيوتر محمول مزود بشبكة WiFi 8265 من Intel ، عند رفع الشبكة ، يحدث خطأ

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

على ما يبدو ، لا يمكن للنواة التواصل مع برنامج تشغيل الشبكة. محاولة ترجمة البرامج الثابتة إلى النواة ، لسوء الحظ ، لم يحل الموقف. في وقت النشر ، لم يكن من الممكن إيجاد حل في هذا التكوين المحدد. في التكوينات الأبسط (على سبيل المثال ، في Virtualbox) ، ترتفع الواجهة بشكل صحيح.

دعونا أتمتة إعادة التوجيه باستخدام البرنامج النصي shell التالي:

 #!/bin/sh # init.sh mount -t proc proc proc/ mount -t sysfs sys sys/ ifconfig eth0 10.0.2.14 netmask 255.255.255.240 broadcast 10.0.2.15 route add default gw 10.0.2.2 echo "networking set up" exec /tini /bin/sh 

ووضع علامة عليها للتنفيذ:

 chmod +x init.sh 

ثم قم بإجراء تغييرات على سطر أوامر kernel:

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

وكرر:

 SLiRP Ready ... networking set up /bin/sh: can't access tty; job control turned off nslookup google.com 8.8.8.8 Server: 8.8.8.8 Address 1: 8.8.8.8 dns.google Name: google.com Address 1: 172.217.12.206 lga25s63-in-f14.1e100.net Address 2: 2607:f8b0:4004:800::200e iad30s09-in-x0e.1e100.net 

الشبكة مستقرة!

ملف عامل الميناء


, Dockerfile , . , , . , .



, , . - , , User Mode Linux . . Docker — tar-, docker export , . , shell-.

Rkeene #lobsters Freenode. Slirp . , Slackware slirp, Ubuntu Alpine slirp Rkeene . , -.

Source: https://habr.com/ru/post/ar459558/


All Articles