loop(4)

الاسم
loop، loop-control - أجهزة loop

موجز
#include <linux/loop.h>

الوصف
جهاز loop هو جهاز كتلي يربط كتل بياناته ليس بجهاز مادي مثل القرص الصلب أو محرك الأقراص الضوئية، بل بكتل ملف عادي في نظام ملفات أو بجهاز كتلي آخر. يمكن أن يكون هذا مفيدًا على سبيل المثال لتوفير جهاز كتلي لصورة نظام ملفات مخزنة في ملف، بحيث يمكن وصلها باستخدام الأمر mount(8). يمكنك القيام بما يلي

    $ dd if=/dev/zero of=file.img bs=1MiB count=10;
    $ sudo losetup /dev/loop4 file.img;
    $ sudo mkfs -t ext4 /dev/loop4;
    $ sudo mkdir /myloopdev;
    $ sudo mount /dev/loop4 /myloopdev;

انظر losetup(8) لمثال آخر.

يمكن تحديد دالة نقل لكل جهاز loop لأغراض التعمية وفك التعمية.

تُوفر عمليات ioctl(2) التالية بواسطة جهاز loop الكتلي:

LOOP_SET_FD
    اربط جهاز loop بالملف المفتوح الذي وُمرر واصف ملفه كمعامل ioctl(2) (الثالث).

LOOP_CLR_FD
    افصل جهاز loop عن أي واصف ملف.

LOOP_SET_STATUS
    اضبط حالة جهاز loop باستخدام معامل ioctl(2) (الثالث). هذا المعامل هو مؤشر إلى بنية loop_info، المُعرفة في <linux/loop.h> كالتالي:

        struct loop_info {
            int           lo_number;      /* ioctl r/o */
            dev_t         lo_device;      /* ioctl r/o */
            unsigned long lo_inode;       /* ioctl r/o */
            dev_t         lo_rdevice;     /* ioctl r/o */
            int           lo_offset;
            int           lo_encrypt_type;
            int           lo_encrypt_key_size;  /* ioctl w/o */
            int           lo_flags;       /* ioctl r/w (r/o قبل
                                             لينكس 2.6.25) */
            char          lo_name[LO_NAME_SIZE];
            unsigned char lo_encrypt_key[LO_KEY_SIZE];
                                          /* ioctl w/o */
            unsigned long lo_init[2];
            char          reserved[4];
        };

    يجب أن يكون نوع التعمية (lo_encrypt_type) واحدًا من LO_CRYPT_NONE، أو LO_CRYPT_XOR، أو LO_CRYPT_DES، أو LO_CRYPT_FISH2، أو LO_CRYPT_BLOW، أو LO_CRYPT_CAST128، أو LO_CRYPT_IDEA، أو LO_CRYPT_DUMMY، أو LO_CRYPT_SKIPJACK، أو (منذ لينكس 2.6.0) LO_CRYPT_CRYPTOAPI.

    حقل lo_flags هو قناع بتات يمكن أن يتضمن صفرًا أو أكثر مما يلي:

    LO_FLAGS_READ_ONLY
        جهاز loopback للقراءة فقط.

    LO_FLAGS_AUTOCLEAR (منذ لينكس 2.6.25)
        سيُدمر جهاز loopback آليًا عند آخر إغلاق.

    LO_FLAGS_PARTSCAN (منذ لينكس 3.2)
        اسمح بمسح الأقسام آليًا.

    LO_FLAGS_DIRECT_IO (منذ لينكس 4.10)
        استخدم وضع الإدخال/الإخراج المباشر للوصول إلى الملف الخلفي.

    أعلام lo_flags الوحيدة التي يمكن تعديلها بواسطة LOOP_SET_STATUS هي LO_FLAGS_AUTOCLEAR و LO_FLAGS_PARTSCAN.

LOOP_GET_STATUS
    اجلب حالة جهاز loop. يجب أن يكون معامل ioctl(2) (الثالث) مؤشرًا إلى struct loop_info.

LOOP_CHANGE_FD (منذ لينكس 2.6.5)
    حول المخزن الخلفي لجهاز loop إلى واصف الملف الجديد المحدد في معامل ioctl(2) (الثالث)، والذي هو عدد صحيح. هذه العملية ممكنة فقط إذا كان جهاز loop للقراءة فقط وكان المخزن الخلفي الجديد بنفس الحجم والنوع للمخزن الخلفي القديم.

LOOP_SET_CAPACITY (منذ لينكس 2.6.30)
    غير حجم جهاز loop نشط. يمكن للمرء تغيير حجم المخزن الخلفي الأساسي ثم استخدام هذه العملية ليعرف مشغل loop الحجم الجديد. لا تأخذ هذه العملية أي معامل.

LOOP_SET_DIRECT_IO (منذ لينكس 4.10)
    اضبط وضع الإدخال/الإخراج المباشر (DIRECT I/O) على جهاز loop، ليُستخدم لفتح الملف الخلفي. معامل ioctl(2) (الثالث) هو قيمة طويلة غير موقعة. تمثل القيمة غير الصفرية وضع الإدخال/الإخراج المباشر.

LOOP_SET_BLOCK_SIZE (منذ لينكس 4.14)
    اضبط حجم الكتلة لجهاز loop. معامل ioctl(2) (الثالث) هو قيمة طويلة غير موقعة. يجب أن تكون هذه القيمة من قوى العدد اثنين في النطاق [512,pagesize]؛ وإلا، ستنتج خطأ EINVAL.

LOOP_CONFIGURE (منذ لينكس 5.8)
    أعدّ واضبط جميع معاملات جهاز loop في خطوة واحدة باستخدام معامل ioctl(2) (الثالث). هذا المعامل هو مؤشر إلى بنية loop_config، المُعرفة في <linux/loop.h> كالتالي:

        struct loop_config {
            __u32               fd;
            __u32               block_size;
            struct loop_info64  info;
            __u64               __reserved[8];
        };

    بالإضافة إلى ما يمكن لـ LOOP_SET_STATUS فعله، يمكن استخدام LOOP_CONFIGURE أيضًا للقيام بما يلي:

    •   ضبط حجم الكتلة الصحيح فورًا عن طريق ضبط loop_config.block_size؛

    •   طلب وضع الإدخال/الإخراج المباشر صراحةً عن طريق ضبط LO_FLAGS_DIRECT_IO في loop_config.info.lo_flags؛ و

    •   طلب وضع القراءة فقط صراحةً عن طريق ضبط LO_FLAGS_READ_ONLY في loop_config.info.lo_flags.

منذ لينكس 2.6، توجد عمليتا ioctl(2) جديدتان:

LOOP_SET_STATUS64
LOOP_GET_STATUS64
    هاتان العمليتان مشابهتان لـ LOOP_SET_STATUS و LOOP_GET_STATUS الموضحتين أعلاه ولكنهما تستخدمان بنية loop_info64، التي تحتوي على بعض الحقول الإضافية ونطاق أكبر لبعض الحقول الأخرى:

        struct loop_info64 {
            uint64_t lo_device;           /* ioctl r/o */
            uint64_t lo_inode;            /* ioctl r/o */
            uint64_t lo_rdevice;          /* ioctl r/o */
            uint64_t lo_offset;
            uint64_t lo_sizelimit;  /* بايت، 0 == أقصى متاح */
            uint32_t lo_number;           /* ioctl r/o */
            uint32_t lo_encrypt_type;
            uint32_t lo_encrypt_key_size; /* ioctl w/o */
            uint32_t lo_flags; i          /* ioctl r/w (r/o قبل
                                             لينكس 2.6.25) */
            uint8_t  lo_file_name[LO_NAME_SIZE];
            uint8_t  lo_crypt_name[LO_NAME_SIZE];
            uint8_t  lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
            uint64_t lo_init[2];
        };

  /dev/loop-control
منذ لينكس 3.1، تُوفر النواة جهاز /dev/loop-control، الذي يسمح للتطبيق بالعثور ديناميكيًا على جهاز حر، وإضافة أجهزة loop وإزالتها من النظام. للقيام بهذه العمليات، يفتح المرء أولاً /dev/loop-control ثم يستخدم إحدى عمليات ioctl(2) التالية:

LOOP_CTL_GET_FREE
    خصص أو اعثر على جهاز loop حر للاستخدام. عند النجاح، يُعاد رقم الجهاز كنتيجة للاستدعاء. لا تأخذ هذه العملية أي معامل.

LOOP_CTL_ADD
    أضف جهاز loop جديد رقم جهازه محدد كعدد صحيح طويل في معامل ioctl(2) الثالث. عند النجاح، يُعاد فهرس الجهاز كنتيجة للاستدعاء. إذا كان الجهاز مخصصًا بالفعل، يفشل الاستدعاء بالخطأ EEXIST.

LOOP_CTL_REMOVE
    أزل جهاز loop الذي رقم جهازه محدد كعدد صحيح طويل في معامل ioctl(2) الثالث. عند النجاح، يُعاد رقم الجهاز كنتيجة للاستدعاء. إذا كان الجهاز قيد الاستخدام، يفشل الاستدعاء بالخطأ EBUSY.

الملفات

/dev/loop*
    ملفات أجهزة loop الكتلية الخاصة.

أمثلة
يستخدم البرنامج أدناه جهاز /dev/loop-control للعثور على جهاز loop حر، ويفتح جهاز loop، ويفتح ملفًا ليُستخدم كمخزن أساسي للجهاز، ثم يربط جهاز loop بالمخزن الخلفي. توضح جلسة الصدفة التالية استخدام البرنامج:

    $ dd if=/dev/zero of=file.img bs=1MiB count=10;
    10+0 سجلات للداخل
    10+0 سجلات للخارج
    10485760 بايت (10 ميجابايت) نُسخت، 0.00609385 ثانية، 1.7 جيجابايت/ثانية
    $ sudo ./mnt_loop file.img;
    loopname = /dev/loop5

  مصدر البرنامج
    #include <err.h>
    #include <fcntl.h>
    #include <linux/loop.h>
    #include <sys/ioctl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    int
    main(int argc, char *argv[])
    {
        int loopctlfd, loopfd, backingfile;
        long devnr;
        char loopname[4096];

        if (argc != 2) {
            fprintf(stderr, "الاستخدام: %s backing-file\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        loopctlfd = open("/dev/loop-control", O_RDWR);
        if (loopctlfd == -1)
            err(EXIT_FAILURE, "فتح: /dev/loop-control");

        devnr = ioctl(loopctlfd, LOOP_CTL_GET_FREE);
        if (devnr == -1)
            err(EXIT_FAILURE, "ioctl-LOOP_CTL_GET_FREE");

        sprintf(loopname, "/dev/loop%ld", devnr);
        printf("loopname = %s\n", loopname);

        loopfd = open(loopname, O_RDWR);
        if (loopfd == -1)
            err(EXIT_FAILURE, "فتح: loopname");

        backingfile = open(argv[1], O_RDWR);
        if (backingfile == -1)
            err(EXIT_FAILURE, "فتح: backing-file");

        if (ioctl(loopfd, LOOP_SET_FD, backingfile) == -1)
            err(EXIT_FAILURE, "ioctl-LOOP_SET_FD");

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
losetup(8)، mount(8)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.