| random(4) | Device Drivers Manual | random(4) |
الاسم¶
random، urandom - أجهزة مصدر الأرقام العشوائية في النواة
موجز¶
#include <linux/random.h>
int ioctl(fd, RNDrequest, param);
الوصف¶
توفر ملفات المحارف الخاصة /dev/random و /dev/urandom (الموجودة منذ لينكس 1.3.30) واجهة لمولد الأرقام العشوائية في النواة. يحمل الملف /dev/random رقم الجهاز الرئيس 1 ورقم الجهاز الفرعي 8. ويحمل الملف /dev/urandom رقم الجهاز الرئيس 1 ورقم الجهاز الفرعي 9.
يجمع مولد الأرقام العشوائية الضجيج البيئي من وسائط الأجهزة والمصادر الأخرى في مجمع اعتلاج (entropy pool). ويحتفظ المولد أيضاً بتقدير لعدد بتات الضجيج في مجمع الاعتلاج. ومن مجمع الاعتلاج هذا، تُنشأ الأرقام العشوائية.
يوفر لينكس 3.17 وما يليه واجهة getrandom(2) الأبسط والأكثر أماناً والتي لا تتطلب ملفات خاصة؛ انظر صفحة دليل getrandom(2) للتفاصيل.
عند القراءة منه، يعيد الجهاز /dev/urandom بايتات عشوائية باستخدام مولد أرقام عشوائية زائفة يُبذر من مجمع الاعتلاج. القراءات من هذا الجهاز لا تُعطّل (أي لا يُتخلى عن المعالج)، ولكنها قد تسبب تأخيراً ملحوظاً عند طلب كميات كبيرة من البيانات.
عند القراءة منه أثناء وقت الإقلاع المبكر، قد يعيد /dev/urandom بيانات قبل تهيئة مجمع الاعتلاج. إذا كان هذا الأمر يهم تطبيقك، فاستخدم getrandom(2) أو /dev/random بدلاً منه.
جهاز /dev/random هو واجهة موروثة تعود إلى وقت لم تكن فيه البدائيات التعموية المستخدمة في تنفيذ /dev/urandom موثوقة على نطاق واسع. سيعيد بايتات عشوائية فقط ضمن العدد المقدر لبتات الضجيج الحديثة في مجمع الاعتلاج، مع التعطيل إذا لزم الأمر. يعد /dev/random مناسباً للتطبيقات التي تحتاج إلى عشوائية عالية الجودة، ويمكنها تحمل تأخيرات غير محددة.
عندما يكون مجمع الاعتلاج فارغاً، ستُعطل القراءات من /dev/random حتى يُجمع ضجيج بيئي إضافي. منذ لينكس 5.6، يُتجاهل علم O_NONBLOCK حيث لن يُعطل /dev/random بعد الآن إلا أثناء عملية الإقلاع المبكر. في الإصدارات السابقة، إذا استُدعي open(2) لـ /dev/random مع علم O_NONBLOCK، فإن read(2) اللاحق لن يُعطل إذا لم يكن عدد البايتات المطلوب متاحاً. وبدلاً من ذلك، تُعاد البايتات المتاحة. إذا لم يتوفر أي بايت، سيعيد read(2) القيمة -1 ويُضبط errno إلى EAGAIN.
ليس لعلم O_NONBLOCK أي تأثير عند فتح /dev/urandom. عند استدعاء read(2) للجهاز /dev/urandom، ستعيد القراءات التي تصل إلى 256 بايت نفس عدد البايتات المطلوبة ولن يُقاطعها معالج إشارات. قد تعيد القراءات بمخزن مؤقت يتجاوز هذا الحد عدداً أقل من البايتات المطلوبة أو تفشل بالخطأ EINTR، إذا قاطعها معالج إشارات.
منذ لينكس 3.16، سيعيد read(2) من /dev/urandom في أقصى حد 32 ميجابايت. سيعيد read(2) من /dev/random في أقصى حد 512 بايت (340 بايت قبل لينكس 2.6.12).
ستحدث الكتابة إلى /dev/random أو /dev/urandom مجمع الاعتلاج بالبيانات المكتوبة، لكن هذا لن يؤدي إلى تعداد اعتلاج أعلى. هذا يعني أنها ستؤثر على المحتويات المقروءة من كلا الملفين، لكنها لن تجعل القراءات من /dev/random أسرع.
الاستخدام¶
تُعد واجهة /dev/random واجهة موروثة، ويُفضل /dev/urandom وهو كافٍ في جميع حالات الاستخدام، باستثناء التطبيقات التي تتطلب عشوائية أثناء وقت الإقلاع المبكر؛ لهذه التطبيقات، يجب استخدام getrandom(2) بدلاً من ذلك، لأنه سيُعطل حتى يُهيأ مجمع الاعتلاج.
إذا حُفظ ملف البذرة عبر عمليات إعادة التشغيل كما هو موصى به أدناه، فسيكون الناتج آمناً تعموياً ضد المهاجمين الذين لا يملكون وصول جذر محلي بمجرد إعادة تحميله في تسلسل الإقلاع، وهو مناسب تماماً لمفاتيح جلسات تعمية الشبكة. (قامت جميع توزيعات لينكس الرئيسة بحفظ ملف البذرة عبر عمليات إعادة التشغيل منذ عام 2000 على الأقل.) نظراً لأن القراءات من /dev/random قد تُعطل، سيرغب المستخدمون عادةً في فتحه في وضع عدم التعطيل (أو إجراء قراءة بمهلة زمنية)، وتقديم نوع من إشعار للمستخدم إذا لم يكن الاعتلاج المطلوب متاحاً على الفور.
الضبط¶
إذا لم يكن نظامك يحتوي على /dev/random و /dev/urandom منشأين بالفعل، فيمكن إنشاؤهما بالأوامر التالية:
mknod -m 666 /dev/random c 1 8 mknod -m 666 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom
عندما يبدأ نظام لينكس دون الكثير من تفاعل المشغل، قد يكون مجمع الاعتلاج في حالة يمكن التنبؤ بها إلى حد كبير. يقلل هذا من الكمية الفعلية للضجيج في مجمع الاعتلاج عن التقدير. ومن أجل مواجهة هذا التأثير، يساعد حمل معلومات مجمع الاعتلاج عبر عمليات الإغلاق وبدء التشغيل. للقيام بذلك، أضف السطور إلى نص برمجي مناسب يُشغل أثناء تسلسل بدء تشغيل نظام لينكس:
echo "جاري تهيئة مولد الأرقام العشوائية..." random_seed=/var/run/random-seed # حمل بذرة عشوائية من بدء تشغيل لآخر # حمل ثم احفظ مجمع الاعتلاج بالكامل if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom else
touch $random_seed fi chmod 600 $random_seed poolfile=/proc/sys/kernel/random/poolsize [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
أيضاً، أضف السطور التالية في نص برمجي مناسب يُشغل أثناء إغلاق نظام لينكس:
# حمل بذرة عشوائية من الإغلاق إلى بدء التشغيل # احفظ مجمع الاعتلاج بالكامل echo "جاري حفظ البذرة العشوائية..." random_seed=/var/run/random-seed touch $random_seed chmod 600 $random_seed poolfile=/proc/sys/kernel/random/poolsize [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
نفترض في الأمثلة أعلاه وجود لينكس 2.6.0 أو أحدث، حيث يعيد /proc/sys/kernel/random/poolsize حجم مجمع الاعتلاج بالبتات (انظر أدناه).
واجهات /proc¶
توفر الملفات في الدليل /proc/sys/kernel/random (الموجودة منذ لينكس 2.3.16) معلومات إضافية حول جهاز /dev/random:
- entropy_avail
- يعطي هذا الملف المخصص للقراءة فقط الاعتلاج المتاح، بالبتات. سيكون هذا رقماً في النطاق من 0 إلى 4096.
- poolsize
- يعطي هذا الملف حجم مجمع الاعتلاج. تختلف دلالات هذا الملف عبر إصدارات النواة:
- لينكس 2.4:
- يعطي هذا الملف حجم مجمع الاعتلاج بـ البايتات. عادةً، سيتضمن هذا الملف القيمة 512، لكنه قابل للكتابة، ويمكن تغييره إلى أي قيمة تتوفر لها خوارزمية. الخيارات هي 32، 64، 128، 256، 512، 1024، أو 2048.
- لينكس 2.6 وما يليه:
- هذا الملف للقراءة فقط، ويعطي حجم مجمع الاعتلاج بـ البتات. ويحتوي على القيمة 4096.
- read_wakeup_threshold
- يحتوي هذا الملف على عدد بتات الاعتلاج المطلوبة لإيقاظ العمليات التي تنام بانتظار الاعتلاج من /dev/random. المبدئي هو 64.
- write_wakeup_threshold
- يحتوي هذا الملف على عدد بتات الاعتلاج التي تحتها نوقظ العمليات التي تجري select(2) أو poll(2) للوصول بالكتابة إلى /dev/random. يمكن تغيير هذه القيم عن طريق الكتابة في الملفات.
- uuid
- boot_id
- تحتوي هذه الملفات المخصصة للقراءة فقط على سلاسل عشوائية مثل 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. يُنشأ الأول من جديد لكل قراءة، بينما أُنشئ الأخير مرة واحدة.
واجهة ioctl(2)¶
طلبات ioctl(2) التالية معرفة على واصفات الملفات المتصلة بـ /dev/random أو /dev/urandom. ستتفاعل جميع الطلبات المنفذة مع مجمع اعتلاج المدخلات مما يؤثر على كل من /dev/random و /dev/urandom. مطلوب قدرة CAP_SYS_ADMIN لجميع الطلبات باستثناء RNDGETENTCNT.
- RNDGETENTCNT
- استرجع تعداد الاعتلاج لمجمع المدخلات، ستكون المحتويات هي نفسها ملف entropy_avail تحت proc. ستُخزن النتيجة في العدد الصحيح (int) الذي يشير إليه المعطى.
- RNDADDTOENTCNT
- زد أو أنقص تعداد اعتلاج مجمع المدخلات بالقيمة التي يشير إليها المعطى.
- RNDGETPOOL
- أُزيل في لينكس 2.6.9.
- RNDADDENTROPY
- أضف بعض الاعتلاج الإضافي لمجمع المدخلات، مع زيادة تعداد الاعتلاج. يختلف هذا عن الكتابة إلى /dev/random أو /dev/urandom، والتي تضيف فقط بعض البيانات ولكنها لا تزيد تعداد الاعتلاج. تُستخدم البنية التالية:
-
struct rand_pool_info {
int entropy_count;
int buf_size;
__u32 buf[0]; };
- هنا entropy_count هي القيمة المضافة إلى (أو المنقوصة من) تعداد الاعتلاج، و buf هو المخزن المؤقت بحجم buf_size الذي يُضاف إلى مجمع الاعتلاج.
- RNDZAPENTCNT
- RNDCLEARPOOL
- صفر تعداد اعتلاج جميع المجمعات وأضف بعض بيانات النظام (مثل ساعة الحائط) إلى المجمعات.
الملفات¶
/dev/random
/dev/urandom
ملاحظات¶
للحصول على نظرة عامة ومقارنة للواجهات المختلفة التي يمكن استخدامها للحصول على العشوائية، راجع random(7).
العلل¶
أثناء وقت الإقلاع المبكر، قد تعيد القراءات من /dev/urandom بيانات قبل تهيئة مجمع الاعتلاج.
انظر أيضًا¶
mknod(1), getrandom(2), random(7)
RFC 1750, "Randomness Recommendations for Security"
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 8 فبراير 2026 | صفحات دليل لينكس (لم تصدر بعد) |