در زمان راه اندازی Oracle ASM در یک محیط تستی، یکی از ملزومات، داشتن دیسک و یا پارتیشن اضافه و ازاد در سرور/ماشین می باشد. حال اگر به هر دلیلی اضافه کردن دیسک به سرور/ماشین امکان پذیر نباشد، چه باید کرد؟
در محیط لینوکس، این مسئله با ایجاد یک فایل حجیم و همچنین تبدیل ان به یک block device(با کمک loop device) قابل انجام خواهد بود. قرار است این فایل حجیم، نقش دیسک را در زمان راه اندازی و نگهداری Oracle ASM ایفا کند.
برای ایجاد فایل حجیم در محیط لینوکس، دستورات متنوعی وجود دارند که در ادامه به بررسی سه مورد از این دستورات می پردازیم.
دستور fallocate
با کمک دستور falloate می توان با سرعت بالایی، فایل بسیار حجیمی را ایجاد نمود. برای تعیین اندازه فایل، می توان از سوییچ l به همراه این دستور استفاده کرد. برای مثال، با دستور زیر، فایلی با نام asm1 را با حجمی برابر 30g ایجاد می کنیم:
[root@ol7 ~]# fallocate -l 30g /asm1
این کار با سرعت بسیار بالایی قابل انجام خواهد بود:
[root@ol7 ~]# time fallocate -l 30g /asm1
real 0m0.004s
user 0m0.001s
sys 0m0.004s
بعد از ایجاد فایل مورد نظر، loop deviceای را به این فایل تخصیص می دهیم:
[root@ol7 ~]# losetup /dev/loop1 /asm1
با اجرای دستور بالا، می توان فایل سیستمی چون btrfs، ocfs2، ext4 و … را برای loop1 تعیین کرد:
[root@ol7 ~]# mkfs.btrfs /dev/loop1
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.
Performing full device TRIM /dev/loop1 (30.00GiB) …
Label: (null)
UUID: 6c394210-daea-4929-8635-1807c9e63b81
Node size: 16384
Sector size: 4096
Filesystem size: 30.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 1.00GiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref
Number of devices: 1
Devices:
ID SIZE PATH
1 30.00GiB /dev/loop1
علاوه بر فایل سیستمهای عنوان شده برای dev/loop1/، می توان از این block device برای Oracle ASM هم استفاده کرد(با این فرض که فایل سیستمی برای ان مشخص نشده است!):
[root@ol7 ~]# oracleasm createdisk asm1 /dev/loop1
Writing disk header: done
Instantiating disk: done
[root@ol7 ~]# oracleasm listdisks
ASM1
بعد از ایجاد label، می توان دیسک را به دیسک گروه ای در محیط asm اضافه کرد و یا با کمک آن، دیسک گروه جدیدی را ایجاد نمود:
SQL> CREATE DISKGROUP data01 EXTERNAL REDUNDANCY DISK ‘/dev/oracleasm/disks/ASM1’ SIZE 30720M;
Diskgroup created.
دستور truncate
این دستور برای تغییر اندازه یک فایل(کاهش و یا افزایش حجم یک فایل) به کار می رود. برای مثال، با دستور زیر، اندازه فایل newfile.txt به صفر تغییر خواهد کرد و عملا همه اطلاعات این فایل از دست خواهد رفت:
[root@ol7 ~]# echo “my name is usef.”>newfile.txt
[root@ol7 ~]# cat newfile.txt
my name is usef.
[root@ol7 ~]# truncate -s 0 newfile.txt
[root@ol7 ~]# cat newfile.txt
[root@ol7 ~]#
این دستور علاوه بر تغییر حجم فایل، امکان ساخت سریع فایلهای حجیم را هم فراهم می کند. برای مثال، با اجرای دستور زیر، در صورتی که فایل myasmfile وجود داشته باشد، حجمش به 30GB خواهد رسید و در غیر این صورت، فایلی با این نام و حجم ایجاد خواهد شد:
[root@ol7 ~]# truncate -s 30G /myasmfile
[root@ol7 ~]# ls -lh /myasmfile
-rw-r–r– 1 root root 30G Oct 27 06:23 /myasmfile
همانند فایلی که در قسمت قبل ایجاد کردیم(با کمک دستور fallocate) این فایل را هم می توان به یک block device تبدیل کرد و سپس فایل سیستمی را برای ان تعیین نمود و یا از ان در محیط ASM استفاده کرد:
[root@ol7 ~]# losetup /dev/loop1 /myasmfile
[root@ol7 ~]# mkfs.ext4 /dev/loop1
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1966080 inodes, 7864320 blocks
393216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2155872256
240 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@ol7 ~]# mkdir /mytruncfile
[root@ol7 ~]# mount /dev/loop1 /mytruncfile
[root@ol7 ~]# df -h /mytruncfile
Filesystem Size Used Avail Use% Mounted on
/dev/loop9 30G 45M 28G 1% /mytruncfile
نکته: برای کاهش و یا افزایش حجم یک فایل با کمک دستور truncate، می توان از عملگرهای + و – هم کمک گرفت:
[root@ol7 ~]# ls -lh myfile
-rw-r–r– 1 root root 30G Oct 27 08:26 myfile
[root@ol7 ~]# truncate -s -5G myfile
[root@ol7 ~]# ls -lh myfile
-rw-r–r– 1 root root 25G Oct 27 08:27 myfile
دستور dd
با کمک دستور dd، می توان اطلاعاتی را از جایی به جای دیگر کپی کرد. برای مثال، با دستور زیر، از sda1، کپی ای تهیه خواهد شد:
[root@ol7 ~]# dd if=/dev/sda1 of=/home/boot_copy
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 5.68103 s, 189 MB/s
علاوه بر این قابلیت، دستور dd برای ایجاد فایلهای حجیم هم کاربرد دارد. برای مثال، با دستور زیر، می توان فایلی با حجم 10GB را ایجاد نمود:
[root@ol7 ~]# dd if=/dev/zero of=/myasm bs=10G count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB) copied, 3.81046 s, 564 MB/s
با اجرای این دستور، فایل myasm در مسیر / ایجاد شده و می توان از ان به عنوان یک block device هم استفاده نمود و بر روی ان block device، فایل سیستمی را ایجاد کرد و یا از ان برای Oracle ASM هم استفاده کرد.
استفاده از دستور dd برای ایجاد فایلهای حجیم، بیشتر در نسخه های قدیمی تر لینوکس رایج بوده و در نسخه های جدید، با وجود دستوراتی چون fallocate و truncate، کمتر مورد استفاده قرار می گیرد. البته این دستور، قابلیتهایی دارد که دستورات دیگر، فاقد ان قابلیتها هستند، به عنوان مثال، با کمک دستور dd می توان سرعت نوشتن بر روی یک دیسک را مشخص کرد که در دستور قبلی، به صورت زیر بوده است:
2147479552 bytes (2.1 GB) copied, 3.81046 s, 564 MB/s
البته برای تعیین دقیق تر سرعت نوشتن بر روی دیسک، بهتر است قبل از اجرای دستور، cache را خالی کرده باشیم.