CYCBUFF.CONF(5) InterNetNews Documentation CYCBUFF.CONF(5)

cycbuff.conf - پرونده پیکربندی روش ذخیره‌سازی CNFS در INN

این پرونده بافرهای چرخشی (cyclical buffers) را که استخرهای ذخیره‌سازی CNFS (سامانه پرونده چرخشی اخبار یا Cyclic News File System) را تشکیل می‌دهند، تعریف می‌کند. همچنین برخی از گزینه‌های کنترل‌کننده رفتار سامانه ذخیره‌سازی CNFS را می‌توان در اینجا تنظیم کرد. در صورت استفاده از روش ذخیره‌سازی CNFS، وجود cycbuff.conf الزامی است. سامانه INN این پرونده را در مسیر pathetc (همان‌طور که در inn.conf تعیین شده) جستجو خواهد کرد.

سامانه CNFS مقاله‌ها را در شیءهای منطقی به نام metacycbuff ذخیره می‌کند. هر metacycbuff به نوبه خود از یک یا چند بافر فیزیکی به نام cycbuff تشکیل شده است. هنگام نوشتن مقاله‌ها در metacycbuff، هر مقاله به صورت نوبتی (round-robin) در cycbuff بعدی موجود در فهرست نوشته می‌شود (مگر اینکه حالت "sequential" مشخص شده باشد، که در این صورت هر cycbuff قبل از رفتن به بافر بعدی کاملاً پر می‌شود). این ویژگی به شما امکان می‌دهد cycbuffهای مجزا را روی چندین دیسک فیزیکی توزیع کرده و بار کاری را بین آن‌ها متوازن سازید. توجه داشته باشید که برای استفاده از هر cycbuff بزرگتر از ۲ گیگابایت در پلتفرم‌های ۳۲ بیتی (و برخی پلتفرم‌های بسیار نادر ۶۴ بیتی که نوع off_t را ۳۲ بیتی تعریف می‌کنند)، باید INN را با گزینه --enable-largefiles کامپایل کنید.

برای کسب اطلاعات بیشتر درباره نحوه پیکربندی INN جهت استفاده از CNFS، به storage.conf(5) مراجعه کنید.

خطوط خالی و خطوطی که با علامت هش ("#") شروع می‌شوند، نادیده گرفته می‌شوند. سایر خطوط باید به یکی از قالب‌های زیر باشند:

cycbuffupdate:<interval>
refreshinterval:<interval>
cycbuff:<name>:<file>:<size>
metacycbuff:<name>:<buffer>[,<buffer>,...][:<mode>]

(که در آن موارد محصور در [] اختیاری هستند). ترتیب خطوط عمدتاً اهمیتی ندارد، اما تمام خطوط cycbuff باید پیش از خطوط metacycbuff قرار گیرند. خطوط طولانی را می‌توان با قرار دادن یک بک‌اسلش ("\") در انتهای خط، در خط بعدی ادامه داد.

تعداد مقاله‌های نوشته‌شده پیش از بازنویسی سرآیند (header) cycbuff بر روی دیسک را برابر <interval> تنظیم می‌کند. در بیشتر سیستم‌عامل‌ها، نیازی به نوشتن سرآیند بر روی دیسک برای در دسترس بودن داده‌های به‌روزشده برای سایر فرایندهایی که روی همان سیستم مقاله‌ها را از CNFS می‌خوانند نیست؛ اما هرگونه دسترسی به cycbuffهای CNFS از طریق NFS تنها داده‌های موجود در آخرین بازنویسی سرآیند را خواهد دید. پس از یک فروپاشی سیستم (system crash)، ممکن است تمام به‌روزرسانی‌های پس از آخرین بازنویسی سرآیند CNFS از دست بروند. مقدار پیش‌فرض، در صورت حذف این خط، برابر "25" است، به این معنی که سرآیند پس از ذخیره هر ۲۵ مقاله در آن cycbuff، روی دیسک نوشته می‌شود.
بازه زمانی (به ثانیه) بین بازخوانی‌های سرآیند cycbuff را برابر <interval> تنظیم می‌کند. این مورد عمدتاً بر nnrpd تأثیر می‌گذارد و بسامد به‌روزرسانی آگاهی آن از محتویات فعلی cycbuffهای CNFS را کنترل می‌کند. مقدار پیش‌فرض در صورت حذف این خط برابر "30" است.
یک cycbuff مشخص در CNFS را پیکربندی می‌کند. مقدار <name> یک نام نمادین برای بافر است که بعداً در یک خط metacycbuff استفاده می‌شود و نباید بیشتر از ۷ نویسه باشد. مقدار <file> مسیر کامل به پرونده بافر یا دستگاه بلوکی (block device) است و نباید بیشتر از ۶۳ نویسه باشد. مقدار <size> طول بافر بر حسب کیلوبایت است (هر ۱ کیلوبایت برابر ۱۰۲۴ بایت است). اگر <file> یک دستگاه بلوکی نباشد، باید دقیقاً به اندازه <size> * 1024 بایت باشد.

اگر می‌خواهید اندازه زیر ۲ گیگابایت باقی بماند، اندازه را زیر "2097152" نگه دارید.

توجه داشته باشید که CNFSv4 از پرونده‌ها و پارتیشن‌های تا ۱۶ ترابایت پشتیبانی می‌کند.

مجموعه‌ای از بافرهای CNFS را مشخص می‌کند که از دیدگاه INN یک مکان ذخیره‌سازی منطقی واحد را تشکیل می‌دهند. در storage.conf به Metacycbuffها به‌عنوان مکان‌های ذخیره‌سازی مقاله‌ها ارجاع داده می‌شود؛ بنابراین برای قرار دادن مقاله‌ها در یک cycbuff، آن بافر باید به‌عنوان بخشی از یک metacycbuff فهرست شده و سپس در storage.conf به آن ارجاع داده شود.

پارامتر <name> نام نمادین metacycbuff است که در فیلد options: ورودی‌های "cnfs" در storage.conf به آن ارجاع داده می‌شود. این نام نباید بیشتر از هشت نویسه باشد. مقدار <buffer> نام یک cycbuff است (بخش <name> در یک خط cycbuff) و می‌توان هر تعداد cycbuff را که با کاما از هم جدا شده‌اند، مشخص کرد.

اگر بیش از یک cycbuff در یک metacycbuff وجود داشته باشد، دو روش وجود دارد که INN می‌تواند مقاله‌ها را بین cycbuffها توزیع کند. حالت پیش‌فرض، یعنی "INTERLEAVE"، مقاله‌ها را در هر cycbuff به روش نوبتی (round-robin) ذخیره می‌کند؛ یک مقاله در هر cycbuff به ترتیبی که فهرست شده‌اند. اگر اندازه‌های cycbuffها بسیار متفاوت باشد، این امر می‌تواند باعث شود برخی از آن‌ها بسیار سریع‌تر از بقیه پر و بازنویسی (roll over) شوند، و بسته به چیدمان دیسک شما ممکن است بهترین کارایی را ارائه ندهد. حالت ذخیره‌سازی دیگر، "SEQUENTIAL"، به نوبت در هر cycbuff می‌نویسد تا زمانی که آن cycbuff پر شود و سپس به سراغ بعدی می‌رود؛ و با پر شدن آخرین بافر، به بافر اول بازگشته و چرخه جدیدی را آغاز می‌کند. برای مشخص کردن حالت ذخیره‌سازی به جای استفاده از حالت پیش‌فرض، یک دونقطه و سپس حالت ("INTERLEAVE" یا "SEQUENTIAL") را در انتهای خط metacycbuff اضافه کنید.

برنامه innd پرونده cycbuff.conf را تنها هنگام راه‌اندازی می‌خواند؛ بنابراین اگر تغییری در این پرونده ایجاد کردید و می‌خواهید innd تغییرات را اعمال کند، باید از دستور "ctlinnd xexec innd" استفاده کنید؛ اجرای "ctlinnd reload all ''" کافی نخواهد بود.

هنگامی که مقاله‌ها ذخیره می‌شوند، نام cycbuff که مقاله در آن ذخیره شده به عنوان بخشی از نشانگر مقاله (article token) ثبت می‌شود. برای اینکه INN بتواند مقاله‌ها را از یک cycbuff بازیابی کند، آن cycbuff باید در cycbuff.conf فهرست شده باشد. با این حال، اگر قرار نیست INN روی یک cycbuff بنویسد، نیازی نیست (و نباید) در یک metacycbuff فهرست شود.

این ویژگی راه ساده‌ای را برای خارج کردن از مدار (retire) یک cycbuff فراهم می‌کند. کافی است آن را از metacycbuff مربوطه حذف کرده و خط cycbuff آن را باقی بگذارید، سپس innd را بازراه‌اندازی کنید (برای مثال با "ctlinnd xexec innd"). در این حالت، هیچ مقاله جدیدی در آن cycbuff قرار نخواهد گرفت و هیچ مقاله‌ای نیز از آن منقضی نخواهد شد. پس از اینکه دیگر به مقاله‌های موجود در آن cycbuff نیازی نداشتید، به سادگی آن را به طور کامل از cycbuff.conf حذف کنید. سپس از دیدگاه INN تمام مقاله‌ها حذف‌شده به نظر می‌رسند و اجرای شبانه بعدی منقضی‌سازی (expire)، ارجاع‌های باقی‌مانده به آن‌ها را پاکسازی خواهد کرد.

افزودن یک cycbuff جدید تنها نیازمند ایجاد آن (به بخش زیر مراجعه کنید)، افزودن یک خط cycbuff، اضافه کردن آن به یک metacycbuff و سپس بازراه‌اندازی innd است. به همین ترتیب، تغییر تخصیص یک cycbuff موجود از یک metacycbuff به دیگری تنها نیازمند اصلاح متناسب دو metacycbuff و سپس بازراه‌اندازی innd است. (تنها نام cycbuff در توکن‌های API ذخیره‌سازی ثبت می‌شود).

هنگام ایجاد یک cycbuff جدید، دو روش مختلف برای ایجاد بافرهایی که مقاله‌ها در آن‌ها ذخیره می‌شوند وجود دارد.

1.
ایجاد یک پرونده بزرگ بر روی یک سامانه پرونده معمولی. ساده‌ترین روش برای انجام این کار احتمالاً استفاده از dd(1) با دستوری مانند زیر است:
dd if=/dev/zero of=/path/to/cycbuff bs=1024 count=<size>

که در آن <size> همان اندازه تعیین‌شده در خط cycbuff در پرونده cycbuff.conf است. پرونده INSTALL حاوی اسکریپتی است که این دستورها را بر اساس پرونده cycbuff.conf شما تولید می‌کند.

این ساده‌ترین روش است، اما این عیب را دارد که پرونده‌های بسیار بزرگ در سامانه‌های پرونده معمولی ممکن است دسترسی نسبتاً کندی داشته باشند (به ویژه در انتهای پرونده)، و هنگام دسترسی به cycbuff بار اضافی غیرضروری سامانه پرونده بر دوش INN تحمیل می‌شود.

2.
استفاده مستقیم از دستگاه‌های بلوکی (block devices). اگر سیستم‌عامل شما امکان فراخوانی mmap() را بر روی دستگاه‌های بلوکی می‌دهد (سولاریس و نسخه‌های اخیر لینوکس این امکان را دارند، FreeBSD طبق آخرین گزارش‌ها ندارد)، این روش توصیه می‌شود چرا که می‌توانید از تمام سربار سامانه پرونده محلی اجتناب کنید.

توجه داشته باشید که برخی از سیستم‌عامل‌ها از پرونده‌های بزرگتر از ۲ گیگابایت پشتیبانی نمی‌کنند، که این امر اندازه یک cycbuff واحد را محدود می‌کند؛ اما همچنان می‌توانید چندین cycbuff را در هر metacycbuff ترکیب کنید. مشخص شده است که نسخه‌های بسیار قدیمی لینوکس (قبل از هسته‌های نسخه 2.4 که این محدودیت را به ۲ ترابایت افزایش داد) این محدودیت را دارند؛ FreeBSD این محدودیت را ندارد. برخی از سیستم‌عامل‌هایی که از پرونده‌های بزرگ پشتیبانی می‌کنند، از دسترسی مستقیم به دستگاه‌های بلوکی برای پارتیشن‌های بزرگ پشتیبانی نمی‌کنند (Solaris قبل از نسخه Solaris 7، یا در صورت عدم اجرا در حالت ۶۴ بیتی، در این دسته قرار دارد)؛ در این سیستم‌عامل‌ها، اگر به cycbuffهای بزرگتر از ۲ گیگابایت نیاز دارید، باید از پرونده‌های معمولی استفاده کنید. در صورت شک و تردید، اندازه cycbuffهای خود را کمتر از ۲ گیگابایت نگه دارید.

دیسک را به گونه‌ای پارتیشن‌بندی کنید که اندازه هر پارتیشن مساوی یا کمتر از ۲ گیگابایت باشد. اگر از سولاریس استفاده می‌کنید، پارتیشن‌های خود را به گونه‌ای تنظیم کنید که از سیلندر اول دیسک اجتناب شود (در غیر این صورت، سرآیند cycbuff جدول پارتیشن دیسک را بازنویسی کرده و cycbuffها را غیرقابل دسترس می‌کند). سپس، پرونده‌های دستگاه را برای هر دستگاه بلوکی که قصد استفاده از آن را دارید ایجاد کنید.

استفاده از پرونده‌های دستگاه بلوکی در مسیر /dev توصیه نمی‌شود، زیرا سامانه اخبار مجوز نوشتن در آن‌ها را ندارد و تغییر مجوزهای پرونده‌های دستگاه سیستمی ممکن است بر بخش‌های دیگر سیستم تأثیر بگذارد. در عوض، از mknod(1) برای ایجاد مجموعه‌ای جدید از دستگاه‌های بلوکی استفاده کنید (در مکانی مانند pathspool/cycbuffs که تنها توسط کاربر news قابل نوشتن باشد). برای این کار، دستور "ls -Ll" را روی دستگاه‌های موجود در /dev که متناظر با دستگاه‌های بلوکی مورد نظر شما هستند اجرا کنید. شماره‌های دستگاه اصلی (major) و فرعی (minor) به ترتیب در ستون‌های پنجم و ششم (درست قبل از تاریخ) قرار دارند. سپس mknod را به شکل زیر اجرا کنید:

mknod <file> b <major> <minor>

که در آن <file> مسیر دستگاهی است که باید ایجاد شود (مطابق با بخش <file> در خط cycbuff) و <major> و <minor> شماره‌های اصلی و فرعی دستگاه هستند که در بالا مشخص شدند.

در اینجا یک اسکریپت کوتاه برای انجام این کار آورده شده که مسیر پرونده دستگاه سیستمی را به عنوان آرگومان دریافت می‌کند:

#!/bin/sh
base=`echo "$1" | sed 's%.*/%%'`
major=`ls -Ll "$1" | awk '{print $5}' | tr -d ,`
minor=`ls -Ll "$1" | awk '{print $6}`
mkdir -p <pathspool in inn.conf>/cycbuffs
mknod <pathspool>/cycbuffs/"$base" b "$major" "$minor"
chown news:news <pathspool>/cycbuffs/"$base"
chmod 644 <pathspool>/cycbuffs/"$base"

اطمینان حاصل کنید که پرونده‌های ایجاد شده متعلق به کاربر news و گروه news باشند، همان‌طور که در زمان پیکربندی تعیین شده است (پیش‌فرض برای هر دو "news" است). همچنین اطمینان حاصل کنید که مجوزهای روی دستگاه‌ها به کاربر news اجازه خواندن و نوشتن می‌دهد، و اگر می‌خواهید سایر کاربران سیستم بتوانند از sm برای بازیابی مقاله‌ها استفاده کنند، مطمئن شوید که دسترسی خواندن عمومی (world-readable) دارند.

پس از اینکه همه چیز را به درستی پیکربندی کردید و innd را راه‌اندازی نمودید، باید پیام‌هایی در news.notice مشاهده کنید که شبیه به این هستند:

innd: CNFS: no magic cookie found for cycbuff ONE, initializing

که در آن "ONE" همان نامی خواهد بود که برای cycbuff خود برگزیده‌اید.

نوشته شده توسط Katsuhiro Kondou <kondou@nec.co.jp> برای InterNetNews. بازنویسی در قالب POD توسط Russ Allbery <eagle@eyrie.org>.

ctlinnd(8), innd(8), nnrpd(8), sm(8), storage.conf(5).

2025-05-09 INN 2.7.4