::: IT인터넷 :::

VirtualBox CentOS 가상머신의 하드디스크 2개 추가와 RAID 0 설정

곰탱이푸우 2023. 4. 17. 08:20
서버에 가상 머신을 이용한 하둡을 설치하면서 개별 머신당 20TB의 디스크를 사용해야 하는 상황이 발생했다.
 
리눅스의 ext4 파일 시스템의 경우 파일당 최대 16TB 까지 지원하는 제약이 있다.
20TB 저장소를 생성하려면 10TB 저장소 2개를 생성하고 RAID 0로 구성하는 것으로 결정했다.
 
VirtualBox로 가상머신에 하드디스크를 2개 이상 추가하고 RAID 0로 설정하는 방법을 정리한다.
 
다음과 같이 진행한다.
  1. 가상 하드디스크 생성과 추가
  2. 하드디스크 파티션 생성
  3. RAID 0 설정과 포맷
  4. 파일 시스템 Mount
 
하드디스크 1개를 추가하는 방법은 아래 포스팅을 참고한다.
 

가상 하드디스크 생성과 추가

가상머신의 설정 - 저장소 - 컨트롤러: SATA에서 HDD에 + 버튼을 눌러 가상 디스크를 추가한다.
RAID로 구성할 것이기 때문에 2개 이상 추가한다.

 

2TB 이상인 경우 CLI에서 명령어를 사용해서 추가해야 한다.
$ vboxmanage createmedium --filename "가상머신경로/파일명.vdi" --size 디스크용량(MB단위) \
  --format VDI --variant Standard
 
10TB 가상디스크 2개는 아래와 같이 생성한다.
$ vboxmanage createmedium --filename "/data1/VirtualBoxVMs/testVm/testVm-10TB-disk1.vdi" \
  --size 10485760 --format VDI --variant Standard
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: b91df566-b56e-4038-a4fd-833fede513df

$ vboxmanage createmedium --filename "/data1/VirtualBoxVMs/testVm/testVm-10TB-disk2.vdi" \
  --size 10485760 --format VDI --variant Standard
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 683dc6a1-c7a3-45fb-9894-ed106414c564

$ ls -alh /data1/VirtualBoxVMs/testVm
total 7.3G
drwx------ 4 harbor harbor 4.0K Apr  3 16:40 .
drwxr-xr-x 5 harbor harbor 4.0K Apr  3 15:08 ..
drwx------ 2 harbor harbor 4.0K Apr  3 16:37 Logs
drwx------ 2 harbor harbor 4.0K Apr  3 15:26 Snapshots
-rw------- 1 harbor harbor  41M Apr  3 16:38 testVm-10TB-disk1.vdi
-rw------- 1 harbor harbor  41M Apr  3 16:38 testVm-10TB-disk2.vdi
-rw------- 1 harbor harbor 5.2G Apr  3 15:07 testVm-disk1.vdi
-rw------- 1 harbor harbor  22K Apr  3 16:37 testVm.vbox
-rw------- 1 harbor harbor  22K Apr  3 16:37 testVm.vbox-prev
-rw------- 1 harbor harbor 2.0G Apr  3 15:07 testVm.vdi
 
자세한 방법은 아래 포스팅을 참고한다.

 

하드디스크 파티션 생성

장치 경로 확인

가상 머신을 부팅하고 추가한 가상 디스크의 장치 경로를 확인한다.
$ sudo fdisk -l
 
일반적으로 2개를 추가한 경우 아래와 같이 /dev/sdb와 /dev/sdc로 연결된다.
파티션이 생성되지 않아 기본 정보가 출력된다.
 

파티션 생성

fdisk 실행

fdisk를 실행하고 파티션을 생성한다.
장치 경로가 /dev/sdb, /dev/sdc로 확인되어 해당 경로를 사용한다.
$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x7ca12be4.
WARNING: The size of this disk is 11.0 TB (10995116277760 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).
Command (m for help):
아래 과정은 /dev/sdb 기준으로 설명하며, /dev/sdc도 동일하게 진행되어야 한다.
 
 

사용 가능한 명령어 확인

m 키를 입력해서 사용 가능한 명령어들을 확인한다.
아래 명령어 중에서 d, n, t, w를 사용한다.
Command (m for help): m  # 명령어 확인
Command action
  a  toggle a bootable flag
  b  edit bsd disklabel
  c  toggle the dos compatibility flag
  d  delete a partition    # 사용
  g  create a new empty GPT partition table
  G  create an IRIX (SGI) partition table
  l  list known partition types
  m  print this menu
  n  add a new partition    # 사용
  o  create a new empty DOS partition table
  p  print the partition table
  q  quit without saving changes
  s  create a new empty Sun disklabel
  t  change a partition's system id    # 사용
  u  change display/entry units
  v  verify the partition table
  w  write table to disk and exit    # 사용
  x  extra functionality (experts only)

Command (m for help):
 

기존 파티션 삭제

d 명령어로 기존 남아있는 파티션을 삭제한다.
신규 추가 디스크이기 때문에 파티션이 없다는 메시지가 출력되어야 정상이다.
Command (m for help): d  # 명령어 확인
No partition is defined yet!
Command (m for help):
 

신규 파티션 생성

n 명령어로 파티션을 생성한다.
p 를 입력해서 primary 파티션을 선택하고 default 값들을 사용한다. (엔터 계속 입력)
Command (m for help): n  # add a new partition
Partition type:
  p  primary (0 primary, 0 extended, 4 free)
  e  extended
Select (default p): p  # 또는 엔터

Partition number (1-4, default 1): 1 # 또는 엔터

First sector (2048-4294967295, default 2048):  # 엔터 입력
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4294967294, default 4294967294):
Using default value 4294967294
Partition 1 of type Linux and of size 2 TiB is set

Command (m for help):
 
/dev/sdb 기준으로 설명한 것이며, /dev/sdc도 진행해야 한다.
 
 

파티션 타입 변경

t 명령어로 파티션 타입을 변경한다.
기본은 Linux (83)으로 되어 있으며, Linux raid autodetect (FD)로 변경한다.
Command (m for help): t    # change a partition's system id

# 생략
Hex Code (type L to list all codes): fd    # 'Linux raid autodetect'
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): w  # write table to disk and exit
 
파티션 설정이 완료되면 w 명령어로 저장하고 종료한다.
/dev/sdb 기준으로 설명한 것이며, /dev/sdc도 진행해야 한다.
 

RAID 0 구성과 포맷

/dev/sdb, /dev/sdc의 파티션 설정과 변경이 완료되면 두 파티션을 RAID로 묶어야 한다.
mdadm 패키지를 사용하여 S/W 방식의 RAID 구성을 진행한다.
 

RAID 0 구성

아래와 같이 mdadm 패키지를 설치하고 RAID 0로  설정한다.
# mdadm 설치
$ sudo yum install -y mdadm

# RAID 0 구성
# sudo mdadm --create /dev/신규장치명 --level=RAID방식 --raid-devices=디스크개수 /dev/sdb /dev/sdc

# 2개 디스크를 장치 이름이 md9, RAID 0로 구성하는 경우
$ sudo mdadm --create /dev/md9 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
 
신규 장치명은 기존 장치와 겹치지 않는 범위에서 사용하고자 하는 명칭으로 설정하면 된다.
RAID 방식은 --level 옵션으로 지정하는데, RAID 0는 --level=0, RAID 1은 --level=1, RAID 5는 --level=5로 설정한다.
 
아래와 같이 진행된다. y를 입력하여 RAID 0로 설정한다.
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
      meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
      meaningless after creating array
Continue creating array?    # y 입력하여 진행
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md9 started.

 

 
마지막으로 RAID 0 설정이 적용되었는지 확인한다.
# 생성 결과 확인
$ sudo mdadm --detail --scan
ARRAY /dev/md9 metadata=1.2 name=testVm:9 UUID=441bf1e8:4b4ed5e9:9a7d5f2a:77bc8352

# sudo mdadm --detail /dev/신규장치명
$ sudo mdadm --detail /dev/md9
/dev/md9:
          Version : 1.2
    Creation Time : Mon Apr  3 17:35:39 2023
        Raid Level : raid0
        Array Size : 21474572288 (20.00 TiB 21.99 TB)
      Raid Devices : 2
    Total Devices : 2
      Persistence : Superblock is persistent

### 생략 ###

              Name : testVm:9  (local to host testVm)
              UUID : 441bf1e8:4b4ed5e9:9a7d5f2a:77bc8352
            Events : 0

    Number  Major  Minor  RaidDevice State
      0      8      16        0      active sync  /dev/sdb
      1      8      32        1      active sync  /dev/sdc
 

추가한 파티션 포맷 

생성한 RAID 파티션을 ext4 파일시스템으로 포맷한다. 
# /dev/md9 장치를 ext4 파일시스템으로 포맷

$ sudo mkfs.ext4 /dev/md9

 

아래와 같이 포맷이 진행된다.
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
335540224 inodes, 5368643072 blocks
268432153 blocks (5.00%) reserved for the super user
First data block=0
163838 block groups
32768 blocks per group, 32768 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544, 1934917632,
2560000000, 3855122432

Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:             
done

 

 

파일 시스템 Mount

이후 과정은 하드디스크 1개를 추가할때와 동일하다.
하드디스크 1개를 추가하는 방법은 아래 포스팅을 참고한다.
 
파티션 목록을 확인해보면 ext4로 추가한 /dev/md9 장치가 없다.
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        16G    0  16G  0% /dev
tmpfs            16G    0  16G  0% /dev/shm
tmpfs            16G  8.7M  16G  1% /run
tmpfs            16G    0  16G  0% /sys/fs/cgroup
/dev/sda2        50G  2.3G  45G  5% /
/dev/sda3        50G  53M  47G  1% /home
/dev/sda6      9.8G  37M  9.2G  1% /tmp
/dev/sda1      976M  152M  757M  17% /boot
/dev/sda7      131G  61M  125G  1% /workspace
tmpfs          3.2G    0  3.2G  0% /run/user/1000
$

 

파일시스템이 마운트 되지 않아 발생하는 것으로 해당 파티션을 Mount하면 사용 가능하다.
재부팅 이후에도 사용해야 하므로 fstab에 추가한다.
 

파티션 UUID 확인

추가한 파티션의 UUID를 확인하고 /dev/md9의 값을 복사한다.
$ sudo blkid

# 출력 된 UUID 중 /dev/md9 항목의 값 복사
# TYPE="ext4" 인지 확인
 
아래와 같이 /dev/md9값이 확인된다.

 

 

fstab 수정

fstab 파일을 열고 해당 UUID를 이용하여 파일시스템을 Mount한다. 
$ sudo vi /etc/fstab

# 가장 마지막줄에 아래와 같이 입력

# 복사한UUID  폴더경로  ext4  defaults  0 0
# /dev/sdb  폴더경로  ext4  defaults  0 0

UUID=25963689-1e5f-4086-92fd-02525ec19785 /                      ext4    defaults        1 1
UUID=90e764a7-a577-4ead-8910-e63afd91a1f8 /boot                  ext4    defaults        1 2
UUID=76e95bc8-bcd0-4162-9a0e-cf56ba8c6859 /home                  ext4    defaults        1 2
UUID=77736055-55ac-4cc7-b5ff-d03f82cf04a8 /tmp                    ext4    defaults        1 2
UUID=7cf82f4d-4acd-4858-a4ed-40e3f4b012de /workspace              ext4    defaults        1 2
UUID=227b4854-fa4a-472a-909a-819083cf607b swap                    swap    defaults        0 0

# 마지막 줄에 아래와 같이 입력한다.
UUID=43b9b0b7-16e7-448d-be00-5c4263fef3f4 /data                  ext4    defaults        0 0

# 또는
/dev/md9 /data        ext4    defaults    0 0

# :wq 입력하여 저장하고 종료

 

재부팅해서 정상적으로 Mount 되었는지 확인한다.
# 재부팅
$ sudo reboot now

# 연결한 폴더와 파티션 정보 확인
$ ls -al /data
합계 24
drwxr-xr-x  3 root root  4096 Apr  3 15:44 .
dr-xr-xr-x. 20 root root  4096 Mar 24 15:01 ..
drwx------  2 root root 16384 Apr  3 15:44 lost+found

# 연결 된 파티션 목록 확인
$ df -h    # /dev/md9 장치 존재 여부와 파티션 용량 확인
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        16G    0  16G  0% /dev
tmpfs            16G    0  16G  0% /dev/shm
tmpfs            16G  8.7M  16G  1% /run
tmpfs            16G    0  16G  0% /sys/fs/cgroup
/dev/sda2        50G  2.3G  45G  5% /
/dev/sda1      976M  152M  757M  17% /boot
/dev/sda6      9.8G  37M  9.2G  1% /tmp
/dev/sda7      131G  61M  125G  1% /workspace
/dev/sda3        50G  53M  47G  1% /home
/dev/md9        20T  20K  19T  1% /data          # 정상적으로 추가된 것이 확인된다.
tmpfs          3.2G    0  3.2G  0% /run/user/1000

 

 

마지막으로 mdadm 명령어로 하단에 /dev/sdb, /dev/sdc 장치가 추가되었는지 다시 확인한다.
# 하단에 /dev/sdb, /dev/sdc 장치 추가 여부 확인

$ sudo mdadm --detail /dev/md9
 
아래 블로그를 참고하였다.