در زمان نصب Oracle Grid Infrastructure و ایجاد ASM Disk Group، نیاز داریم که دیسکها در لینوکس نام پایدار، مالکیت درست و مجوزهای صحیح داشته باشند. ابزار udev در لینوکس این کار را انجام میدهد.
اما یک نکته مهم:
🔸 محیط VirtualBox با محیط تولیدی واقعی (SAN / iSCSI / FC) کاملاً یکسان رفتار نمیکند.
به همین دلیل در این مقاله هر دو سناریو را پوشش میدهیم.
1. چرا به udev نیاز داریم؟
در سیستمعامل، نام دیسکها ممکن است پس از هر ریبوت تغییر کند:
/dev/sdb → /dev/sdc
ولی ASM نیاز دارد همیشه از مسیرهای ثابت استفاده کند مثل:
/dev/asm/ocr01
/dev/asm/data01
udev این مشکلات را حل میکند:
-
ایجاد نام پایدار برای دیسکها
-
تنظیم مالکیت (oracle / grid)
-
تنظیم گروه (asmadmin)
-
تنظیم مجوزها (0660)
-
ایجاد symlink ثابت در مسیر
/dev/asm/
2. پیشنیازهای مشترک برای هر دو محیط
-
دیسکها باید shared و raw باشند
-
بهتر است برای ASM پارتیشن ایجاد نشود (اما در VirtualBox معمولاً پارتیشن داریم)
-
روی هر دو نود، نامدهی دیسکها باید یکسان باشد
-
کاربر oracle باید عضو asmadmin باشد:
[root@rac1 ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba),54327(asmdba),54328(asmoper),54329(asmadmin)
در قسمت قبل اینکار را انجام داده بودیم
3. محیط VirtualBox — چالشها و تفاوتها
VirtualBox چند محدودیت دارد:
1) بسیاری از دیسکهای VDI → خروجی scsi_id نمیدهند
مثال:
/usr/lib/udev/scsi_id -g -u -d /dev/sdb1
# خروجی خالی
2) VirtualBox ID_SERIAL واقعی ارائه نمیدهد
بنابراین این دو روش عملاً کار نمیکنند:
RESULT=="XXXXXXXXX"
ENV{ID_SERIAL}=="..."
3) بهترین روش در VirtualBox
استفاده از KERNELS و DEVPATH است.
sdb → 3:0:0:0
sdc → 3:0:1:0
udevadm info --query=all --name=/dev/sdb1 | egrep "ID_SERIAL|DEVPATH"
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/host3/target3:0:0/3:0:0:0/block/sdb/sdb1
4. محیط واقعی (SAN / iSCSI / FC)
در محیطهای واقعی، وضعیت کاملاً متفاوت است:
-
دیسکها WWID واقعی دارند
-
از multipath استفاده میشود
-
scsi_id همیشه خروجی میدهد
در محیط واقعی rule این شکلی است:
ACTION=="add|change", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", \
PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode", \
RESULT=="3600508b400105e210000900000490000", \
SYMLINK+="asm/data01", OWNER:="oracle", GROUP:="asmadmin", MODE:="0660"
در multipath مانند زیر میشود:
KERNEL=="dm-*", ENV{DM_UUID}=="mpath-3600508b4001...", \
SYMLINK+="asm/data01"
این روش پایدارترین و استانداردترین روش برای محیط تولیدی است.
توضیح: WWID چیست؟
-
شناسهی جهانی (Worldwide Identifier)
-
یک عدد منحصربهفرد که از استوریج میآید
-
اگر در کل دنیا ۵ میلیون SAN داشته باشیم، هیچ دو دیسکی WWID یکسان ندارند
-
udev در محیط واقعی دقیقاً بر اساس WWID کار میکند
مثال WWID واقعی:
3600508b400105e210000900000490000
توضیح: multipath چیست و چرا نیاز داریم؟
مثالی ساده:
اگر یک سرور RAC از طریق دو مسیر به SAN وصل شود:
pathA → دیسک /dev/sdb
pathB → دیسک /dev/sdc
multipath این دو مسیر را تجمیع میکند و یک دیسک منطقی میسازد:
/dev/mapper/mpatha
و در udev برای کنترل دقیق از DM_UUID استفاده میکنیم:
KERNEL=="dm-*", ENV{DM_UUID}=="mpath-3600508b4...", SYMLINK+="asm/data01"
5. سناریوی کامل VirtualBox
در محیط شما، مسیر SCSI از طریق udevadm info یافت شد:
sdb → 3:0:0:0 (OCR)
sdc → 3:0:1:0 (DATA/MGMT)
چرا در VirtualBox scsi_id کار نمیکند؟
این موضوع برای خیلیها سؤال است.
دلیل اصلی:
VirtualBox تنها «شبیهسازی» SCSI است و بسیاری از ویژگیهای سختافزاری واقعی را پیادهسازی نمیکند.
به همین دلیل موارد زیر را ندارد:
-
WWID واقعی
-
ID_SERIAL واقعی
-
Inquiry Data واقعی
محل قرارگیری فایلهای udev و نامگذاری آنها
تمام ruleهای udev در لینوکس در مسیر زیر قرار میگیرند:
/etc/udev/rules.d/
در این مسیر، هر فایل با پسوند .rules یک مجموعه دستور udev است.
🔹 چرا اسم فایل را 99-oracle-asm.rules میگذاریم؟
udev فایلهای موجود در این مسیر را به ترتیب عددی میخواند:
-
فایلهایی با شماره پایینتر زودتر اجرا میشوند
-
فایلهایی با شماره بالاتر دیرتر اجرا میشوند
-
ruleهای دیرتر میتوانند ruleهای قبلی را override کنند
به همین دلیل:
-
شماره ۹۹ یعنی «بعد از همه فایلها»
-
برای اینکه rule ما روی همه ruleهای عمومی سیستم اولویت داشته باشد
این استاندارد Oracle و Red Hat هم هست.
ایجاد فایل rule برای Oracle ASM
پس باید فایل زیر را ایجاد کنیم:
vi /etc/udev/rules.d/99-oracle-asm.rules
و ruleهای مورد نیاز را داخل آن قرار دهیم.
# === OCR (sdb1: parent 3:0:0:0) ===
ACTION=="add|change", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", \
KERNEL=="sd*[0-9]", KERNELS=="3:0:0:0", \
SYMLINK+="asm/ocr01", OWNER:="oracle", GROUP:="asmadmin", MODE:="0660"
# === DATA/MGMT (sdc1: parent 3:0:1:0) ===
ACTION=="add|change", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", \
KERNEL=="sd*[0-9]", KERNELS=="3:0:1:0", \
SYMLINK+="asm/mgmt01", OWNER:="oracle", GROUP:="asmadmin", MODE:="0660"
مفاهیم مهم udev
-
KERNEL==: نام دیسک -
KERNELS==: مسیر parent در زیرساخت سختافزاری -
PROGRAM==: اجرای دستور، مثل scsi_id -
RESULT==: خروجی برنامه -
SYMLINK+=: ساخت لینک پایدار -
OWNER,GROUP,MODE: مجوزها
اعمال تنظیمات:
udevadm control --reload-rules
udevadm trigger
مسیرهای نهایی:
/dev/asm/ocr01 → /dev/sdb1
/dev/asm/mgmt01 → /dev/sdc1
6. مقایسه VirtualBox و محیط واقعی
| ویژگی | VirtualBox | محیط واقعی |
|---|---|---|
| scsi_id | ممکن است خروجی ندهد ❌ | همیشه خروجی دارد ✔️ |
| WWID | ندارد ❌ | دارد ✔️ |
| multipath | ندارد ❌ | دارد ✔️ |
| پایداری لینک | متوسط | بسیار پایدار |
| بهترین match | KERNELS== | RESULT== (WWID) |
| استفاده | برای LAB و تست | برای Production |
7. نکات مهم برای نصب RAC
1) همیشه قبل از نصب Grid، لینکها را تست کن:
ls -l /dev/asm/
2) روی هر نود فایل udev باید ۱۰۰٪ یکسان باشد.
3) نصب ASM/GRID فقط باید مسیر /dev/asm/... را دریافت کند.
4) بعد از نصب، یک بار ریبوت کنید تا پایداری rule تست شود.