Scroll to navigation

loop(4) Device Drivers Manual 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 بالملف المفتوح الذي وُمرر واصف ملفه كمعامل ioctl(2) (الثالث).
افصل جهاز loop عن أي واصف ملف.
اضبط حالة جهاز 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 هو قناع بتات يمكن أن يتضمن صفرًا أو أكثر مما يلي:
جهاز loopback للقراءة فقط.
سيُدمر جهاز loopback آليًا عند آخر إغلاق.
اسمح بمسح الأقسام آليًا.
استخدم وضع الإدخال/الإخراج المباشر للوصول إلى الملف الخلفي.
أعلام lo_flags الوحيدة التي يمكن تعديلها بواسطة LOOP_SET_STATUS هي LO_FLAGS_AUTOCLEAR و LO_FLAGS_PARTSCAN.
اجلب حالة جهاز loop. يجب أن يكون معامل ioctl(2) (الثالث) مؤشرًا إلى struct loop_info.
حول المخزن الخلفي لجهاز loop إلى واصف الملف الجديد المحدد في معامل ioctl(2) (الثالث)، والذي هو عدد صحيح. هذه العملية ممكنة فقط إذا كان جهاز loop للقراءة فقط وكان المخزن الخلفي الجديد بنفس الحجم والنوع للمخزن الخلفي القديم.
غير حجم جهاز loop نشط. يمكن للمرء تغيير حجم المخزن الخلفي الأساسي ثم استخدام هذه العملية ليعرف مشغل loop الحجم الجديد. لا تأخذ هذه العملية أي معامل.
اضبط وضع الإدخال/الإخراج المباشر (DIRECT I/O) على جهاز loop، ليُستخدم لفتح الملف الخلفي. معامل ioctl(2) (الثالث) هو قيمة طويلة غير موقعة. تمثل القيمة غير الصفرية وضع الإدخال/الإخراج المباشر.
اضبط حجم الكتلة لجهاز loop. معامل ioctl(2) (الثالث) هو قيمة طويلة غير موقعة. يجب أن تكون هذه القيمة من قوى العدد اثنين في النطاق [512,pagesize]؛ وإلا، ستنتج خطأ EINVAL.
أعدّ واضبط جميع معاملات جهاز 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_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 حر للاستخدام. عند النجاح، يُعاد رقم الجهاز كنتيجة للاستدعاء. لا تأخذ هذه العملية أي معامل.
أضف جهاز loop جديد رقم جهازه محدد كعدد صحيح طويل في معامل ioctl(2) الثالث. عند النجاح، يُعاد فهرس الجهاز كنتيجة للاستدعاء. إذا كان الجهاز مخصصًا بالفعل، يفشل الاستدعاء بالخطأ EEXIST.
أزل جهاز 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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

8 فبراير 2026 صفحات دليل لينكس 6.18