لينڪس ۾ يوزر موڊ استعمال ڪرڻ ڪيئن شروع ڪجي

مترجم جو تعارف: مختلف قسمن جي ڪنٽينر جي اسان جي زندگين ۾ وڏي پئماني تي داخل ٿيڻ جي پس منظر ۾، اهو معلوم ڪرڻ ڪافي دلچسپ ۽ ڪارائتو ٿي سگهي ٿو ته ڪهڙي ٽيڪنالاجي سان اهو سڀ هڪ ڀيرو شروع ٿيو. انهن مان ڪجهه هن ڏينهن تائين مفيد طور تي استعمال ڪري سگھجن ٿيون، پر هرڪو ياد نه ڪندو آهي اهڙن طريقن (يا ڄاڻي ٿو ته اهي انهن جي تيز رفتار ترقي دوران پڪڙي نه ويا). هڪ اهڙي ٽيڪنالاجي آهي صارف موڊ لينڪس. اصل جي مصنف تمام گهڻي کوٽائي ڪئي، اهو معلوم ڪيو ته ڪهڙيون پراڻيون ترقيون اڃا تائين ڪم ڪري رهيون آهن ۽ ڪهڙيون نه آهن، ۽ گڏ ڪيو هڪ قدم قدم جي هدايت وانگر ته ڪيئن پنهنجو پاڻ کي 2k19 ۾ يو ايم ايل يو هومبرو حاصل ڪجي. ۽ ها، اسان اصل پوسٽ جي ليکڪ کي حبر ڏانهن دعوت ڏني ڪيڊي، پوءِ جيڪڏھن توھان وٽ ڪي سوال آھن - تبصرن ۾ انگريزيءَ ۾ پڇو.

لينڪس ۾ يوزر موڊ استعمال ڪرڻ ڪيئن شروع ڪجي

لينڪس ۾ يوزر موڊ، حقيقت ۾، لينڪس ڪنييل جو هڪ پورٽ پاڻ ڏانهن. هي موڊ توهان کي هڪ مڪمل لينڪس ڪنييل هلائڻ جي اجازت ڏئي ٿو صارف جي عمل جي طور تي ۽ عام طور تي ڊولپرز طرفان استعمال ڪيو ويندو آهي ڊرائيور کي جانچڻ لاءِ. پر هي موڊ هڪ عام اڪيلائيشن اوزار جي طور تي پڻ ڪارائتو آهي، جنهن جو اصول مجازي مشين جي آپريشن سان ملندڙ جلندڙ آهي. هي موڊ Docker کان وڌيڪ اڪيلائي فراهم ڪري ٿو، پر مڪمل ورچوئل مشين کان گهٽ جهڙوڪ KVM يا ورچوئل باڪس.

عام طور تي، صارف موڊ استعمال ڪرڻ لاء ھڪڙو عجيب ۽ مشڪل اوزار وانگر لڳي سگھي ٿو، پر اھو اڃا تائين ان جو استعمال آھي. آخرڪار، هي هڪ مڪمل لينڪس ڪنييل آهي جيڪو اڻڄاتل صارف کان هلندو آهي. هي خصوصيت ممڪن طور تي ناقابل اعتماد ڪوڊ کي ميزبان مشين کي ڪنهن به خطري کان بغير هلائڻ جي اجازت ڏئي ٿي. ۽ جيئن ته هي هڪ مڪمل ڪنيل آهي، ان جي عمل کي ميزبان مشين کان الڳ ڪيو ويو آهي، يعني يوزر موڊ اندر هلندڙ عمل ميزبان کي نظر نه ايندا. اهو عام ڊاکر ڪنٽينر وانگر ناهي، انهي صورت ۾ ميزبان مشين هميشه ذخيرو اندر عملن کي ڏسي ٿو. منهنجي هڪ سرور مان 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─┬─5*[linux]
      └─slirp

جڏهن ڊڪر ڪنٽينرز سان ڪم ڪري رهيو آهيان، مان ڏسي سگهان ٿو ميزبان کان انهن عملن جا نالا جيڪي مهمان ۾ هلندڙ آهن. لينڪس يوزر موڊ سان، اهو ممڪن ناهي. هن جو ڇا مطلب آهي؟ هن جو مطلب اهو آهي ته مانيٽرنگ اوزار جيڪي لينڪس جي آڊيٽنگ سب سسٽم ذريعي هلن ٿا نه ڏسو مهمان سسٽم ۾ هلندڙ عمل. پر ڪجهه حالتن ۾، هي خصوصيت هڪ ٻه طرفي تلوار بڻجي سگهي ٿي.

عام طور تي، هيٺ ڏنل سموري پوسٽ تحقيق جو مجموعو آهي ۽ گهربل نتيجو حاصل ڪرڻ جي ڪوشش ڪئي وئي آهي. ائين ڪرڻ لاءِ، مون کي مختلف قديم اوزار استعمال ڪرڻا پوندا، ڪنيل ذريعن کي پڙهڻو پوندو، انهن ڏينهن ۾ لکيل ڪوڊ جي سخت ڊيبگنگ ڪرڻي پوندي هئي، جڏهن مان اڃا ايليمينٽري اسڪول ۾ هئس، ۽ هيروڪو بلڊنگز سان به ٽِنڪر ڪرڻا هئا خاص بائنري استعمال ڪندي اوزار ڳولڻ لاءِ جيڪي مون کي گهربل هئا. . هي سڀ ڪم منهنجي IRC تي ماڻهن کي مون کي جادو سڏڻ جي هدايت ڪئي. مون کي اميد آهي ته هي پوسٽ قابل اعتماد دستاويزن جي طور تي ڪم ڪندو آهي ڪنهن لاءِ ساڳي شيءِ نئين ڪنلن ۽ او ايس ورزن سان ڪوشش ڪرڻ لاءِ.

adjustment

لينڪس يوزر موڊ کي ترتيب ڏيڻ ڪيترن ئي مرحلن ۾ ڪيو ويندو آهي:

  • ميزبان تي انحصار کي نصب ڪرڻ؛
  • لينڪس ڪرنل ڊائون لوڊ ڪندي؛
  • kernel تعمير جي جوڙجڪ؛
  • kernel اسيمبلي؛
  • بائنري تنصيب؛
  • مهمان فائل سسٽم کي ترتيب ڏيڻ؛
  • ڪرنل لانچ پيٽرولر جو انتخاب؛
  • هڪ مهمان نيٽ ورڪ قائم ڪرڻ؛
  • مھمانن جي دٻي کي شروع ڪندي.

مان سمجهان ٿو ته جيڪڏهن توهان اهو پاڻ ڪرڻ جو فيصلو ڪيو ٿا، توهان گهڻو ڪري سڀ ڪجهه ڪندا ڪجهه Ubuntu يا ديبين جهڙو سسٽم ۾ بيان ڪيل. مون پنهنجي پسنديده تقسيم ۾ مٿين سڀني کي لاڳو ڪرڻ جي ڪوشش ڪئي - الپائن، پر ان مان ڪجھ به نه آيو، ظاهري طور تي هن حقيقت جي ڪري ته لينڪس ڪنيل کي صارف موڊ ۾ ڊرائيور لاء سخت پابند glibc-isms آهي. مان آخر ۾ مسئلو سمجھڻ کان پوءِ ھن کي اپ اسٽريم ڏانھن رپورٽ ڪرڻ جو ارادو ڪريان ٿو.

ميزبان تي انحصار کي نصب ڪرڻ

Ubuntu کي گهٽ ۾ گهٽ هيٺين پيڪيجز جي ضرورت آهي لينڪس ڪنييل ٺاهڻ لاءِ (فرض ڪيو صاف انسٽال):

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

توھان انھن کي ھيٺ ڏنل حڪم سان انسٽال ڪري سگھو ٿا (روٽ يا سودو سان):

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

نوٽ ڪريو ته لينڪس ڪنيل مينيو سيٽ اپ پروگرام کي هلائڻ جي ضرورت پوندي انسٽاليشن جي libncurses-dev. مھرباني ڪري پڪ ڪريو ته اھو ھيٺ ڏنل حڪم سان نصب ٿيل آھي (روٽ يا سودو سان):

apt-get -y install libncurses-dev

ڪرنل ڊائون لوڊ

فيصلو ڪيو ته ڪٿي ڊائون لوڊ ڪجي ۽ پوءِ ڪرنل ٺاهيو. ھن آپريشن لاءِ، توھان کي لڳ ڀڳ 1,3 GB جي هارڊ ڊسڪ اسپيس مختص ڪرڻي پوندي، تنھنڪري پڪ ڪريو ته توھان وٽ آھي.

وڃڻ کان پوءِ kernel.org ۽ تازه ترين مستحڪم ڪنيل ڊائون لوڊ ڪرڻ لاءِ URL حاصل ڪريو. لکڻ جي وقت ۾ هي آهي: 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

ڪنيبل تعمير سيٽ اپ

ڪنيبل تعمير سسٽم هڪ سيٽ آهي ميڪ فائلون с ڪيترائي پروسيس کي خودڪار ڪرڻ لاء ڪسٽم اوزار ۽ اسڪرپٽ. پهريون، انٽرويو سيٽ اپ پروگرام کوليو:

make ARCH=um menuconfig

اهو جزوي طور ٺاهيندو ۽ توهان لاءِ هڪ ڊائلاگ باڪس ڏيکاريندو. جڏهن '[Select]'، توهان اسپيس يا Enter چابيون استعمال ڪندي ترتيب ڏيڻ جي قابل هوندا. ونڊو تي وڃو، معمول وانگر، ڪيبورڊ تير "مٿي" ۽ "هيٺ" سان، ۽ عناصر چونڊيو - "کاٻي" يا "ساڄي".

ڏسو پوائنٽر -> مطلب ته توهان هڪ ذيلي مينيو ۾ آهيو، داخل ڪريو چيڪ ذريعي رسائي. ان مان نڪرڻ جو رستو واضح طور تي آهي '[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]'.

مان صلاح ڏيان ٿو ته توهان هن پوسٽ پڙهڻ کان پوءِ ڪرنل تعمير جي اختيارن سان گڏ راند ڪريو. انهن تجربن جي ذريعي، توهان کي سمجهڻ جي لحاظ کان تمام گهڻو سکي سگهو ٿا گهٽ-سطح ڪرنل ميڪيڪل جي ڪم ۽ ان جي اسيمبلي تي مختلف جھنڊن جي اثر کي.

دال جي تعمير

لينڪس ڪنيل هڪ وڏو پروگرام آهي جيڪو تمام گهڻو ڪم ڪري ٿو. جيتوڻيڪ پراڻي هارڊويئر تي اهڙي گهٽ ۾ گهٽ ترتيب سان، اهو تعمير ڪرڻ ۾ ڪافي وقت وٺي سگھي ٿو. پوء ھيٺ ڏنل حڪم سان ڪنييل ٺاھيو:

make ARCH=um -j$(nproc)

ڇا جي لاءِ؟ هي حڪم اسان جي بلڊر کي ٻڌائيندو ته تعمير جي عمل ۾ سڀ موجود سي پي يو ڪور ۽ موضوع استعمال ڪن. ٽيم $(nproc) Build جي آخر ۾ ڪمانڊ جي آئوٽ کي متبادل بڻائي ٿو nproc، جنهن جو حصو آهي coreutils معياري Ubuntu تعمير ۾.

ڪجهه وقت کان پوء، اسان جي ڪنييل هڪ قابل عمل فائل ۾ مرتب ڪيو ويندو ./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

هي ٽاربال ڊائون لوڊ ڪريو 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

بيان ڪيل ڪارناما هڪ ننڍڙو فائيل سسٽم ٽيمپليٽ ٺاهي سگهندا. سسٽم جي فطرت جي ڪري، الپائن apk مينيجر ذريعي پيڪيجز کي انسٽال ڪرڻ تمام ڏکيو ٿيندو. پر هي FS عام خيال جو اندازو ڪرڻ لاء ڪافي هوندو.

اسان کي پڻ هڪ اوزار جي ضرورت آهي ٽيني ياداشت جي استعمال کي روڪڻ لاء زومبي عمل اسان جي مهمان جو دٻو.

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

ڪرنل ڪمانڊ لائن ٺاهڻ

لينڪس ڪنييل، ٻين ڪيترن ئي پروگرامن وانگر، ڪمانڊ لائن دليلن سان گڏ آهن جيڪي رسائي ڪري سگھجن ٿيون ڪن کي بيان ڪندي. --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

مٿيون سٽون اسان جي ڪرنل کي هيٺين ريت ٻڌائين ٿيون:

  • فرض ڪريو روٽ فائل سسٽم هڪ pseudo ڊوائيس آهي /dev/root.
  • چونڊيو hostfs روٽ فائل سسٽم ڊرائيور جي طور تي.
  • اسان کي روٽ ڊيوائس تي گيسٽ فائل سسٽم ٺاهيو.
  • ۽ ها، پڙهڻ لکڻ واري موڊ ۾.
  • صرف 64 MB جي رام استعمال ڪريو (توهان گهڻو گهٽ استعمال ڪري سگهو ٿا ان تي منحصر آهي ته توهان ڇا ڪرڻ چاهيو ٿا، پر 64 MB لڳي ٿو بهترين رقم).
  • ڪرنل خودڪار طريقي سان شروع ٿئي ٿو /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
/ # 

مٿي ڏنل manipulations اسان کي ڏيندو مهمان نظام گهٽ ۾ گهٽ، شين کان سواءِ /proc يا مقرر ڪيل ميزبان نالو. مثال طور، ھيٺ ڏنل حڪمن جي ڪوشش ڪريو:

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

مهمان کان ٻاهر نڪرڻ لاء، ٽائپ ڪريو exit يا پريس ڪنٽرول ڊي. هي شيل کي ماريندو جنهن جي پٺيان هڪ ڪنيل خوفناڪ آهي:

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

اسان کي هي ڪرنل خوفناڪ مليو آهي ڇاڪاڻ ته لينڪس ڪنيل سمجهي ٿو ته شروعاتي عمل هميشه هلندو آهي. ان کان سواء، سسٽم هاڻي ڪم نه ڪري سگهي ٿو ۽ حادثا. پر جيئن ته هي هڪ صارف موڊ وارو عمل آهي، نتيجو ڪڍڻ وارو پنهنجو پاڻ ڏانهن موڪلي ٿو SIGABRT، جنهن جي نتيجي ۾ هڪ پيداوار آهي.

مهمان نيٽ ورڪ سيٽ اپ

۽ اھو اھو آھي جتي شيون غلط ٿيڻ شروع ٿين ٿيون. يوزر موڊ لينڪس ۾ نيٽ ورڪنگ آهي جتي محدود "يوزر ​​موڊ" جو سڄو تصور ڌار ٿيڻ شروع ٿئي ٿو. سڀ کان پوء، عام طور تي سسٽم جي سطح تي، نيٽ ورڪ محدود آهي مراعات يافته اسان سڀني کي سمجھڻ جي قابل سببن لاء عملدرآمد جا طريقا.

نوٽ. في.: توهان يو ايم ايل ۾ نيٽ ورڪ سان ڪم ڪرڻ لاءِ مختلف اختيارن بابت وڌيڪ پڙهي سگهو ٿا هتي.

Slirp ڏانهن سفر

تنهن هوندي به، اتي هڪ قديم ۽ لڳ ڀڳ اڻڄاتل اوزار سڏيو ويندو آهي سِلِپ، جنهن سان يوزر موڊ لينڪس نيٽ ورڪ سان لهه وچڙ ڪري سگهي ٿو. اهو ڪم ڪري ٿو گهڻو ڪري صارف جي سطح جي TCP/IP اسٽيڪ وانگر ۽ هلائڻ لاءِ ڪنهن به سسٽم جي اجازت جي ضرورت ناهي. هي اوزار هو 1995 ۾ جاري ڪيو ويو، ۽ تازي تازه ڪاري جي تاريخ آهي 2006 سال. سليپ تمام پراڻي آهي. وقت جي دوران بغير سپورٽ ۽ تازه ڪاريون، گڏ ڪرڻ وارا ايترو پري ٿي ويا آهن ته هاڻي هي اوزار صرف بيان ڪري سگهجي ٿو ڪوڊ روٽ.

سو اچو ته Ubuntu Repositories مان Slirp ڊائون لوڊ ڪريون ۽ ان کي هلائڻ جي ڪوشش ڪريون:

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.

غلطي اسان ۾ ڦٽي ٿي هن لائن. اچو ته اسٽيڪ ٽريڪ تي نظر رکون، ٿي سگهي ٿو ته ڪجهه اسان جي مدد ڪندو.

(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 ٺهيل مان ٺهيل ڪم ڪري ٿو. مون آرڪائيو ٻيهر ڊائون لوڊ ڪيو سڌو سنئون سائيٽ تان ذريعو، ڇاڪاڻ ته ڪمانڊ لائن ذريعي اتان کان ڪا شيءِ ڇڪڻ هڪ درد آهي:

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

نه. اهو به ڪم نٿو ڪري. اڃا تائين انهن ڪمن لاءِ علامتون نه ملي سگهيون آهن.

هن موقعي تي، مون کي ڇڏي ڏنو ۽ Github تي ڏسڻ شروع ڪيو 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 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

صورت ۾ پيڪيج ٺاهيندڙ ان کي هٽائي ٿو، I هڪ آئينو ٺاهيو.

نيٽورڪ ترتيب

هاڻي اچو ته نيٽ ورڪ سيٽ اپ ڪريون اسان جي گيسٽ ڪنيل تي. تازه ڪاري لانچ جا اختيار:

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 سان گفتگو ڪرڻ لاءِ نيٽ ورڪ انٽرفيس سيٽ ڪري ٿو. ٽيم route ڪرنل روٽنگ ٽيبل کي سيٽ ڪري ٿو سڀني ٽرئفڪ کي مجبور ڪرڻ لاءِ 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

Работает!

نوٽ في.: بظاهر، اصل پوسٽ هڪ ڊيسڪ ٽاپ تي وائرڊ نيٽ ورڪ ڪارڊ سان لکيل هئي، يا ڪجهه ٻيون ترتيبون جنهن کي اضافي ڊرائيورن جي ضرورت نه هئي. انٽيل کان وائي فائي 8265 سان ليپ ٽاپ تي، نيٽ ورڪ وڌائڻ وقت هڪ نقص ٿئي ٿو

/ # 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 ۾)، انٽرفيس صحيح طور تي وڌي ٿو.

اچو ته ھيٺ ڏنل شيل اسڪرپٽ سان ريڊائريڪٽ کي خودڪار ڪريون:

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

نيٽ ورڪ مستحڪم آهي!

docker فائل

توھان لاءِ آسان بڻائڻ لاءِ ھي سڀ ڪجھ چيڪ ڪرڻ لاءِ، مون گڏ ڪيو آھي Dockerfile، جيڪو بيان ڪيل گھڻن قدمن کي خودڪار ڪري ٿو ۽ توھان کي ڪم ڪندڙ ترتيب ڏيڻ گھرجي. مون کي به آهي اڳواٽ ترتيب ڏنل kernel، جنهن ۾ هر شي آهي جيڪا پوسٽ ۾ بيان ڪئي وئي آهي. پر اهو سمجهڻ ضروري آهي ته هتي مون صرف گهٽ ۾ گهٽ سيٽنگ جو ذڪر ڪيو آهي.

مون کي اميد آهي ته هي پوسٽ توهان کي سمجهڻ ۾ مدد ڪئي آهي ته مهمان ڪني کي ڪيئن وڌايو وڃي. اهو ڪجهه قسم جو راکشس بڻجي ويو، پر اشاعت هن خاندان جي آپريٽنگ سسٽم جي جديد نسخن جي تحت لينڪس ۾ صارف موڊ جي تعمير، تنصيب ۽ ترتيب ڏيڻ تي هڪ جامع گائيڊ طور تصور ڪيو ويو. ايندڙ قدمن ۾ شامل ٿيڻ گھرجي تنصيب خدمتون ۽ ٻيون سافٽ ويئر اڳ ۾ ئي مهمان سسٽم اندر. جيئن ته ڊاڪر ڪنٽينر تصويرون صرف عوامي ٽاربالز آهن، توهان کي ان جي ذريعي تصوير ڪڍڻ جي قابل هوندو docker export، ۽ پوءِ ان جي انسٽاليشن جو رستو مقرر ڪريو مهمان ڪرنل جي فائيل سسٽم جي روٽ ۾. چڱو، پوء شيل اسڪرپٽ تي عمل ڪريو.

فرينوڊ تي #lobsters کان Rkeene جي خاص مهرباني. Slirp کي ڊيبگ ڪرڻ ۾ سندس مدد کان سواءِ، مان ايترو پري حاصل نه ڪريان ها. مون کي خبر ناهي ته ڪيئن هن جو سليڪ ويئر سسٽم صحيح طريقي سان سلرپ سان ڪم ڪري ٿو، پر منهنجو اوبنٽو ۽ الپائن سسٽم سلرپ کي قبول نه ڪيو ۽ بائنري ريڪن مون کي تجويز ڪيو. پر اهو مون لاء ڪافي آهي ته گهٽ ۾ گهٽ ڪجهه ڪم ڪري ٿو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو