ایجاد Block Device برای ASM(دستور truncate – fallocate – dd)

در زمان راه اندازی Oracle ASM در یک محیط تستی، یکی از ملزومات، داشتن دیسک و یا پارتیشن اضافه و ازاد در سرور/ماشین می باشد. حال اگر به هر دلیلی اضافه کردن دیسک به سرور/ماشین امکان پذیر نباشد، چه باید کرد؟

در محیط لینوکس، این مسئله با ایجاد یک فایل حجیم و همچنین تبدیل ان به یک block device(با کمک loop device) قابل انجام خواهد بود. قرار است این فایل حجیم، نقش دیسک را در زمان راه اندازی و نگهداری Oracle ASM ایفا کند.

برای ایجاد فایل حجیم در محیط لینوکس، دستورات متنوعی وجود دارند که در ادامه به بررسی سه مورد از این دستورات می پردازیم.

دستور fallocate

با کمک دستور falloate می توان با سرعت بالایی، فایل بسیار حجیمی را ایجاد نمود. برای تعیین اندازه فایل، می توان از سوییچ l به همراه این دستور استفاده کرد. برای مثال، با دستور زیر، فایلی با نام asm1 را با حجمی برابر 30g ایجاد می کنیم:

[[email protected] ~]# fallocate -l 30g /asm1

این کار با سرعت بسیار بالایی قابل انجام خواهد بود:

[[email protected] ~]# time fallocate -l 30g /asm1

real    0m0.004s

user    0m0.001s

sys     0m0.004s

بعد از ایجاد فایل مورد نظر، loop deviceای را به این فایل تخصیص می دهیم:

[[email protected] ~]# losetup /dev/loop1 /asm1

با اجرای دستور بالا، می توان فایل سیستمی چون btrfs، ocfs2، ext4 و … را برای loop1 تعیین کرد:

[[email protected] ~]# 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 هم استفاده کرد(با این فرض که فایل سیستمی برای ان مشخص نشده است!):

[[email protected] ~]# oracleasm createdisk asm1 /dev/loop1

Writing disk header: done

Instantiating disk: done

[[email protected] ~]# oracleasm listdisks

ASM1

بعد از ایجاد label، می توان دیسک را به دیسک گروه ای در محیط asm اضافه کرد و یا با کمک آن، دیسک گروه جدیدی را ایجاد نمود:

SQL> CREATE DISKGROUP data01 EXTERNAL REDUNDANCY  DISK ‘/dev/oracleasm/disks/ASM1’ SIZE 30720M;

Diskgroup created.

دستور truncate

این دستور برای تغییر اندازه یک فایل(کاهش و یا افزایش حجم یک فایل) به کار می رود. برای مثال، با دستور زیر، اندازه فایل newfile.txt به صفر تغییر خواهد کرد و عملا همه اطلاعات این فایل از دست خواهد رفت:

[[email protected] ~]# echo “my name is usef.”>newfile.txt

[[email protected] ~]# cat newfile.txt

my name is usef.

[[email protected] ~]# truncate -s 0 newfile.txt

[[email protected] ~]# cat newfile.txt

[[email protected] ~]#

این دستور علاوه بر تغییر حجم فایل، امکان ساخت سریع فایلهای حجیم را هم فراهم می کند. برای مثال، با اجرای دستور زیر، در صورتی که فایل myasmfile وجود داشته باشد، حجمش به 30GB خواهد رسید و در غیر این صورت، فایلی با این نام و حجم ایجاد خواهد شد:

[[email protected] ~]# truncate -s 30G /myasmfile

[[email protected] ~]# ls -lh /myasmfile

-rw-r–r– 1 root root 30G Oct 27 06:23 /myasmfile

همانند فایلی که در قسمت قبل ایجاد کردیم(با کمک دستور fallocate) این فایل را هم می توان به یک block device تبدیل کرد و سپس فایل سیستمی را برای ان تعیین نمود و یا از ان در محیط ASM استفاده کرد:

[[email protected] ~]# losetup /dev/loop1 /myasmfile

[[email protected] ~]# 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

[[email protected] ~]# mkdir /mytruncfile

[[email protected] ~]# mount /dev/loop1 /mytruncfile

[[email protected] ~]# df -h /mytruncfile

Filesystem      Size  Used Avail Use% Mounted on

/dev/loop9       30G   45M   28G   1% /mytruncfile

نکته: برای کاهش و یا افزایش حجم یک فایل با کمک دستور truncate، می توان از عملگرهای + و – هم کمک گرفت:

 [[email protected] ~]# ls -lh myfile

-rw-r–r– 1 root root 30G Oct 27 08:26 myfile

[[email protected] ~]# truncate -s -5G myfile

[[email protected] ~]# ls -lh myfile

-rw-r–r– 1 root root 25G Oct 27 08:27 myfile

دستور dd

با کمک دستور dd، می توان اطلاعاتی را از جایی به جای دیگر کپی کرد. برای مثال، با دستور زیر، از sda1، کپی ای تهیه خواهد شد:

[[email protected] ~]# 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 را ایجاد نمود:

[[email protected] ~]# 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 را خالی کرده باشیم.

 

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *