
이번 글에서는 리눅스 상에서 RAID를 수행하는 방법을 정리한다.
RAID(Redundant Array of Independent Disks)는 여러 개의 하드 디스크나 SSD를 하나의 논리적인 디스크로 묶어서 사용하는 기술이다. 데이터를 분산해서 저장하거나 복사본을 두어서 성능을 높이거나, 디스크가 고장 나더라도 데이터를 안전하게 보호하기 위한 것이 주된 목적이다. RAID를 이해하기 위해서는 기본적으로 Striping, Mirroring, Parity 기초 개념을 알아야한다.
Striping은 데이터를 여러 디스크에 쪼개서 나눠서 저장한다. 여러 디스크에서 동시에 읽고 쓰기 때문에 속도가 빠르다. RAID 0이 Striping에 해당하고 디스크가 하나라도 고장나면 모든 데이터를 잃을 수 있다.
Mirroring는 데이터를 똑같이 복제하여 다른 디스크에 저장하는 것이다. RAID 1이 Mirroring에 해당한다. 최소 2개 디스크가 필요하고 안전에 올인한 방법이다.
Parity는 데이터 복구를 위한 체크섬 정보를 저장한다. 디스크 고장시 이정보를 복원한다. RAID 5가 Parity에 해당하고, 최소 3개의 디스크를 필요로한다. RAID 5는 기본적으로 RAID 5는 기본적으로 Striping을 수행하지만 패리티 정보를 분산 저장한다.
먼저 RAID를 위한 가상 머신을 만든다.


아래 표를 참고해서 SCCI 10개 디스크를 만든다.

리눅스 가상환경 전원 끄고
Add 눌러서 1기가 씩 10개를 추가한다.
7번빼고 9개 추가한다. (많이 추가해서 RAID를 하나하나씩 적용해볼 예정이다.)

방금 만든 리눅스 가상환경으로 들어가서 /dev (device) 폴더로 들어가본다.
"Sd*"로 시작하는 모든것 확인해본다.
ls /dev/sd*
그림에서 보면 /dev/sda, /dev/sda2로 2개가 나눠져있는데, 파티션이 설정된 것이다. 그런데 다시 자세히 보면 몇가지 더 있는데 여기에다가 RAID를 순서대로 적용해보는 것이 이번 글의 목표이다.

윈도우랑 다르게 디스크 추가하고나서 리눅스는 디스크 파티션을 잡아야한다.
fdisk로 현재 설정된 sda 기가랑 나눠진것들 다보인다.
fdisk -l
Sda1은 booting 정보가 들어가 있다. 그래서 파티션이 나눠져있는 것이다.
Sda가 손상되버리면 안켜진다.

fdisk를 사용해서 sdb로 들어간다.
fdisk에서 자주쓰는 옵션 몇가지만 정리한다.
소문자 d : 파티션 정보 지운다
소문자 n : 새로운 파티션 생성
소문자 t : 파티션 정보
소문자 l : 파티션 타입 지정 정보가 보인다.
fdisk /dev/sdb

n 옵션은 새로운 파티션을 생성한다.

p 옵션을 입력해서 파티션 타입을 primary로 설정한다.
First sector, Last sector는 기본 상태로 설정한다 (엔터)
Create a new partition 1 메시지 보면 파티션이 생성된 것을 볼 수 있다.

아래의 그림처럼 Command 부분에 p 명령어 써보면 현재 디스크의 파티션 정보를 조회할 수 있다. 사이즈가 2GB 이다. 오른쪽에 보면 타입은 리눅스로 되어있다.

W를 입력하여 파티션 상태를 저장한다.

파티션이 지정 되었으면, 파일시스템을 정의해줘야한다. mkfs는 파일시스템을 설정하는 명령어이다. ext4는 리눅스에서 많이 사용되는 타입중에 하나이다. ext3이전에는 명령어가 달라지는 경우도 있다.
이 과정은 파티션에 파일시스템을 지정해주는 것이다.
mkfs –t ext4 /dev/sdb1
여기서, -t : 파일시스템 타입 ext4로 설정

리눅스틑 트리구조로 되어 있다보니까 지금 등록하고 있는 디스크를 최상위 디렉토리에 마운팅(Mounting)해줘야 한다.
(윈도우는 파티션이 드라이브 단위)

최상위 디렉토리에 mkdir로 "1" 이라는 디렉토리를 하나 만들고 여기에 파티션을 마운팅한다.

최상위 디렉토리에 1이라는 곳이 있다. 마운팅이 잘 되었는지는 df 명령어를 사용해서 확인한다.
mount /dev/sdb1 /1
df

1.text를 만든다.
**해당 디스크로 갔는지 리눅스 자체adb에 들어갔는지를 확인해봐야한다.
Umount로 연결 해제해보면 한다.
최상위디렉토리에서 해야한다.
df명령어 사용해보면, /1이 사라진거 볼 수 있다.
cd 1
touch 1.text
umount /1
df

끊었던 mount를 다시 연결하니까 1.txt가 다시 생겼다.
mount /dev/sdb1 /1


여기서부터는 파티션을 먼저 설정해놔야하기 때문에 반복한다.
fdisk /dev/sdc
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdd
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sde
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdf
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdg
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdh
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdi
N 옵션
디폴트들 엔터
W 옵션으로 저장
fdisk /dev/sdj
N 옵션
디폴트들 엔터
W 옵션으로 저장
mdadm 패키지가 설치되어 있는지를 확인한다. 현재 경우에는 설치되어 있다.
dnf list mdadm

리니어로 mdafm을 설정해준다.
mdadm --create /dev/md9 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm --detail --scan
cat /proc/mdstat

파일시스템을 적용한다.
mkfs -t ext4 /dev/md9

최상위디렉토리에 linear 디렉토리를 만든다.
mkdir linear
그리고 최상위 디렉토리에 있는 linear에 디스크를 마운팅 한다.
(df –h : 기가 단위로 보기 편함)
mount /dev/md0 /linear/
df -h

여기 까지 왓으재부팅을 한번 해본다.
리눅스는 사용자가 설정하는 것이다 보니까. 마운트된 정보를 어떤 파일에 정리해서 넣어줘야 한다. 안그러면 아래에 마운트 과정을 매번 켤때마다 해줘야 한다.
mount /dev/md0 /linear/
df -h
재부팅하면 날라가는 파일도 하나 있다. 마운트 기록을 mtab에 모두 기록해준다.
vi /etc/mtab


여기서는 fstab 으로 들어가서 수정해줘야 마운트된 것이 날라가지 않는다.
vi /etc/fstab

이 단계에서는 마운트 자동화를 위한 uuid 확인 이 필요하다.
Blkid로 uuid 알고 복사한다. 여기서 Linear에서는 md9 부분을 봐야하는데 너무 많다.
blkid

grep을 함께 조건으로 걸어서 UUID를 확인한다.
blkid | grep md9

다시 fstab으로 돌아가서 uuid를 추가해준다.
vi /etc/fstab

여기까지 추가했으면
재부팅후에 df –h 명령어 실행해보면
Linear가 남아있는 것 확인했다.

Linear RAID가 완료되었다.
RAID 0은 Striping 타입의 디스크 분산 방법으로 아래와 같이 구현한다.
RADI 0 을 구현하기 위해서 mdadm을 사용해서 /dev 밑에 md0이라는 곳에 디스크를 적용하는데 level을 0으로 설정한다. raid하려는 디바이스 갯수가 2개인데, 각각의 경로를 설정해 주어야 한다. /dev/sdd1와 /dev/sde1를 사용한다.
mdadm --create /dev/md0 --level=0 --raid-device=2 /dev/sdd1 /dev/sde1

ext4 타입으로 md0에 파일시스템을 적용해준다. 모두 완료되면 done 메시지들이 눈에 보일 것이다.
mkfs -t ext4 /dev/md0

최상위 디렉토리에 마운트하고자 하는 폴더를 하나 만든다.
mkdir /raid0

/raid0에 마운트하고, 잘 들어갔는디 df –h로 확인한다.
mount /dev/md0 /raid0
df -h

RAID 1은 미러링으로 디스크 하나를 백업한다. 자세한 구현 방법은 아래 그림을 따라간다.
RADI 1 을 구현하기 위해서 mdadm을 사용해서 /dev 밑에 md1이라는 곳에 디스크를 적용하는데 level을 1으로 설정한다. raid하려는 디바이스 갯수가 2개인데, 각각의 경로를 설정해 주어야 한다. /dev/sdf1와 /dev/sdg1를 사용한다.
mdadm --create /dev/md1 --level==1 --raid-device=2 /dev/sdf1 /dev/sdg1

추가로 /proc/mdstat을 보면 어떻게 파일시스템이 설정되어 있는지 확인할 수 있다. md1 부분을 보면된다.
cat /proc/mdstat

ext4 타입으로 md1에 파일시스템을 적용해준다. 모두 완료되면 done 메시지들이 눈에 보일 것이다.
mkfs -t ext4 /dev/md1

최상위 디렉토리에 마운트하고자 하는 폴더를 하나 만든다.
mkdir /raid1

/raid1에 마운트하고, 잘 들어갔는디 df –h로 확인한다.
mount /dev/md1 /raid1
df -h

RADID 5는 Parity 기능이 추가된 Striping을 수행한다. 자세한 구현 방법은 아래와 같다.
RADI 5 를 구현하기 위해서 mdadm을 사용해서 /dev 밑에 md5이라는 곳에 디스크를 적용하는데 level을 5으로 설정한다. raid하려는 디바이스 갯수가 3개인데, 각각의 경로를 설정해 주어야 한다. /dev/sdh1와 /dev/sdi1 /dev/sdj1를 사용한다.
mdadm --create /dev/md1 --level==5 --raid-device=3 /dev/sdh1 /dev/sdi1 /dev/sdj1
/proc/mdstat에 잘 들어갔는지 확인한다.
cat /proc/mdstat

ext4 타입으로 md5 파일시스템을 적용해준다. 모두 완료되면 done 메시지들이 눈에 보일 것이다.
mkfs -t ext4 /dev/md5
최상위 디렉토리에 마운트하고자 하는 폴더를 하나 만든다.
mkdir /raid5

/raid5에 마운트하고, 잘 들어갔는디 df –h로 확인한다.
mount /dev/md1 /raid5
df -h
