Linux Kernel Library: Linux kernel in so or dll form factor

بمجرد قراءة مقال عن اختيار أنظمة الملفات "بحيث تعمل في كل مكان وفي كل مكان". مرة أخرى ، رأيت شكاوى من أن Ext4 هو نظام ملفات رائع ، ولكن على نظام Windows يوجد فقط المنحنيات السائقين الملكية غير دقيقة. لكننا قمنا بترديد الشريط منذ عامين: ثم على Habré (وفي تلك الأيام - Giktayms) الأخبار عن LibOS التي طار بها - محاولة لتحويل نواة Linux إلى مكتبة وضع المستخدم العادية. كان هناك تركيز على إزالة مكدس الشبكة في مساحة المستخدم. مرة واحدة ، قررت إلقاء نظرة ومعرفة ما إذا كان المشروع على قيد الحياة ، ورأيت على مدونته رابطًا لنوع من المنافسين - مشروع مكتبة Linux Kernel (LKL) . في الواقع ، هذا هو منفذ kernel ، إذا جاز التعبير ، إلى بنية الأجهزة "مكتبة وضع المستخدم POSIX / Win32".


ما هو مثير للاهتمام LKL؟ أولاً ، بحقيقة أنها تعيش وتعيش ، وإن لم تكن في قاعدة الكود الأساسية للنواة. ثانياً ، إنه دعم صريح إلى حد ما لـ "الهندسة المعمارية" ، والذي يتيح تلقائيًا معظم النواة. علاوة على ذلك ، توجد أمثلة على الأدوات المساعدة في المجموعة: cptofs / cpfromfs ، fs2tar ، lklfuse . في هذه المقالة ، سنختبر LKL على نظام Linux المضيف ، وننظر إلى الملف مع صورة Ext4 (Btrfs ، XFS ...) بدون جذر والأجهزة الظاهرية وسنناقش بإيجاز كيف يمكن تجربته على Windows.


تنويه 1: تريد أن تجرب ذلك - إجراء نسخ احتياطي. إذا كنت ترغب في القيام بذلك مع قسم يحتوي على بيانات مهمة - على مسؤوليتك الخاصة ومخاطرك. ومع ذلك ، هنا على الأقل سيكون السائقون أصليين.


إخلاء المسئولية 2: احترام التراخيص. ربط LKL ربما يجعل برنامج GPL الخاص بك.


التعارف الأساسي


مستودع LKL ( lkl / linux على GitHub) هو شوكة لنظام Linux المعتاد ، مما يضيف دعما لهندسة أخرى ، سنرى ذلك بشكل رئيسي في tools/lkl arch/lkl و tools/lkl . دعونا نجعل نسخة من المستودع ونحاول التجميع وفقًا للتعليمات. بالنسبة للتجارب ، سأستخدم استنساخًا ضحلًا ، لا يحتوي على السجل الكامل لمستودع التخزين ، ولكن فقط عدد المحددات الأخيرة:


 $ git clone https://github.com/lkl/linux.git lkl-linux --depth 10 $ cd lkl-linux $ patch -p 1 <<EOF diff --git a/tools/lkl/lib/hijack/xlate.cb/tools/lkl/lib/hijack/xlate.c index 03ccc6294..75368dcc2 100644 --- a/tools/lkl/lib/hijack/xlate.c +++ b/tools/lkl/lib/hijack/xlate.c @@ -3,6 +3,7 @@ #include <fcntl.h> #include <sys/ioctl.h> #include <sys/socket.h> +#include <linux/sockios.h> #undef st_atime #undef st_mtime #undef st_ctime EOF $ make -C tools/lkl -j4 

كان علي إصلاح المصدر قليلاً ، لكن في النهاية حصلت على tools/lkl/lib/liblkl.so (وكذلك tools/lkl/liblkl.a الثابتة tools/lkl/liblkl.a ):


نانومتر -D أدوات / lkl / lib / liblkl.so
  U __assert_fail U bind U calloc U clock_gettime U close w __cxa_finalize 0000000000063b30 T dbg_entrance 0000000000063f30 T dbg_handler U __errno_location U fcntl U fdatasync 0000000000639580 D fd_net_ops U fgets U __fprintf_chk U free U fwrite U getc U getenv w __gmon_start__ U if_nametoindex U inet_pton U ioctl U __isoc99_scanf w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable 0000000000061750 T jmp_buf_longjmp 0000000000061720 T jmp_buf_set 0000000000065470 T jsmn_init 0000000000065060 T jsmn_parse 0000000000065490 T jsmn_strerror 00000000000614c0 T lkl_add_gateway 0000000000061290 T lkl_add_neighbor 00000000000621a0 T lkl_bug 000000000005f070 T lkl_closedir 0000000000639520 D lkl_dev_blk_ops 000000000005fa10 T lkl_dirfd 0000000000062640 T lkl_disk_add 0000000000062780 T lkl_disk_remove 000000000005ec50 T lkl_encode_dev_from_sysfs 000000000005f9f0 T lkl_errdir 000000000005ef80 T lkl_fdopendir 0000000000067f10 T lkl_get_free_irq 000000000005f2c0 T lkl_get_virtio_blkdev 00000000006395c0 D lkl_host_ops 00000000000614b0 T lkl_if_add_gateway 00000000000613e0 T lkl_if_add_ip 00000000000614a0 T lkl_if_add_linklocal 0000000000061520 T lkl_if_add_rule_from_saddr 0000000000061480 T lkl_if_del_ip 0000000000060d70 T lkl_if_down 0000000000060b10 T lkl_ifname_to_ifindex 0000000000061400 T lkl_if_set_ipv4 0000000000061530 T lkl_if_set_ipv4_gateway 0000000000061430 T lkl_if_set_ipv6 00000000000615b0 T lkl_if_set_ipv6_gateway 0000000000060ef0 T lkl_if_set_mtu 0000000000060bf0 T lkl_if_up 0000000000061160 T lkl_if_wait_ipv6_dad 000000000005fba0 T lkl_iomem_access 000000000005fb50 T lkl_ioremap 0000000000067730 T lkl_is_running 0000000000066150 T lkl_load_config_env 0000000000065950 T lkl_load_config_json 0000000000066880 T lkl_load_config_post 0000000000066510 T lkl_load_config_pre 000000000005f470 T lkl_mount_dev 000000000005eae0 T lkl_mount_fs 00000000000642a0 T lkl_netdev_add 00000000000645c0 T lkl_netdev_free 0000000000061030 T lkl_netdev_get_ifindex 0000000000064e70 T lkl_netdev_macvtap_create 0000000000064ed0 T lkl_netdev_pipe_create 0000000000064ce0 T lkl_netdev_raw_create 00000000000644c0 T lkl_netdev_remove 0000000000064c60 T lkl_netdev_tap_create 0000000000064a10 T lkl_netdev_tap_init 000000000005eea0 T lkl_opendir 0000000000062170 T lkl_perror 00000000000620b0 T lkl_printf 0000000000067f90 T lkl_put_irq 0000000000061620 T lkl_qdisc_add 0000000000061630 T lkl_qdisc_parse_add 000000000005f0f0 T lkl_readdir 0000000000063f80 T lkl_register_dbg_handler 0000000000064930 T lkl_register_netdev_fd 000000000005efe0 T lkl_rewinddir 000000000005fa20 T lkl_set_fd_limit 00000000000614e0 T lkl_set_ipv4_gateway 0000000000061500 T lkl_set_ipv6_gateway 0000000000065f60 T lkl_show_config 00000000004f51ad T lkl_start_kernel 0000000000062080 T lkl_strerror 00000000000685f0 T lkl_syscall 0000000000062270 T lkl_sysctl 0000000000062410 T lkl_sysctl_parse_write 0000000000067770 T lkl_sys_halt 00000000000680e0 T lkl_trigger_irq 000000000005f870 T lkl_umount_dev 000000000005edc0 T lkl_umount_timeout 0000000000066ed0 T lkl_unload_config 00000000008186a0 B lkl_virtio_devs U __longjmp_chk U lseek64 U malloc U memchr U memcpy U memset U open U perror U pipe U poll 0000000000064070 T poll_thread U pread64 U __printf_chk U pthread_create U pthread_detach U pthread_exit U pthread_getspecific U pthread_join U pthread_key_create U pthread_key_delete U pthread_mutexattr_init U pthread_mutexattr_settype U pthread_mutex_destroy U pthread_mutex_init U pthread_mutex_lock U pthread_mutex_unlock U pthread_self U pthread_setspecific U puts U pwrite64 U read U readv 00000000008196a0 B registered_devs 000000000005fa90 T register_iomem U sem_destroy U sem_init U sem_post U sem_wait U _setjmp U setsockopt U sigaction U sigemptyset U __snprintf_chk U socket U __stack_chk_fail U stderr U stdin U stpcpy U strchr U strcpy U __strcpy_chk U strdup U strerror U strlen U strncat U __strncat_chk U strncmp U strncpy U strrchr U strtok U strtok_r U strtol U strtoul U syscall U timer_create U timer_delete U timer_settime 000000000005fb00 T unregister_iomem U usleep 0000000000063110 T virtio_dev_cleanup 0000000000062ee0 T virtio_dev_setup 0000000000063100 T virtio_get_num_bootdevs 0000000000062c10 T virtio_process_queue 0000000000062af0 T virtio_req_complete 0000000000062ec0 T virtio_set_queue_max_merge_len U __vsnprintf_chk U write U writev 

وأين هي مكالمات النظام ، تسأل. بدون ذعر ، يتم إخفاؤها خلف نقطة الدخول الشائعة lkl_syscall . هذا هو تناظرية وظيفة syscall ل syscall . في حالة حقيقية ، في معظم الحالات ، ستستخدم الأغلفة المكتوبة lkl_sys_<name> . نرى أيضًا جميع أنواع الوظائف لتكوين "kernel" ، وإضافة أجهزة افتراضية إليها ، بالإضافة إلى أغلفة على مكالمات النظام "المعقدة" ، التي يوفرها نظام libc على نظام منتظم. على سبيل المثال ، هناك مثل هذه getdents استدعاء النظام ، ولكن ... "هذه ليست واجهات كنت مهتما بها." - الصفحة رجل يخبرنا من العتبة. في الحالات العادية ، من المفترض أن تستخدم readdir (3) وظيفة المكتبة القياسية ، ولكن لا readdir (2) مع readdir (2) ، وهو استدعاء للنظام القديم لم يتم تطبيقه حتى على x86_64. في حالة العمل مع LKL ، ستحتاج إلى lkl_opendir / lkl_readdir / lkl_closedir .


دعنا نحاول كتابة شيء ما


تذكر ، واحترام التراخيص. يتم توزيع Linux kernel نفسه ضمن GPL2 ، ما إذا كان البرنامج الذي يتم سحبه لواجهات LKL العامة نسبيًا سيعتبر مشتقًا - لا أعرف.


حسنًا ، دعنا نحاول الربط بالمكتبة. من المفترض أن المتغير $LKL تعيين المسار إلى المستودع باستخدام LKL المترجمة.


 #include <stdio.h> #include "lkl_host.h" #include "lkl.h" int main() { // lkl_host_ops       // "-" : `printk`, `panic`, ... // ,    --     lkl_start_kernel(&lkl_host_ops, "mem=128M"); return 0; } 

تجميع:


 $ gcc test.c -o test -I$LKL/tools/lkl/include -L$LKL/tools/lkl/lib -llkl 

وهي تعمل!


 $ ./test ./test: error while loading shared libraries: liblkl.so: cannot open shared object file: No such file or directory $ LD_LIBRARY_PATH=$LKL/tools/lkl/lib ./test [ 0.000000] Linux version 5.3.0+ (trosinenko@trosinenko-pc) (gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2)) #1 Tue Dec 3 14:37:02 MSK 2019 [ 0.000000] memblock address range: 0x7fba8c000000 - 0x7fba93fff000 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 32319 [ 0.000000] Kernel command line: mem=128M [ 0.000000] Dentry cache hash table entries: 16384 (order: 5, 131072 bytes, linear) [ 0.000000] Inode-cache hash table entries: 8192 (order: 4, 65536 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Memory available: 129044k/131068k RAM [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS: 4096 [ 0.000000] lkl: irqs initialized [ 0.000000] clocksource: lkl: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns [ 0.000000] lkl: time and timers initialized (irq1) [ 0.000003] pid_max: default: 4096 minimum: 301 [ 0.000019] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear) [ 0.000022] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear) [ 0.003622] random: get_random_bytes called from _etext+0xbcdb/0x14b05 with crng_init=0 [ 0.003692] printk: console [lkl_console0] enabled [ 0.003707] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.003714] xor: automatically using best checksumming function 8regs [ 0.003783] NET: Registered protocol family 16 [ 0.171647] raid6: int64x8 gen() 4489 MB/s [ 0.343119] raid6: int64x8 xor() 3165 MB/s [ 0.514836] raid6: int64x4 gen() 4668 MB/s [ 0.689529] raid6: int64x4 xor() 3256 MB/s [ 0.861155] raid6: int64x2 gen() 6283 MB/s [ 1.032668] raid6: int64x2 xor() 3793 MB/s [ 1.206752] raid6: int64x1 gen() 5185 MB/s [ 1.378219] raid6: int64x1 xor() 2901 MB/s [ 1.378225] raid6: using algorithm int64x2 gen() 6283 MB/s [ 1.378227] raid6: .... xor() 3793 MB/s, rmw enabled [ 1.378229] raid6: using intx1 recovery algorithm [ 1.378333] clocksource: Switched to clocksource lkl [ 1.378427] NET: Registered protocol family 2 [ 1.378516] tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes, linear) [ 1.378521] TCP established hash table entries: 1024 (order: 1, 8192 bytes, linear) [ 1.378527] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear) [ 1.378532] TCP: Hash tables configured (established 1024 bind 1024) [ 1.378596] UDP hash table entries: 128 (order: 0, 4096 bytes, linear) [ 1.378618] UDP-Lite hash table entries: 128 (order: 0, 4096 bytes, linear) [ 1.379286] workingset: timestamp_bits=62 max_order=16 bucket_order=0 [ 1.380271] SGI XFS with ACLs, security attributes, no debug enabled [ 1.380864] io scheduler mq-deadline registered [ 1.380872] io scheduler kyber registered [ 1.383396] NET: Registered protocol family 10 [ 1.383763] Segment Routing with IPv6 [ 1.383779] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver [ 1.384091] Btrfs loaded, crc32c=crc32c-generic [ 1.384223] Warning: unable to open an initial console. [ 1.384237] This architecture does not have kernel memory protection. [ 1.384239] Run /init as init process 

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


نحن تعقيد التجربة


دعونا الآن نحاول استخدام هذه المكتبة بطريقة أو بأخرى - بعد كل شيء ، نواة نظام التشغيل بأكملها! دعونا نحاول قراءة الملف من قسم Ext4 بشكل نظيف في مساحة المستخدم. والسائق "الأصلي"! نأخذ tools/lkl/cptofs.c فقط الأكثر أهمية (من أجل الوضوح):


 #undef NDEBUG #include <stdio.h> #include <stdint.h> #include <string.h> #include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include "lkl_host.h" #include "lkl.h" //        , //     --     :) int main(int argc, const char *argv[]) { const char * const fsimage = argv[1]; const char * const fstype = argv[2]; const char * const file_to_dump = argv[3]; struct lkl_disk disk; int disk_id, ret; char mpoint[128]; //      memset(&disk, 0, sizeof(disk)); disk.fd = open(fsimage, O_RDONLY); assert(disk.fd >= 0); //      disk_id = lkl_disk_add(&disk); assert(disk_id >= 0); //   lkl_start_kernel(&lkl_host_ops, "mem=128M"); //      ret = lkl_mount_dev(disk_id, 0 /* part */, fstype, LKL_MS_RDONLY, NULL, mpoint, sizeof(mpoint)); if (ret < 0) { fprintf(stderr, "lkl_mount_dev failed: %s\n", lkl_strerror(ret)); close(disk.fd); exit(1); } // ,    ... // ( -libc ) struct lkl_dir *dir = lkl_opendir(mpoint, &ret); struct lkl_linux_dirent64 *dent; while ((dent = lkl_readdir(dir)) != NULL) { fprintf(stderr, "Directory entry: %s\n", dent->d_name); } //     : NULL --     ... lkl_closedir(dir); //   - //        char tmp[256]; uint8_t buffer[65536]; snprintf(tmp, sizeof(tmp), "%s/%s", mpoint, file_to_dump); int fd = lkl_sys_open(tmp, LKL_O_RDONLY, 0); fprintf(stderr, "fd = %d\n", fd); assert(fd >= 0); int count = lkl_sys_read(fd, buffer, sizeof(buffer)); /*  */ write(STDERR_FILENO, buffer, count); lkl_sys_close(fd); return 0; } 

انتبه للتعريفات التي تمت إعادة تسميتها باستخدام بادئات LKL_ (على سبيل المثال ، LKL_O_RDONLY ): على مضيف Linux ، من المرجح أنها تتزامن مع تلك التي لا تحتوي على بادئات ، ولكن هذه ليست حقيقة.


 $ mke2fs ext4.img -t ext4 32M $ sudo mount ext4.img /mnt $ echo -e "Hello world\!\nTEST" | sudo tee /mnt/test.txt $ sudo umount /mnt $ LD_LIBRARY_PATH=$LKL/tools/lkl/lib ./read-file ext4.img ext4 test.txt [ 0.000000] Linux version 5.3.0+ (trosinenko@trosinenko-pc) (gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2)) #1 Tue Dec 3 14:37:02 MSK 2019 // ... // [ 1.378960] Warning: unable to open an initial console. [ 1.378975] This architecture does not have kernel memory protection. [ 1.378977] Run /init as init process [ 1.379852] EXT4-fs (vda): mounted filesystem with ordered data mode. Opts: Directory entry: test.txt Directory entry: .. Directory entry: lost+found Directory entry: . fd = 0 Hello world\! TEST 

واو ، إنه يعمل! هل هناك أي شيء أكثر غرابة؟


 $ mksquashfs test.c read-file.c squashfs.img $ LD_LIBRARY_PATH=$LKL/tools/lkl/lib ./read-file squashfs.img squashfs test.c [ 0.000000] Linux version 5.3.0+ (trosinenko@trosinenko-pc) (gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2)) #1 Tue Dec 3 14:37:02 MSK 2019 // ... // [ 1.378472] This architecture does not have kernel memory protection. [ 1.378474] Run /init as init process lkl_mount_dev failed: No such device 

أوتش! على الرغم من الانتظار ، فربما لم ندرج دعم SquashFS في مكتبتنا الأساسية!


تكوين خيارات بناء LKL


بالنسبة لي ، قمت بتطوير سلسلة من الأوامر التي تعمل مع LKL - ربما يمكن اختزالها إلى make defconfig التقليدي make defconfig ، make menuconfig .


 $ make defconfig ARCH=lkl $ make menuconfig ARCH=lkl ////   SquashFS      $ cp .config arch/lkl/configs/defconfig $ make mrproper $ make -C tools/lkl -j4 #     

وفويلا!


 $ gcc read-file.c -o read-file -I$LKL/tools/lkl/include -L$LKL/tools/lkl/lib -llkl $ LD_LIBRARY_PATH=$LKL/tools/lkl/lib ./read-file squashfs.img squashfs test.c [ 0.000000] Linux version 5.3.0+ (trosinenko@trosinenko-pc) (gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2)) #1 Wed Dec 4 12:07:50 MSK 2019 // ... // [ 1.378346] This architecture does not have kernel memory protection. [ 1.378348] Run /init as init process Directory entry: . Directory entry: .. Directory entry: read-file.c Directory entry: test.c fd = 0 #include <stdio.h> #include "lkl_host.h" #include "lkl.h" int main() { lkl_start_kernel(&lkl_host_ops, "mem=128M"); return 0; } 

في هذه الحالة ، ومع ذلك ، كان من الضروري إعادة ترجمة ملف read-file.c - المكتبة حيوية.


إسمح لي ، أين هي البرامج الجاهزة الموعودة؟


في الواقع ، يحتوي tools/lkl على cptofs.c و fs2tar.c وأكثر من ذلك بكثير ، لكنه لن! بعد البحث في Makefiles ، وجدت أن هناك Makefile.autoconf معينة تبحث عن ملفات الرأس المطلوبة و Makefile.conf ، حيث يتم كتابة كل هذا.


لذلك ، شخص ما يريد libarchive ، شخص ما يريد libarchive - حسنًا ، دعنا نضع libarchive-dev ، libfuse-dev (في حالة Ubuntu) وإعادة البناء. ومع ذلك ، فهو لا يعمل ... وإذا قمت بإزالة Makefile.conf ... عفوًا ، فقد تضافرت!


إذن ماذا لدينا الآن؟ الآن في دليل tools/lkl لدينا cptofs ، fs2tar و lklfuse .


أولاً ، انسخ cptofs كـ cpfromfs :


 $ $LKL/tools/lkl/cptofs --help Usage: cptofs [OPTION...] -t fstype -i fsimage path... fs_path Copy files to a filesystem image -i, --filesystem-image=string path to the filesystem image - mandatory -p, --enable-printk show Linux printks -P, --partition=int partition number -s, --selinux=string selinux attributes for destination -t, --filesystem-type=string select filesystem type - mandatory -?, --help Give this help list --usage Give a short usage message Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. $ cp $LKL/tools/lkl/cp{to,from}fs $ $LKL/tools/lkl/cpfromfs --help Usage: cpfromfs [OPTION...] -t fstype -i fsimage fs_path... path Copy files from a filesystem image -i, --filesystem-image=string path to the filesystem image - mandatory -p, --enable-printk show Linux printks -P, --partition=int partition number -s, --selinux=string selinux attributes for destination -t, --filesystem-type=string select filesystem type - mandatory -?, --help Give this help list --usage Give a short usage message Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. 

كما يقول المثل ، "ماذا تسمون يخت ...". نبدأ ...


 $ $LKL/tools/lkl/cpfromfs -t ext4 -i ext4.img test.txt . error processing entry /mnt/0000fe00/test.txt, aborting 

حسنًا ... يجب أن نرى ... ومع ذلك ، للاستخدام التفاعلي ، لا يزال غير مريح ، لأنه في كل مرة يتعين عليك الانتظار لمدة ثانية حتى يتم تشغيل النواة. لكن fs2tar يعمل دون مشاكل:


 $ $LKL/tools/lkl/fs2tar -t ext4 ext4.img ext4.tar $ tar -tf ext4.tar tar:   `/'    /test.txt /lost+found/ 

لكن البرنامج الأكثر إثارة للاهتمام هنا في رأيي هو lklfuse :


 $ mkdir mountpoint $ $LKL/tools/lkl/lklfuse -o type=ext4 ext4.img mountpoint/ $ ls mountpoint/ lost+found test.txt $ mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) ...   ,       /dev/fuse on /run/user/1000/doc type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) lklfuse on /path/to/mountpoint type fuse.lklfuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) $ echo ABC > mountpoint/ABC.XYZ $ umount mountpoint $ sudo mount ext4.img /mnt $ ls /mnt $ cat /mnt/ABC.XYZ ABC 

في رأيي ، إنه أمر مثير للإعجاب: يمكنك تثبيت نظام الملفات من خلال FUSE بدون جذر (ولكن هذا يعتمد على إعدادات النظام) ، والعمل معه ، وإلغاء تحميله ، ثم توصيله بـ kernel المضيف (بالفعل مع الجذر) والمتابعة كما لو لم يحدث شيء.


ليس ذلك فحسب ، يتيح lklfuse للمستخدم العادي تحميل قسم باستخدام برنامج تشغيل kernel عادي. لا يلزم بناء المضيف الأساسي بدعم من هذا FS. ولكن ما هناك ، لن يفاجأ إذا بدأ كل شيء بنفس الطريقة على نظام التشغيل X.


قليلا عن عبر منصة


ولكن ماذا عن الوصول إلى Linux FS من أنظمة التشغيل الأخرى؟ على نظام OS X ، أعتقد أنه سيكون أكثر بساطة: بعد كل شيء ، إنه UNIX كامل ، ويبدو أن دعم FUSE موجود. لذلك هناك أمل في أن تبدأ هذه الخطوة. إذا لم يكن الأمر كذلك ، LKL_ في اتجاه التحقق مما إذا كانت الثوابت ذات البادئات LKL_ يتم تمريرها في كل مكان إلى مكالمات نظام LKL ، وليس نظيراتها المضيفة.


يعد Windows أكثر تعقيدًا بعض الشيء: أولاً ، قد لا تكون هناك مكتبات شائعة مألوفة في عالم UNIX (على سبيل المثال ، لتحليل وسيطات سطر الأوامر). ثانياً ، تحتاج إلى فهم كيفية التحميل إلى شجرة نظام الملفات المضيفة. سيكون أبسط - أيضا من خلال FUSE. يقولون أنه بمجرد وجود دوكان معين ، يوجد الآن أيضًا شيء ما ، لكنك تحتاج إلى google. الشيء الرئيسي هو أن LKL نفسها مبنية على نظام Windows ، ما عليك سوى مراعاة أنه يحتاج إلى نوع 64 بت long للعمل في وضع 64 بت ، لذلك لن يعمل كل مترجم (على الأقل ، كما هو موضح في الملف التمهيدي الحالي للمشروع).

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


All Articles