안녕하세요 마무입니다~ 이번에는 지난번에 배운 RAID개념을 이용해
" 리눅스 RAID"를 "mdadm" 명령어를 통해 구성해볼 겁니다만 당연히 "소프트웨어 RAID" 입니다.
이 포스트를 다 읽으시면 이제 리눅스에서 완벽하게 소프트웨어 RAID를 구성할 수
있으실 겁니다!
RAID 개념에 대한 전 포스트를 못 보신분들은
RAID 개념: https://mamu2830.blogspot.com/2020/01/raid-linear-0156100115.html
을 꼭 보고 오시고
마운트랑 파일시스템의 개념이 부족하신 분들은
마운트 : https://mamu2830.blogspot.com/2019/11/fdisk-df-etcfstab-blkid.html
파일시스템이란 : https://mamu2830.blogspot.com/2019/10/chs-lba.html
을 보고 오시면 되겠습니다!
----목차----
1. 명령어 "mdadm"의 옵션과 파일들
i) --create [만들 /dev/md{숫자}] --level=[레이드버전] --raid-devices=[장치수] [레이드 만들 장치명1] [레이드 만들 장치명2]...
또는 -C [만들 /dev/md{숫자}] -l [레이드 버전] -n [장치 수] [레이드 만들 장치명1] [레이드 만들 장치명2]...
ii) "--level"와 같은 형식의 옵션과 "-l 형식"의 옵션의 차이점
iii) --detail [/dev/md{숫자}]
또는 -D [/dev/md{숫자}]
또는 -S [풀 /dev/md{숫자}]
v) 레이드에 대한 슈퍼블록을 제거하는 옵션 "--zero-superblock", 그리고 슈퍼블록을
지웠는데도 파티션이 존재 하는 경우(sgdisk -Z)
vi) [장치를 추가할 /dev/md{숫자}] --add [추가할 장치명]
또는 [장치를 추가할 /dev/md{숫자}] -a [추가할 장치명]
vii) [장치를 제거할 /dev/md{숫자}] --remove [제거할 장치명]
또는 [장치를 제거할 /dev/md{숫자}] -r [제거할 장치명]
viii) 현재 RAID상황이 적혀있는 "/proc/mdstat" 파일
2. RAID 0, 1, 10, linear, 5 구성하기
i) 디스크 추가
ii) fdisk 명령어로 RAID용 파티션 만들어주기
iii) yum install -y 으로 "mdadm"다운받기
iv) RAID 0
v) RAID 1
vi) linear RAID
vii) RAID 5
viii) mkfs 명령어로 만든 RAID에 파일시스템 포맷하기
ix) 만든 RAID를 마운트하여 사용, /etc/fstab에 등록하기
x) 디스크를 제거한 다음, 복구기능 확인하기
xi) RAID 10
xi) RAID 10
3. 소프트웨어 RAID 6에 Centos를 설치해보자
여기서 못 찾은 정보는 여기서 한번 찾아보세요!
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
------------
1. 명령어 "mdadm"의 옵션들
소프트웨어 레이드를 만들 때 사용하는 명령어는
mdadm('m'ultiple 'd'evice 'adm'inistration)라고 하는데요 특이하게 이 "mdadm" 명령어는 레이드를 만들 때 여러 옵션들이 필요하기에, 옵션들이 무엇무엇이 있는지 먼저
알아보겠습니다!
i) --create [만들 /dev/md{숫자}] --level=[레이드버전] --raid-devices=[장치수] [레이드 만들 장치명1] [레이드 만들 장치명2]...
어우 뭔가 되게 복잡하게 옵션들이 있죠? "--create", "--level", "--raid-devices" 처럼
말이죠.
그런데 왜 이렇게 복잡하게 옵션을 한번에 적었을까요, 말 그대로 옵션이니까 순서는 중요하지 않으니 한 개씩 쓰면 좋을텐데 말이죠!
왜 한번에 썼냐면, 딱 예외적으로 이 "mdadm"을 이용해 RAID를 구성할 때는 옵션의 순서를 지켜야합니다.
다시 말해서 "--create [만들 /dev/md{숫자}]" 다음에 "--level=[레이드버전]" 그 다음에
"--raid-devices=[총 장치수] [레이드 만들 장치명1] [레이드 만들 장치면2]..." 이렇게
순서를 지켜야 한다는 것이죠.
순서를 지켜야 한다는 것은 다시 말해 순서를 외워야 한다는 것인데, 외운다는 것에서
부터 벌써 우리들은 짜증이 납니다.. 그럴 수 밖에 없죠 ㅠㅠ
그래서 제가 그나마 외우는 형식을 알려드리려고 합니다. 보다 쉽게 이해하면서 외우기
위해서죠.
mdadm --create /dev/md0(/dev/md0이라는 이름의 파일로 레이드 볼륨을 만들겠다)
--level=0(레이드 레벨 0로) --raid-devices=2(레이드를 이루는 장치는 총 2개이며)
/dev/sdc1 /dev/sdd1(/dev/sdc1와 /dev/sdd1로 이루어져 있다)
이런식으로, 논리적인 순서를 생각하시면서 외우시면 좀 더 쉽게 외워지실 겁니다!
물론 목차에서 설명했던 것처럼
mdadm -C [만들 /dev/md{숫자}] -l [레이드 버전] -n [장치 수] [레이드 만들 장치명1] [레이드 만들 장치명2]...
이렇게 "--create"와 같은 옵션 대신 "-C"와 같은 짧은 옵션을 사용하여 만들어도 됩니다.
그리고 같은 옵션이기 때문에
mdadm --create [만들 /dev/md{숫자}] -l [레이드 버전] -n [장치 수] [레이드 만들 장치명1] [레이드 만들 장치명2]...
이렇게 긴 옵션과 짧은 옵션을 섞어서 사용해도 됩니다.
여기서 RAID를 만들 때의 옵션은 순서를 지켜야 한다는 것을 알았다쳐도,
또 하나의 어떠한 의문이 생기지 않습니까?
그 의문이란 바로 "--level"와 같이 "--" 짝대기 두개와 단어가 합쳐진 긴 옵션과
"-l 또는 -L"와 같이 "-" 하나와 한 글자가 합쳐진 짧은 옵션의 차이가 무엇이냐 하는
의문이죠
ii)"--level"와 같은 형식의 옵션과 "-l" 형식의 옵션의 차이점
일단 확실한 것은 둘다 같은 "옵션"이라는 겁니다. 그러니까 둘다 생김새만 다르지
사용하는 용도는 똑같습니다.
하지만 약간의 차이가 있으니, 일단 당연히 생김새도 "--level"과 "-l"처럼 다르지만
"--level" 같은 옵션은 "="가 뒤에 붙고 그 뒤에 띄어쓰기 없이 옵션 값을 넣는 경우가 있는가 하면, 또 어떤 경우엔 "--create [옵션 값]" 이렇게 띄어쓰기를 한 다음 값을 주는 경우가 있습니다.
"-l"과 같은 짧은 옵션은 무조건 띄어쓰기를 하고 옵션 값을 주는 것에 비교하면 상당히
변칙적이죠
이런 변칙성 때문에 상당히 헷갈리고 고통받는 분들이 꽤 있으실 겁니다.
저 또한 그랬거든요 하지만 알고보면 규칙이 있다는 것!
"--level" 와 같은 긴 옵션의 규칙
1. 주로 어떤 프로그램에서, 사용하는 명령어의 옵션이다.(여기선 mdadm이란 프로그램이 사용하는 옵션이죠?)
2. 프로그램에서 정해놓은 옵션 값중 하나를 줄 때는 "--level=5" 이렇게 띄어 쓰기 없이
"="에 붙여서 옵션 값을 준다.
("mdadm" 프로그램에서 정해놓은 옵션 값들은 linear, 0, 1, 2, 3, 4, 5, 6 중 하나니깐!)
3. 프로그램에서 정하지 않은 옵션 값을 줄 때는 "--create /dev/md5"와 같이 띄어쓰기를
한 다음 옵션 값을 준다.(파일의 이름 같은 경우, 프로그램에서 정하지 않았고, 임의로 주기 때문에)
"프로그램에 정해놓은 옵션 값"이라는 것은 아직 공감이 잘 안되실텐데 나중에
"systemctl"이런 명령어를 통해 시스템 설정을 바꾸실 때 공감이 잘 되실겁니다.
다시 쉽게 정리하자면, "--level"와 같은 옵션에 값을 줄 때는
'레이드 레벨은 정해져 있지? 그러면 "=" 붙여서 띄어쓰기 없이 옵션 값을 줘야겠군!'
이렇게 생각하시고
"--create"같은 경우엔
'파일의 이름은 만드는 사람에 따라 달라지므로, 프로그램에서 정하지 못했을거야!
그러니 띄어쓰기를 한 다음 옵션 값을 줘야겠어!'
이렇게 생각하시면 덜 헷갈리며 외우기 좀 더 편하실 겁니다!
iii) --detail [/dev/md{숫자}]
mdadm --detail [/dev/md{숫자}]
또는 mdadm -D [/dev/md{숫자}] 이렇게 사용하며
이름 그대로, 옵션 값으로 준 레이드의 디테일한 정보를 보여주는 옵션입니다.
디테일한 정보를 보여주기에 주로 레이드에 문제가 생겼는지 확인하는 용도로 사용합니다.
또한 방금 만든 레이드에도 오류나 문제가 있을 수 있기 때문에,
레이드를 만들자마자 이 --detail 옵션으로 확인해주시는 게 좋습니다.
iv) --stop [해제할 /dev/md{숫자}]
mdadm --stop [/dev/md{숫자}]
또는 mdadm -S [/dev/md{숫자}] 이렇게 사용하며
이름 그대로. 옵션 값으로 준 레이드를 정지시키는 옵션입니다.
여기서 "레이드를 정지"라고 하면 약간 이해가 안 되실텐데 그림으로 설명하자면
라 명령어를 준 직후엔 윗 그림처럼 "mdadm"이 RAID를 유지(계산)하고 있는 상황입니다.
여기서 저희가 "mdadm --stop /dev/md0" 을 하면 이건
"야 mdadm, 너 /dev/md0 계산 그만해"라고 하는 꼴이죠
그러면 계산 멈추라고 mdadm에게 말했으니
mdadm은 RAID계산을 멈췄으니 윗 그림처럼 "/dev/md0"은 사라지는 겁니다.
그런데 이 이후에 RAID 0을 구성했었던, /dev/sdc1 이나 /dev/sdd1을 이용해 다른
RAID를 구성하려고 하면 "appears to be part of a raid array" 이렇게
다른 레이드의 구성요소로 보인다고 하며 뭐라 뜨는데
이건 파일시스템에서 배웠었던 메타데이터인 "슈퍼블록"이 남아있어서 그럽니다.
즉 "mdadm --create"로 디스크들을 한번이라도 레이드로 묶으면 각 디스크에는
이 디스크는 RAID 0의 장치중 하나이고, 512KB씩 데이터를 분산저장해라 이런식의
"사용설명서(슈퍼블록)" 같은 것이 남있는것이죠
그래서 "--zero-superblock"이란 명령어를 이용해 완전하게 슈퍼블록까지 지워준 다음 새로운 RAID를 만들어줘야 합니다
v) 레이드에 대한 슈퍼블록을 제거하는 --zero-superblock,
그리고 슈퍼블록을 지웠는데도 파티션이 존재 하는 경우
저희가 레이드를 "--STOP"만 한 상태에서 "/dev/sdc1과 /dev/sdd1"을 이용해 다른
레이드를 구성하려고 한다면
이런식으로 RAID 0에 속해있다며 사용을 못합니다.
이 현상은 위에서 iv)에서 말했던 것처럼 각 파티션에 남아있는 레이드 슈퍼블록 때문에
그런 것이거든요
그림으로 보여드리자면
이런식으로 슈퍼블록(사용설명서)이 남아 있습니다. 완전히 깔끔하게 레이드를 새로 만들기 위해 "mdadm --zero-superblock /dev/{sdc1,sdd1}"을 해줄겁니다.
"{}"는 "find 명령어"편에서 신나게 배웠었죠? 기억 안나거나 모르시는 분들은 보고오시길!
이제 슈퍼블록을 지우면
그림처럼 이제야 비로소 완벽히 레이드를 취소한 상태가 됩니다.
자 그런데 분명 슈퍼블록을 지웠는데도
이렇게 빨간색으로 밑줄을 친 곳처럼 (partition table exists on [파티션] but will be lost
or meaningless after creating array)라고 특정 파티션이 아직도 존재한다고 하는 경우가
있습니다.
이런 경우가 왜 생기나면 "fdisk /dev/sdc"으로 sdc1파티션을 만든게 아니라
실수로 fdisk /dev/sdc1에서 sdc1파티션을 만든 경우 이런 상황이 만들어집니다.
이렇게 되면 진짜 골 때립니다 파티션을 제거하고 다시 만들어도, 계속 저 문구가
뜨거든요
이런경우 당황하지 마시고
"sgdisk -Z /dev/sdc1" 을 해주신다음 재부팅을 해주세요(당연히 "mdadm --stop"으로
레이드 푸시고, "--zero-superblock /dev/sdc1" 으로 슈퍼블록 지우신 다음에 말이죠)
만약 sdc1 파티션을 이미 지운상태면, "fdisk /dev/sdc"로 sdc1파티션을 그대로 다시
만들어준다음, "sgdisk -Z /dev/sdc1"을 하고 재부팅을 해주세요
재부팅을 한 뒤 레이드를 다시 만들려고 하시면
이제 이렇게 깔끔히 잘 되실겁니다~
vi) [장치를 추가할 /dev/md{숫자}] --add [추가할 장치명]
mdadm [디스크를 추가할 RAID 볼륨] --add [볼륨에 추가할 디스크]
또는 mdadm [디스크를 추가할 /dev/md{숫자}] -a [볼륨에 추가할 디스크]
형식으로 사용을 하고
기존의 레이드 볼륨에 새로운 디스크를 추가할 때 사용하는 명령어이고,
복구 기능이 있는 RAID 볼륨에만 씁니다.
복구기능이 있는 RAID인 경우, 결함이 있는 디스크를 그냥 제거하고 새로운 디스크를
"--add"옵션으로 추가해주면 자동으로 복구가 되거든요
그럼 결함이 없는 멀쩡한 RAID에 디스크를 하나 추가하면 어떻게 되느냐?
(ex:3개의 디스크로 이루어진 RAID 5에 디스크를 하나를 추가한 상황이라 치면)
이미 RAID 5를 만들 때 "--raid-devices=3"라고 적었기에 4개의 디스크가 RAID 5가 되진
않고, 1개의 디스크가 spare(여분)용이 됩니다.
여분용 디스크는 뭐냐? 말 그대로 여분용으로 작동도 안하고 그대로 있다가 한 디스크가
결함이 생기면, 결함 있는 디스크와 바뀝니다.
어디까지나 복원기능이 있는 RAID 이야기이니,
RAID 0이나 linear RAID같은 복구 기능이 없는 RAID에선 --add 옵션을 사용하지 않는다는 것을 알아두세요
복구기능이 없는 non-redundant RAID(0, linear)는 --stop했다가 파티션 초기화 하고
새로 --create로 만들어야 합니다.
vii) [장치를 제거할 /dev/md{숫자}] --remove [제거할 장치명]
mdadm [장치를 제거할 RAID 볼륨] --remove [제거할 장치명]
또는 mdadm [장치를 제거할 RAID 볼륨] -r [제거할 장치명]
이렇게 쓰이며
보통 RAID의 결함있는 디스크를 제거할 때 사용합니다.
당연히 복구기능이 있는 RAID(1,5,6)에 쓰이고, 복구기능이 없는 RAID는 전부 --stop
했다가 새로 만듭니다.
viii) 현재 RAID상태가 적혀있는 "/proc/mdstat" 파일
곧 저희가 실제로 RAID를 구성할 텐데요, 아무래도 사람이기에 실수해서 다시
지웠다가 만들 수도 있고, 또 다른 목적에 의해 만들었던걸 다시 만들 수 있는데
그럴 때마다 저희는
"Device or resource busy"라던가 "appears to be part of a raid array"라던가
이미 사용되고 있다고 뜨는 걸 자주 보게 되실텐데요
그럼 활성화 되고 있는, 혹은 사용중인 레이드가 있는 건 어떻게 확인할까요?
그럴 때 사용하는 파일이 바로! "/proc/mdstat"입니다
"/proc(process)"란 프로세스 디렉토리에 있으니 즉, 현재 실행중인 어떠한 것에
대한 파일이고 md(multiple devices)stat(시간에 관련된 상태정보) 이름대로
레이드에 대한 상태정보가 적힌 파일입니다.
말 그대로 "파일"이기 때문에 읽으려면 vi든 more이든 cat이든 파일을 읽는 명령어를
아무거나 사용해도 되지만, 그냥 간단하게 확인만 할 거라서 보통 "cat"을 많이 씁니다.
이렇게 "cat /proc/mdstat"라고 치니 현재 RAID 0이 /dev/sdc1과 /dev/sdd1으로
만들어져 있는게 보이네요, 또한 이 RAID 0의 용량은 2091008블록(2091008 blocks)
이구여
1.2 버젼의 슈퍼블록을 쓰며(super 1.2), 각 디스크에 512KB씩 데이터를 분산 저장하네요
(512k chunks)
chunks는 "덩어리"이런 뜻인데 그냥 전체 파일을 512KB씩 덩어리처럼 떼어내서
각 디스크에 저장한다 이렇게 생각하시면 될 것 같습니다.
어우 옵션 설명이 너무 길었죠.. 이제 본격적으로 RAID 1, 0, 10, linear, 5을 차례대로
만들어보겠습니다!
2. RAID 0, 1, 10, linear, 5 구성하기
저희가 RAID를 구성하기 전에 기본적으로 해야할 일이 있습니다.
바로 디스크 추가죠!
i) 디스크 추가
저희는 RAID 0(2개), RAID 1(2개), linear RAID(2개), RAID 5(3개)로 총
1GB크기의 SCSI 디스크를 "9개" 추가해줄 겁니다.
이렇게 하드웨어 세팅에 들어가서
이렇게 디스크를 1GB 크기로 9개를 추가해 줍니다.
리눅스에서 디스크는 추가한 순서대로 sda, sdb, sdc, sdd, sde, sdf, sdg .... 이렇게 생기는데
여기선 전부다 New Hard Disk(SCSI)이렇게 보이니까 어떤게 sdc인지 sdd인지 순서를
모르겠죠?
이럴 땐 당황하지 마시고 순서를 알고 싶은 디스크를 누르신다음
이렇게 표시한 'Advanced(더 세부적인..)'을 누르시면
이렇게 SCSI(SCSI 형식의 디스크의) 0(0번 슬롯의) : 2(0부터 시작하니, 2라는 건 3번째죠?)
라고 써져있습니다.
이 디스크는 3번째이니 이 디스크는 리눅스 내부에서 보면 "/dev/sdc"로 나올겁니다
이런 방식으로 어떤 디스크가 몇 번째 디스크인지 알 수 있습니다.
그러나 VMware에선 "7"번이 예약된 번호라고 하며 안 쓰입니다.
그러니 원래 8번째(0부터 시작했으니)인 하드디스크는 7번이 아닌 8번에 배치가
되는 것이죠
물론 VMware를 껏다 키면
이런식으로 제대로 순서가 나오긴 합니다. ㅎㅎ
자 이렇게 해서 총 9개의 SCSI의 1기가 디스크를 추가해줬으니 파티션을
나누고 RAID용으로 바꾸기 위해 리눅스를 키겠습니다.
ii) fdisk 명령어로 RAID용 파티션 만들어주기
리눅스 터미널에 들어가서 "ls /dev/sd* " 이렇게 치시면
이렇게 뜰 겁니다.
sdc1이나 sdd1와 같은 "1"로 끝나는 파일이 없다는 건 파티션이 하나도 없다는 뜻이에요
측 저희는 이제부터 /dev/sdc~ /dev/sdk까지 RAID 파티션을 만들어줄 겁니다.
"fdisk /dev/sdc" 이렇게 친 다음 추가하겠다는 "n"을 치고
어짜피 파티션은 하나만 쓸 것이기 때문에, 엔터만 눌러 디폴트로 1개의 파티션을
만들어 줍니다
이렇게 말이죠 (n누르고 전부 엔터) 그 다음
"p"로 확인해보시면
성공적으로 전체 디스크의 용량인 파티션이 만들어졌고, 오른쪽을 보시면
system 밑에 'linux'라고, 현재는 리눅스용인걸 볼 수 있습니다.
여기서 바꾸겠다는 "t"를 누르시고
이렇게 RAID의 16진수 "fd"를 입력해 줍니다.
물론 당연히 RAID의 16진수가 뭐였는지 기억이 안난다고 당황하실 필요는 없습니다
대문자 "L"를 하면 모든 종류가 나오기 때문이죠~
여기까지 끝낸다음 다시 "p"로 확인하고
이렇게 RAID용으로 바뀐 것을 잘 확인했으면 "w"를 입력해 저장하고 나가줍니다
자 이렇게 추가한 9개의 디스크를 모두 레이드 파티션을 만들어주시면
이렇게 모두 1이 달린 모습이 될 겁니다 ㅎㅎ 이제 "mdadm"명령어를 통해 RAID를
구성하면 끝~~~일 수도 있지만 "mdadm"프로그램이 없을 수도 있습니다.
그러니 "mdadm"을 먼저 다운해줄게요
iii) yum install -y 으로 "mdadm"다운받기
어려운 거 아니죠~
이렇게 바로 다운해줍니다. 물론 "yum"은 네트워크가 되야지 사용할 수 있다는 건
아시죠?
이렇게 뜨신다면 이미 최신버젼의 "mdadm"이 깔려있다는 것이므로 걱정할 필요 없습니다.
자 프로그램도 준비 됐기 때문에 RAID를 구성할 수 있습니다.
iv) RAID 0
이야 긴 글을 읽다가 드디어 본격적으로 RAID를 하나 구성해보네요
헷갈리지 않게 저희는 순서대로 "/dev/sdc1와 /dev/sdd1"을 RAID 0
"/dev/sde1와 /dev/sdf1"는 RAID 1
"/dev/sdg1와 /dev/sdh1"는 linear
"/dev/sdi1와 /dev/sdj1, /dev/sdk1"는 RAID 5로 만들겁니다.
"mdadm --create /dev/md0(레이드 0이니까 0으로 짓겠습니다.) --level=0 --raid-devices=2 /dev/sdc1 /dev/sdd1" 이렇게 레이드 0을 만들어줍니다
네 아주 잘 됐죠~
저희는 RAID 0(2개), RAID 1(2개), linear RAID(2개), RAID 5(3개)로 총
1GB크기의 SCSI 디스크를 "9개" 추가해줄 겁니다.
이렇게 하드웨어 세팅에 들어가서
이렇게 디스크를 1GB 크기로 9개를 추가해 줍니다.
리눅스에서 디스크는 추가한 순서대로 sda, sdb, sdc, sdd, sde, sdf, sdg .... 이렇게 생기는데
여기선 전부다 New Hard Disk(SCSI)이렇게 보이니까 어떤게 sdc인지 sdd인지 순서를
모르겠죠?
이럴 땐 당황하지 마시고 순서를 알고 싶은 디스크를 누르신다음
이렇게 표시한 'Advanced(더 세부적인..)'을 누르시면
이렇게 SCSI(SCSI 형식의 디스크의) 0(0번 슬롯의) : 2(0부터 시작하니, 2라는 건 3번째죠?)
라고 써져있습니다.
이 디스크는 3번째이니 이 디스크는 리눅스 내부에서 보면 "/dev/sdc"로 나올겁니다
이런 방식으로 어떤 디스크가 몇 번째 디스크인지 알 수 있습니다.
그러나 VMware에선 "7"번이 예약된 번호라고 하며 안 쓰입니다.
그러니 원래 8번째(0부터 시작했으니)인 하드디스크는 7번이 아닌 8번에 배치가
되는 것이죠
물론 VMware를 껏다 키면
이런식으로 제대로 순서가 나오긴 합니다. ㅎㅎ
자 이렇게 해서 총 9개의 SCSI의 1기가 디스크를 추가해줬으니 파티션을
나누고 RAID용으로 바꾸기 위해 리눅스를 키겠습니다.
ii) fdisk 명령어로 RAID용 파티션 만들어주기
리눅스 터미널에 들어가서 "ls /dev/sd* " 이렇게 치시면
이렇게 뜰 겁니다.
sdc1이나 sdd1와 같은 "1"로 끝나는 파일이 없다는 건 파티션이 하나도 없다는 뜻이에요
측 저희는 이제부터 /dev/sdc~ /dev/sdk까지 RAID 파티션을 만들어줄 겁니다.
"fdisk /dev/sdc" 이렇게 친 다음 추가하겠다는 "n"을 치고
어짜피 파티션은 하나만 쓸 것이기 때문에, 엔터만 눌러 디폴트로 1개의 파티션을
만들어 줍니다
이렇게 말이죠 (n누르고 전부 엔터) 그 다음
"p"로 확인해보시면
성공적으로 전체 디스크의 용량인 파티션이 만들어졌고, 오른쪽을 보시면
system 밑에 'linux'라고, 현재는 리눅스용인걸 볼 수 있습니다.
여기서 바꾸겠다는 "t"를 누르시고
이렇게 RAID의 16진수 "fd"를 입력해 줍니다.
물론 당연히 RAID의 16진수가 뭐였는지 기억이 안난다고 당황하실 필요는 없습니다
대문자 "L"를 하면 모든 종류가 나오기 때문이죠~
여기까지 끝낸다음 다시 "p"로 확인하고
이렇게 RAID용으로 바뀐 것을 잘 확인했으면 "w"를 입력해 저장하고 나가줍니다
자 이렇게 추가한 9개의 디스크를 모두 레이드 파티션을 만들어주시면
이렇게 모두 1이 달린 모습이 될 겁니다 ㅎㅎ 이제 "mdadm"명령어를 통해 RAID를
구성하면 끝~~~일 수도 있지만 "mdadm"프로그램이 없을 수도 있습니다.
그러니 "mdadm"을 먼저 다운해줄게요
iii) yum install -y 으로 "mdadm"다운받기
어려운 거 아니죠~
이렇게 바로 다운해줍니다. 물론 "yum"은 네트워크가 되야지 사용할 수 있다는 건
아시죠?
이렇게 뜨신다면 이미 최신버젼의 "mdadm"이 깔려있다는 것이므로 걱정할 필요 없습니다.
자 프로그램도 준비 됐기 때문에 RAID를 구성할 수 있습니다.
iv) RAID 0
이야 긴 글을 읽다가 드디어 본격적으로 RAID를 하나 구성해보네요
헷갈리지 않게 저희는 순서대로 "/dev/sdc1와 /dev/sdd1"을 RAID 0
"/dev/sde1와 /dev/sdf1"는 RAID 1
"/dev/sdg1와 /dev/sdh1"는 linear
"/dev/sdi1와 /dev/sdj1, /dev/sdk1"는 RAID 5로 만들겁니다.
"mdadm --create /dev/md0(레이드 0이니까 0으로 짓겠습니다.) --level=0 --raid-devices=2 /dev/sdc1 /dev/sdd1" 이렇게 레이드 0을 만들어줍니다
네 아주 잘 됐죠~
v) RAID 1
이번에는 /dev/sde1와 /dev/sdf1을 이용해 RAID 1을 만들어보겠습니다.
"mdadm --create /dev/md1(이번엔 레이드 1이니 1해볼게요) --level=1
--raid-devices=2 /dev/sde1 /dev/sdf1" 이렇게 레이드 1을 만들어줍니다.
그런데 이상한 문구가 뜹니다. "this array has metadata at the start and may
not be suitable as a boot device.
If you plan to store '/boot' on this device please
ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90"
이라고 말이죠
이건 "지금 현재 만들려는 레이드는 메타데이터가 시작부분에 있어서, 부트용으로는 적합하지 않다" 라는 뜻입니다.
그래서 "만약 부트용 디렉토리랑 이 레이드 디바이스를 마운트해 사용할 생각이면
부트로더가 md/v1.x 메타데이터 (저흰 1.2 버젼 metadata죠?)가 이해하게 만들던가,
만들 때 --metadata=0.90 옵션을 추가해서 만들어 사용해라" 라고 경고하는 겁니다.
이런 경고가 안뜨게 하시고 싶으시면
레이드 1 만드실 때, "--metadata=0.90"을 붙이시면 됩니다.
그런데 어짜피 부트용으로 안쓸거면 그냥 무시하셔도 돼요~
이번에는 /dev/sde1와 /dev/sdf1을 이용해 RAID 1을 만들어보겠습니다.
"mdadm --create /dev/md1(이번엔 레이드 1이니 1해볼게요) --level=1
--raid-devices=2 /dev/sde1 /dev/sdf1" 이렇게 레이드 1을 만들어줍니다.
그런데 이상한 문구가 뜹니다. "this array has metadata at the start and may
not be suitable as a boot device.
If you plan to store '/boot' on this device please
ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90"
이라고 말이죠
이건 "지금 현재 만들려는 레이드는 메타데이터가 시작부분에 있어서, 부트용으로는 적합하지 않다" 라는 뜻입니다.
그래서 "만약 부트용 디렉토리랑 이 레이드 디바이스를 마운트해 사용할 생각이면
부트로더가 md/v1.x 메타데이터 (저흰 1.2 버젼 metadata죠?)가 이해하게 만들던가,
만들 때 --metadata=0.90 옵션을 추가해서 만들어 사용해라" 라고 경고하는 겁니다.
이런 경고가 안뜨게 하시고 싶으시면
레이드 1 만드실 때, "--metadata=0.90"을 붙이시면 됩니다.
그런데 어짜피 부트용으로 안쓸거면 그냥 무시하셔도 돼요~
vi) linear RAID
linear는 "--level=linear"라고 쓰면 됩니다.
"mdadm --create /dev/md/linear --level=linear --raid-devices=2 /dev/sdg1 /dev/sdh1"
이렇게 말이죠
어라? 왜 /dev/md[숫자] 형태가 아니라 "/dev/md/[이름]" 이렇게 만들었냐고요?
제가 미리 말씀을 못 드렸었네요 하하..
레이드 볼륨을 만들때 방법은 "/dev/md[숫자]" 또는 "/dev/md/[원하는 이름]" 이렇게
총 2가지 입니다 ㅎㅎ
네 잘 만들어졌죠 그리고 참고로, /dev/md/[원하는 이름] 이렇게 만들경우'
"/dev/md127"처럼 임의의 숫자로 볼륨이 만들어진다음 거기에
"/dev/md/[원하는 이름]"의 링크파일이 생깁니다!
vii) RAID 5
자 저희가 학수고대하던 RAID 5입니다!
만드는 거 딱히 어렵지 않죠? 장치가 3개 이상이라는 것만 다르죠~
"mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/{sdi1,sdj1,sdk1}"
이렇게 만들어 줍니다.
네 잘 만들어졌네요~~~
viii) mkfs 명령어로 만든 RAID에 파일시스템 포맷하기
마운트편에서 배웠었죠, 모든 볼륨은 사용하려면 관리해주는 파일시스템이
있어야 한다고 말이죠!
저희가 만들어준 /dev/md{0,1,5,127}을 모두 "mkfs"명령어를 이용해 파일시스템을
포맷해줍시다.
리눅스 7부턴 xfs를 기본 파일시스템으로 채택했으니, xfs로 만들어주겠습니다
항상 확인해주시고~ 자 mkfs.[파일시스템 종류] [포맷할 볼륨]
해줍시다.
오우 쉽다 그죠?
ix) 만든 RAID를 마운트하여 사용, /etc/fstab에 등록하기
자자 마운트편에서 제가 말했엇죠~ 배(볼륨)과 파일시스템(선장)이 있어도
선착장(디렉토리)가 없으면 교류를 할 수가 없죠~
마운트할 디렉토리를 만들어준다음, 마운트를 하고 영구적으로 사용하기 위해
"blkid" 명령어로 UUID를 알아내서 "/etc/fstab"에 등록하겠습니다.
저는 헷갈릴 일이 없게 디렉토리들을 각각 "/raid0, /raid1, /raid5, /raid_linear" 이렇게
만들어줄 겁니다.
네, 잘 만들어졌네요~ 다시 말하지만 "{}"가 뭔지 모르시면 꼭 "find 포스트"를 보고 오시길
바랍니다~
디렉토리가 만들어졌으니 마운트해줘야죠~
네 제가 말했었죠, 컴퓨터 공학에선 무소식은 희소식이라구~
잘 됐겠지만 확인을 혹시 모르니 "mount -l"로 확인해 봅시다
최근에 만들어졌으니 맨 밑에만 보면 됩니다, 네 md{0,1,5,127}이 잘 마운트 됐죠?
이제 /etc/fstab에 등록을 할 건데, 전에도 말했다시피 항상 "UUID"로 등록하는게 매우
안전합니다.
"UUID"를 알아내기 위해 "blkid"명령어를 쳐봅니다.
네네 잘 확인했네요~ 하지만 저거 일일이 복사해서 /etc/fstab에 적기 너무 귀찮자나요?
여러 방법이 있지만
저는 위 사진처럼 "윈도우의 메모장"을 연다음 UUID를 복사하여 붙이고 사용할 때마다
일일이 복사하여 붙여넣습니다
참고로 "VMware"에서의 복사와 붙여넣기는 기존의 복사(ctrl+c)와 붙여넣기(ctrl+v)에서
"shift"만 더 붙이면 됩니다.
즉 VMware에서 "shift+ctrl+c"로 복사해서 윈도우 메모장에 "ctrl+v"로 붙이는 거죠
반대로 하는 건 굳이 말 안해도 아시죠?
마운트 포스트에서 배운대로, 위 사진처럼 /etc/fstab에 등록해줍니다.
그런데 딱 한가지 "4번째 필드 default"에 추가로 "nofail"을 붙여줍니다(default,nofail)
왜 "nofail"를 붙이냐면, 저희가 다음에 복구기능을 확인하기 위해 몇몇 디스크를 제거할
건데 그러면 "/etc/fstab"에 등록한 디스크에 오류가 생겼기에 부팅이 안되서
"응급복구"모드로 들어가야 한단 말이죠
그런 과정을 없에기 위해 "nofail" 옵션을 준겁니다.
여기서 "5번째 필드 dump"는 1로 사용 안하시냐 의문이 있으실 수 있는데, 저 덤프는
저희 현재 사용하는 RAID랑은 관련이 없습니다.
말 그대로 다른 장치들(DVD, USB)이런 거에 덤프를 생성할 때 사용하는 걸로
나중에 백업 명령어를 다룰 때 사용할 겁니다.
자 위 사진처럼 잘 썼으면 :wq로 저장하고 나가 줍니다.
아 그리고 생각해보니 저희 "--detail"옵션을 안 써봤군요
"mdadm --detail /dev/md*"로 한번 보고 갑시다
제가 주황색으로 표시한 곳만 보시면 됩니다.
state : clean 으로 문제 없고
failed devices : 0을 보니 문제 있는 디스크도 없네요
정보가 너무 기니
RAID 5만 더 보고 넘어가도록 하겠습니다.
네 위처럼 클린 상태고 모든 디스크가 정상작동하고 있습니다~
자 그럼 이제 RAID를 사용하는 주목적인 복구를 한번 실험해볼겁니다.
복구가 안되는 레이드들(RAID 0, RAID linear)중 "RAID 0"를 대표로 실험할 것이고요
복구가 되는 레이드들(RAID 1,2,3,4,5,6,10...)중 "RAID 5"를 대표로 실험할 것입니다.
x) 디스크를 제거한 다음, 복구기능 확인하기
복구가 제대로 됐는지 확인하려면 데이터가 있어야 하지 않겠습니까?
저희는 RAID 0과 RAID 5로 실험을 할 것이기 때문에 /raid0과 /raid5의 디렉토리에
큰 용량의 파일을 넣어보겠습니다.
혹자는 '파일을 만들면 안되나요?' 라고 하실 수 있는데, RAID개념 포스트에서 다뤘다시피
striped 방식은 512KB의 청크사이즈로 나눠 저장하기에 512KB보다 큰 파일을 넣어야
복구가 제대로 됐는지 확인 할 수 있습니다.
저희는 명령어 find를 배웠기에 512KB보다 큰 사이즈의 파일을 찾아서 복사 해넣으면 되는데, 아직 안 보시고 오신분들을 위해 제가 하나 찾아놨습니다.
"/var/log/messages" 파일을 복사해서 "/raid0"과 "/raid5"에 넣어주세요
잘 복사된 모습입니다.
이제 RAID 0, 5의 디스크를 하나씩 제거할 것인데, 잘못 제거하면 안되니 순서를
확실히 하고 갑시다.
RAID 0은 "/dev/sdc1(0:2)과 /dev/sdd1(0:3)"로 이루어졌었고
RAID 5는 "/dev/sdi1(0:9)와 /dev/sdj1(0:10), /dev/sdk1(0:11)"로 이루어졌었죠
sdd1(0:3)과 sdk1(0:11) 디스크를 제거하겠습니다.
centos를 먼저 종료한 뒤, 디스크를 제거해야 합니다.
삭제하기 전에 꼭 "Advanced.."를 누르셔서 확인을 하셔야 합니다.
확인을 해서 0:3과 0:11을 제거하시고
이렇게 제거한 다음 "ok"를 누르고 나가셔서 다시 리눅스를 켜줍니다.
다시 켜서 확인해보니, 복구기능이 없는 "/raid0"은 그냥 데이터가 사라져버렸고,
복구기능이 있는 "/raid5"는 아직 그대로 남아있네요
"--detail" 옵션으로 raid0을 확인해보니, 아예 "inactive", 즉 비활성상태가 됐네요
당연히 디스크 2개중 하나 /dev/sdd1은 사라졌고요
비활성상태가 됐다는 건, 결국 마운트도 끊어졌다는 이야기입니다.
"df -l"로 확인해보니 /raid5는 있는데 /raid0은 안보이죠
저희 예상은 볼 수 없는 절반크기의 파일이 있었을거라 예상했었지만
마운트가 끊어졌기에 "/raid0" 디렉토리에 아무것도 없었던 겁니다.
그에 비해서 복구기능이 있는 RAID5는 어떨까요?
inactive가 아닌 여전히 "clean"상태네요 물론 옆에 "degraded(구성요소가 바뀐)"이
붙어있지만요 그래서 마운트가 여전히 되어있던 겁니다.
그리고 당연히 디스크하나가 "removed"로 제거됐다고 뜹니다.
이렇게 파일의 끝 내용만 읽는 "tail"명령어를 이용하니 정상적으로 파일을 읽을 수
있고요, 즉 멀쩡하다는 것이죠
자 그럼 우리 이번에는 기존의 레이드볼륨에 디스크를 추가하는 mdadm의 "--add" 옵션
를 한번 써보겠습니다.
다시 리눅스를 종료하신다음, 1GB크기의 SCSI 디스크를 2개 추가해줍니다.
이렇게 말이죠
그리고
"Advanced"를 눌러서 확인해보시면 빈 공간에 자동으로 순서있게 디스크가 채워진 걸
볼 수 있습니다.
즉 저희가 추가한 디스크 2개는, 순서대로 "0:3과 0:11"에 들어갔을 겁니다.
다시 리눅스를 켜줍니다.
"--detail"로 확인해 보시면
여전히 디스크는 없어진 상태입니다. 이제 여기서 "--add"를 쓰는 겁니다.
물론 새로운 디스크를 추가했기에 다시 레이드용 /dev/sdd1 과 /dev/sdk1 파티션을 만들어줘야겠죠? "fdisk /dev/sdd", "fdisk /dev/sdk"를 하여 얼렁 만들어줍니다.
그리고 나서 "mdadm [레이드 볼륨] --add [추가할 디스크]" 해줍니다.
보시면 "md0(레이드0)"은 복구기능이 없기에 추가가 안됩니다.
하지만 "md5(레이드 5)"는 복구기능이 있기에 간단히 추가가 됩니다.
"mdadm --detail /dev/md5"로 확인해 보시면
위 사진처럼 다시 원상복귀가 된걸 볼 수 있습니다.
이렇듯 RAID의 복구 기능은 단순히 고장난 디스크를 제거하고, 새로운 디스크를 끼어넣기만 해도 복구가 된다는 걸 지금까지 확인한 겁니다.
'그럼 md0은 어떻게 해요?'
어떻게 하긴요~ /etc/fstab에서 지우고, 마운트 해제하고, 레이드 정지하고, 슈퍼블록 지우고, 새로운 RAID를 만들어야죠~
xi) RAID 10
복구가 제대로 됐는지 확인하려면 데이터가 있어야 하지 않겠습니까?
저희는 RAID 0과 RAID 5로 실험을 할 것이기 때문에 /raid0과 /raid5의 디렉토리에
큰 용량의 파일을 넣어보겠습니다.
혹자는 '파일을 만들면 안되나요?' 라고 하실 수 있는데, RAID개념 포스트에서 다뤘다시피
striped 방식은 512KB의 청크사이즈로 나눠 저장하기에 512KB보다 큰 파일을 넣어야
복구가 제대로 됐는지 확인 할 수 있습니다.
저희는 명령어 find를 배웠기에 512KB보다 큰 사이즈의 파일을 찾아서 복사 해넣으면 되는데, 아직 안 보시고 오신분들을 위해 제가 하나 찾아놨습니다.
"/var/log/messages" 파일을 복사해서 "/raid0"과 "/raid5"에 넣어주세요
잘 복사된 모습입니다.
이제 RAID 0, 5의 디스크를 하나씩 제거할 것인데, 잘못 제거하면 안되니 순서를
확실히 하고 갑시다.
RAID 0은 "/dev/sdc1(0:2)과 /dev/sdd1(0:3)"로 이루어졌었고
RAID 5는 "/dev/sdi1(0:9)와 /dev/sdj1(0:10), /dev/sdk1(0:11)"로 이루어졌었죠
sdd1(0:3)과 sdk1(0:11) 디스크를 제거하겠습니다.
centos를 먼저 종료한 뒤, 디스크를 제거해야 합니다.
삭제하기 전에 꼭 "Advanced.."를 누르셔서 확인을 하셔야 합니다.
확인을 해서 0:3과 0:11을 제거하시고
이렇게 제거한 다음 "ok"를 누르고 나가셔서 다시 리눅스를 켜줍니다.
다시 켜서 확인해보니, 복구기능이 없는 "/raid0"은 그냥 데이터가 사라져버렸고,
복구기능이 있는 "/raid5"는 아직 그대로 남아있네요
"--detail" 옵션으로 raid0을 확인해보니, 아예 "inactive", 즉 비활성상태가 됐네요
당연히 디스크 2개중 하나 /dev/sdd1은 사라졌고요
비활성상태가 됐다는 건, 결국 마운트도 끊어졌다는 이야기입니다.
"df -l"로 확인해보니 /raid5는 있는데 /raid0은 안보이죠
저희 예상은 볼 수 없는 절반크기의 파일이 있었을거라 예상했었지만
마운트가 끊어졌기에 "/raid0" 디렉토리에 아무것도 없었던 겁니다.
그에 비해서 복구기능이 있는 RAID5는 어떨까요?
inactive가 아닌 여전히 "clean"상태네요 물론 옆에 "degraded(구성요소가 바뀐)"이
붙어있지만요 그래서 마운트가 여전히 되어있던 겁니다.
그리고 당연히 디스크하나가 "removed"로 제거됐다고 뜹니다.
이렇게 파일의 끝 내용만 읽는 "tail"명령어를 이용하니 정상적으로 파일을 읽을 수
있고요, 즉 멀쩡하다는 것이죠
자 그럼 우리 이번에는 기존의 레이드볼륨에 디스크를 추가하는 mdadm의 "--add" 옵션
를 한번 써보겠습니다.
다시 리눅스를 종료하신다음, 1GB크기의 SCSI 디스크를 2개 추가해줍니다.
이렇게 말이죠
그리고
"Advanced"를 눌러서 확인해보시면 빈 공간에 자동으로 순서있게 디스크가 채워진 걸
볼 수 있습니다.
즉 저희가 추가한 디스크 2개는, 순서대로 "0:3과 0:11"에 들어갔을 겁니다.
다시 리눅스를 켜줍니다.
"--detail"로 확인해 보시면
여전히 디스크는 없어진 상태입니다. 이제 여기서 "--add"를 쓰는 겁니다.
물론 새로운 디스크를 추가했기에 다시 레이드용 /dev/sdd1 과 /dev/sdk1 파티션을 만들어줘야겠죠? "fdisk /dev/sdd", "fdisk /dev/sdk"를 하여 얼렁 만들어줍니다.
그리고 나서 "mdadm [레이드 볼륨] --add [추가할 디스크]" 해줍니다.
보시면 "md0(레이드0)"은 복구기능이 없기에 추가가 안됩니다.
하지만 "md5(레이드 5)"는 복구기능이 있기에 간단히 추가가 됩니다.
"mdadm --detail /dev/md5"로 확인해 보시면
위 사진처럼 다시 원상복귀가 된걸 볼 수 있습니다.
이렇듯 RAID의 복구 기능은 단순히 고장난 디스크를 제거하고, 새로운 디스크를 끼어넣기만 해도 복구가 된다는 걸 지금까지 확인한 겁니다.
'그럼 md0은 어떻게 해요?'
어떻게 하긴요~ /etc/fstab에서 지우고, 마운트 해제하고, 레이드 정지하고, 슈퍼블록 지우고, 새로운 RAID를 만들어야죠~
xi) RAID 10
레이드 개념 포스트에서 배웠었죠? "RAID10"은 RAID 1을 만든 뒤, 그것들 다시 RAID 0으로
묶는거라고 말이죠~
새로운 디스크 추가하기 귀찮으니 저희는 기존에 만들어 두었던
"RAID 0"과 "RAID 1"을 제거하고, 2개씩 RAID 1로 묶고 묶은 걸
RAID 0으로 다시 묶겠습니다.
1. /etc/fstab 파일을 열어서 RAID 0과 1을 지운 다음
2. "umount /dev/md1" 또는 "umount /raid1" 을 해줍니다.
3. "mdadm --stop /dev/md{0,1}" 을 해주시고
4. "mdadm --zero-superblock /dev/sd{c1,d1,e1,f1}" 을 해줍니다.
위 4단계를 하신 다음 다시 RAID 1을 2개 만들어 줍시다
mdadm --create /dev/md10 --level=1 --raid-devices=2 /dev/{sdc1,sdd1}
mdadm --create /dev/md11 --level=1 --raid-devices=2 /dev/{sde1,sdf1}
이렇게 말이죠 그런데 만약
mdadm: super1.x cannot open /dev/sdf1: Device or resource busy
mdadm: /dev/sdf1 is not suitable for this array.
mdadm: create aborted
이렇게 특정 파티션이 바쁘다며, 레이드에 적합하지 않다고 뜨신다면
sgdisk -Z [특정 파티션] 이렇게 하신다음 재부팅을 해주세요
그리고 다시
mdadm --create /dev/md11 --level=1 --raid-devices=2 /dev/{sde1,sdf1}
이렇게 하시면 되실겁니다.
"cat /proc/mdstat"으로 확인해보시면
네 이렇게 현재 md10, md11 이렇게 RAID 1 두개가 만들어졌습니다.
이제 다시 RAID 0으로 두개를 묶어줄 겁니다. 어떻게? 아주 간단해요!
원래 디스크 파티션을 적던 공간에 레이드볼륨을 넣어주면 됩니다.
mdadm --create /dev/md100 --level=0 --raid-devices=2 /dev/{md10,md11}
이렇게 말이죠
네 잘 만들어진 걸 볼 수 있습니다.
"cat /proc/mdstat"으로 확인하면 RAID 0이라고 나오지만 말이죠 ㅋㅋ
"--detail"로 확인해도
디스크 이름이 md[숫자]로 된건 말곤 달라진 게 없습니다.
생각보다 되게 쉽죠?
오늘도 진~~~~~~~~짜 긴 글이 됐네요... 읽느라 고생하셨습니다!!
사실 이 포스트에 RAID6에 리눅스를 설치하기도 같이 하려고 했는데, 그러면 너무 길어져서 그건 다른 포스트에 쓰기로 했습니다.
제가 힘들게 쓴 만큼(매일 10시간 이상 3일동안) 꼭 도움이 됐길 바래요 ㅠㅠ
도움이 되셨다면, 따뜻한 댓글 달기, 팔로우, 좋아요 클릭 부탁합니다!
정말로 여러분의 성원은 저에게 다 느껴지고 그만큼 보람을 느끼고, 큰 힘이 되어 포스트 퀄리티를 높이는데 도움이 됩니다!
그럼 다음에 더 좋은 퀄리티의 포스트로 뵙겠습니다!
이해하기 쉽게 잘 정리해주셨네요. ㅎㅎ 많은 도움받고갑니다. 감사합니다.
답글삭제도움이 돼서 다행입니다!!!
삭제와 정말 다른글도 그렇고 너무 알아듣기 쉽게 구체적으로 정리해주셨네요 항상 여기서 많이 배워갑니다
답글삭제도움이 돼 다행입니다!!
삭제다른거 보고 3시간 해맸는데 이 방법으로 하니 바로 됐습니다! 정말 감사합니다!
답글삭제도움이 돼 다행이네유!!!
삭제진짜 이해가 쏙쏙 박히게 잘 설명해 주셨네요. 감사합니다.
답글삭제제 노력이 도움이 돼 다행입니다!! 따뜻한 댓글 감사합니다~
삭제