نصب Oracle RAC 19c روی virtualbox با Oracle Linux 9 (قسمت سوم: پیکربندی udev برای دیسک‌های اشتراک‌گذاری‌شده)

در زمان نصب 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 تست شود.