}

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 시스템 해킹 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate using chrome ↓↓↓===***===>

2019년 12월 27일 금요일

와이어샤크 error opening adapter나 인터페이스를 찾지 못할 때 해결법


안녕하세요~ 마무입니다.

제가 "와이어샤크" 업데이트를 했더니 갑자기 인터페이스를 찾지 못하는 증상이 생기고,
"와이어샤크"와 "Npcap"을 삭제하고 재설치했는데도 인터페이스가 안뜨며,

그나마 하나 뜨는 loopback adapter를 사용하려 하면 "error opening adapter"라고 떠서
멘붕이 왔을 때, 겨우 해결을 했거든요 그 해결 방법을 알려드릴려고 합니다.

일단 저 같은 경우가 아닌 와일드샤크 에러의 해결방법을 알려드릴게요.

와일드샤크 에러 첫 번째 이유, "관리자 권한이 없어서"

해결 방법은 매우 간단합니다. 그냥 와이어샤크를 우클릭해서 '관리자권한으로 열기'
하시거나




이렇게 사진처럼 와이어샤크를 우클릭한 뒤 --> 속성에 들어가서--> 호환성을 클릭한다음
"관리자 권한으로 이 프로그램 실행"을 체크해 주시면 됩니다.

와일드샤크 에러 두 번째 이유, 와이어샤크와 같이 작동하는 프로그램 "Winpcap"이나 "Npcap"에서 문제가 생긴 경우

와이어샤크 프로그램이 제대로 실행되기 위해선 "Winpcap"이나 "Npcap"이 필수적으로
있어야 하거든요?

그런데 업데이트나 어떤 사건으로 인해 이 프로그램들이 애매하게 삭제가
되면 에러를 일으킵니다.

요즘은 Winpcap보다 "Npcap"을 많이 쓰기에, 와일드샤크를 설치하면 자동으로
Npcap도 같이 설치가 되는데 앞서 말한 에러가 있기에 자꾸 Npcap이
제대로 재설치가 안 됩니다.

이런 경우 제어판에 들어가 와일드샤크만 삭제하지 마시고
"Npcap"나 "Winpcap"도 있나 확인한 다음 있으면 모두 삭제한 다음 
다시 와이어샤크를 재설치를 해주세요

그리고 재설치할 땐 그냥 다음다음만 눌러주세요~ 디폴트로 되어있는 세팅대로
설치해야 문제가 안 생깁니다.

여기까지만 해서 문제가 해결되면 좋겠지만...
이렇게 한 뒤 재부팅까지 했는데도 문제가 해결이 안 될 수도 있습니다...

이런경우 어쩔 수 없어요 그냥 "Winpcap"를 추가로 설치한 다음 사용하시면 됩니다.
저는 위의 과정을 모두 다 하니까 문제가 해결이 되더라구요
여러분들도 꼭 문제가 해결되길 바라겠습니다!

도움이 되셨으면 따듯한 댓글, 팔로우 해주시면 정말 감사합니다!
더욱 도움 되고, 퀄리티 좋은 블로그 포스팅으로 보답하겠습니다!







2019년 12월 19일 목요일

리눅스 find 매우 자세히!

안녕하세요 마무입니다~오늘 배울 "리눅스 find 명령어"라는 명령어는 영어 뜻 그대로 "파일을 찾는 명령어" 입니다.
그리고 "리눅스 와일드카드"와 "리눅스 따옴표", "리눅스 특수기호"에 대해서도 매우 자세히 다룰 예정입니다.

당연히 실제로도 리눅스 내에서 정~말 자주 사용되며, 그렇기에 반드시 알아야 하는
그런 명령어라고 할 수 있습니다!

오늘 여려분들이 이 포스트를 다 읽으면, 명령어 "find"에 대한 거의 모든 의문이 사라지며여러분들이 못 찾는 파일이 없어질 것입니다!

백문이 불여일견! 긴 말이 필요 없겠죠? 바로 목차 알려드리겠습니다!


--목차--

1. find [장소] {[조건] [조건 값]}.....

2. -name ['찾을 이름']
   i) 와일드카드( *, ?, [], {} )의 의미
   ii) ' ', " "(작은, 큰 따옴표, single, double quotes)의 의미와 쉘의 명령어 처리 순서
   iii) 왜 와일드카드를 사용할 때 따옴표를 같이 안쓰면 오류가 발생하는가?

3. -user [찾을 소유자이름], -ls(우리가 아는 ls)

4. -group [찾을 그룹소유자 이름]

5. -type [찾을 파일 타입]

6. -size [+-(이상, 이하)크기(c, k, M)]

7. -newer [파일이름]

8. -empty

9. -perm [-찾을 권한번호이 포함된 파일]

10. -exec [명령어] {} \;
     i)  -exec 에서 왜 []를 못 쓰는가
     ii)왜 ";"가 아닌 "\;"인가?

11. find -ok [명령어] {} \;

---------
입니다.

여기서 못 찾은 정보는
운영체제 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_14.html
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
에서 찾아보세요!




1. 리눅스 find 형식



제일 먼저, "find"의 명령어 형식은
"find [파일을 찾을 장소] {[조건] [조건 값]}..... "
입니다.

물론 원랜 "조건"이 아니라 "표현식" 이라 하는데, 저는 표현식이라고 하면 잘 안외워지고 어색하기에 "조건"으로 바꿔서 외웠고 이 포스트에서 "조건"이라 표현할 것입니다.

제 포스트들에서 자주 등장하는 표현중 하나인,  "....."은 앞에 내용 "{[조건] [조건 값]}"원할 시 반복해서 더 넣을 수 있다는 입니다.

"조건"이라는 것은 이제 제가 붙인 이름인데, "-name", "-user"와 같은 형태를 가리키는 말입니다. 보통 "-name(이름이 ~~인)" "-user(소유자가 ~~인)" 이런식으로 생각하시면 사용하기 편합니다.

"조건 값"이라는 것은 앞의 조건에 해당하는 값들을 말합니다. 예를 들자면 조건이 "-name(이름)"같은 경우, 뒤에 오는 "조건 값"은 "파일이름"일 것이고, "-user(소유자)"같은 경우 "조건 값"이 "유저 이름"이겠죠

그런데 중요한 건, 리눅스 명령어에서 "옵션"은 순서가 중요하지 않았지만 "find" 같은 명령어에서 사용하는 이런 "조건"은, 앞에서부터 순서대로 처리 합니다.

앞에서부터 처리한다는 걸 예시를 통해 설명해볼게요.

find / -type d -name '?ab?' -ls -exec rm -r {} \;
이렇렇게 "find"명령어를 쳤을 때 실행되는 순서는

(파일을 찾겠다) (/에서) (타입이 디렉토리이고) (이름은 4글자 중 가운데가 ab며)
(앞의 결과를 "list" 형태로 보여주고) (그 결과 나온 파일들을 하위 파일까지 지워라) 

이런 식으로 앞에서부터 처리가 된다는 겁니다. 그래서 조건이 앞에서부터 실행이 되니, 자기가 찾고싶은 파일을 찾을 때 조건 순서를 잘 고려해야 합니다.

아 물론 "-exec rm -r {} \;"은 뭔가요?? 
라는 질문이 바로 생각나실 겁니다.

저거는 제가 이름 붙인 거지만, 명령어를 실행하는 "명령 조건"이라고 합니다. 앞서 조건들로 찾은 파일들에게, 어떤 명렁어를 추가적으로 실행하고 싶은 경우 사용하는 조건들이죠.

꼭 써야할 필요는 없지만, 쓸 경우 말했다시피 "찾은 파일"에 대해서 명령어를 수행하기 때문에 조건들 중 맨 마지막에 써야합니다.

이건 이따가 자세히 다룰 것이므로, 여기서 심각하게 생각하실 필요 없어요~
알고보면 그리 어렵지도 않고요! 마음 가볍게 하고 이제 본격적으로 조건들에 대해서
알아보겠습니다!





2. find -name ['찾을 이름']


자 이제 본격적으로 "find"명령어를 사용하려면 조건을 알아야죠?

제일 먼저 배울 조건은 가장 많이 사용하는 "-name"으로 영어 name(이름)에 걸맞게, 뒤에 "조건값"으로 적은 "이름"과 매치되는 파일을 찾습니다.

-형식-

-name [파일이름]


 



이렇게 "find(찾겠다) /(최상위 루트디렉토리에서) -name(파일 이름이) a(a인 것을)" 하니 "a"라는 이름을 가진 파일이 나오죠?

이런 식으로 "정확한"이름을 알고 있어서 파일을 찾을 수 있다면 이렇게만 써도 됩니다만,
실제로 저희는 무언가를 찾을 때는 정확히 이름을 다 아는 경우가 적잖아요? (엄청나게 긴 이름의 파일들도 많으니까..)

그래서 전체 이름을 모를 때, 파일을 찾기 위해 사용하는 것이 바로 "와일드 카드" 입니다.

 i) 리눅스 와일드카드( *, ?, [], {} )의 의미 


"와일드카드(wildcard)"
란 "될 수 있는 값이 여러 개인 것"이란 뜻으로 사용이 됩니다.

트럼프 카드게임 종류에서, 모든 카드로 사용이 가능한 조커"와일드카드"라고 하며

저희들이 대부분 즐겨하는 리그오브레전드의 "트위스티드 페이트"란 캐릭이 사용하는 "W"스킬 (파랑, 빨강, 노랑 중 하나로 바뀔 수 있는)의 이름도 "와일드카드"죠.

이처럼 "와일드카드""될 수 있는 값이 여러 개인 것"이란 의미로 저희 삶 곳곳에서
사용이 되는데요, 당연히 일상 뿐만 아니라 컴퓨터 공학에서도 사용됩니다. 바로 무언가를 검색할 때, 더욱 빠르고 수월하게 검색하게 해주는 역할 말이죠.

물론 여기서 "될 수 있는 값이 여러 개인 것"이란 의미가 어떻게 "검색을 더 빠르게 해주는 역할"로 바뀌어 사용이 되는 지 의문이 들 것 입니다.

예시를 들어 대답하자면, 저희들이 가장 흔히 볼 수 있는 와일드카드엔 "모든 값"이란 의미의 "*"이 있는데, 저희들이 평소에도 많이 사용해 왔었죠?(ls /dev/sd*와 같이)

이 "모든 값"이란 건 "될 수 있는 값이 여러 개인 것"이기에 가능했던 일이 아닙니까? 그래서 이런식으로 "모든 값"의 의미를 가진 "*"도 와일드카드 범주에 들어가는 것이고, 원랜 파일 이름 하나하나 적어서 명령어를 수행하거나 찾아 오래걸릴 것을, "모든 값"이란 "와일드카드, *"를 사용하면 더욱 쉽고 빠르게 수행(검색)할 수 있죠.

그래서 "될 수 있는 값이 여러 개인 것"이란 "와일드카드"란 개념이, 무언가를 검색할 때 더욱 빠르고 수월하게 해주는 역할이라고 했던 것입니다.

마찬가지로 "*"뿐만 아니라 "될 수 있는 값이 여러 개인 것" 의미를 가진 기호들은 모두 "와일드카드"라고 보시면 되고, 무언가를 검색할 때 수월하게 해주는 역할이라는 것을 아시면 됩니다.

자 그럼 이런 "될 수 있는 값이 여러 개인 것"인 와일드카드에 무엇이 있는지 알아볼까요?

"*" : "모든"이란 의미를 가지고 있습니다.

--예시--
'ade*' = ade로 시작하는 모든 파일
'*ade' = ade로 끝나는 모든 파일
'a*b' = a로 시작해서 b로 끝나는 모든 파일

--------------------------------------------------------------------------------------------


"?" "모든 한 글자"란 의미를 가지고 있습니다.
낯선 기호라 감이 잘 안오실텐데, 그냥 "?" 한 자리에 들어갈 수 있는 모든 글자라고 보시면
됩니다.

--예시--
'??a??' = 총 5글자인데 가운데가 a인 모든 파일
'bd?' = bd로 시작하는 모든 3글자 파일(ex: bda, bdb, bdc, bdd,...bd1, bd2,... bd_,..)
'?bd' =  bd로 끝나는 모든 3글자 파일

--------------------------------------------------------------------------------------------


"[]" : "[]안에 있는 모든 한 문자"란 의미를 가지고 있습니다.(될 수 있는 값이 여러 개)
이것도 말로는 감이 잘 안오실텐데, 예시를 보시면 감이 오실 겁니다.

--예시--
'[.abc,]' = . a b c ,
'[de]a[cf]' = dac daf eac eaf
'[*]a' = aa, ba, ca,...,1a, 2a,....Aa,..., .a, ...

"[ab]" 이렇게 쓰면 될 수 있는 값이 "a", "b"로, 한 개가 아니죠? 그래서 와일드카드!

-------------------------------------------------------------------------------------------


"{}" : "{}안에 있는 모든 한 단어"란 의미를 갖고 있습니다. (될 수 있는 값이 여러개죠?)
참고로 []는 문자 단위로 취급하고{}는 단어 단위로 취급한다는 것이 차이점입니다. 

차이점을 와닿게 하기 위해 예시를 들어볼게요!

[a,b,cde] = , a b c d e
{a,b,cde} = a b cde

이렇게 보니 "문자 단위로 취급하는 대괄호"와 "단어 단위를 취급하는 중괄호"의
차이가 느껴지시나요?

대괄호와 중괄호의 차이점을 알았으니 이제 중괄호만의 예시를 통해
중괄호의 특징을 한번 보겠습니다.

--예시--

a{0,4,3} = a0 a4 a3
a{0,1}b = a0b a1b
a{0,1}{1,2,3} a01 a02 a03 a11 a12 a13
touch /home/mamu/{ab, ad}  touch /home/mamu/ab, touch /home/mamu/ad

아 그리고 추가로 알아야 할 중괄호{}의 특징이 한 가지 더 있습니다.

위에서 말했다시피 "중괄호{}"는 단어 단위로 구분을 하는 기능이기에
"{abc}"처럼 단어 하나만 들어있거나, {}처럼 아무것도 안 들어있는 경우,
"중괄호{}""아무런 기능이 없는 문자 {}"로 취급이 됩니다.

무슨 소리냐면

"touch {abc,def}"같이 중괄호 안에 단어가 여러 개 "abc" "def"란 2개의 파일을
만들지만,

"touch {abcdef}"같이 중괄호 안에 단어가 하나라면, "{abcdef}"와 같이 중괄호를 포함한 이름의 파일을 하나 만듭니다.

"touch {}"같은 경우도 위 사례처럼, 그냥 아무의미 없는 문자로 취급돼 "{}"란 이름의 파일이 만들어집니다.

-------------------------------------------------------------------------------------------


대표적으로 파일을 찾을 때 사용되는 와일드카드들은 이 정도 있습니다.

물론 여기서 맹점이 있으니.. 그것은 바로
find -name 명령어에서 와일드카드를 사용할 시 무조건 '나 "를 같이 사용해야 한다는 것

눈치가 빠르신 분들은 위에서 제가 와일드카드 예시를 보여드릴 때
모두 '[글자들]'와 같이 ' '를 사용한 것을 보셨을 겁니다.
권유가 아니라 반드시 와일드카드를 find에서 쓸 시 ' "를 붙여야 하는게,
안 붙일 시 잘못 된 값이 나오거나 에러가 뜹니다.




이렇게 말이죠. 자 그럼 어떤 원리로 이런 에러가 발생하는 지, 또 왜 '와 "를 써야하는 지
설명해 드리겠습니다!


ii) ' ', " "(작은, 큰 따옴표, quotes)의 의미와 쉘의 명령어 처리 순서 


일단 에러 발생원리를 이해하려면 "따옴표(quotes)의 의미"와 "쉘의 명령어 처리 순서" 를 알아야 합니다. 그러니 이해하고 알아보겠습니다.

제일 먼저, ' '(single quotes) 한국말로 "작은 따옴표"죠?
' '를 이용해 리눅스에서 문장을 감쌀 시, 감싸진 문자들은 모두 
에서 "아무런 의미도 없는 일반 문자 취급"합니다 ex) '*abv' : 그냥 이름이 *abv란 파일

무슨 소리냐면, '로 문자들을 감쌀 시, 앞서 설명한 "와일드카드"나 아직은 안 배운
"환경변수를 호출하는 $"와 같은 , "기능을 가진 모든 기호"들을 쉘에선 그냥 순수한 문자 취급한다는 것이죠.

아직은 안 배웠지만 명령어를 찾는 경로가 등록된 "PATH라는 환경변수"
예시로 든다면




이렇게 그냥 "$"기호 없이 환경변수 PATH를 쓰면, "echo"명령어가 환경변수 PATH가 아닌 그냥 순수한 문자 "PATH"로 인식합니다.





하지만 $PATH처럼 환경변수 호출 기능을 가진 기호 $를 붙이니, "echo"명령어가 "환경변수 PATH"로 인식하죠.

그런데 사실 이 과정은 "echo"가 환경변수를 인식한게 아니라 "쉘"이 환경변수를 인식하고 치환한 값을 "echo"가 넘겨 받은 것이였습니다. 그 과정을 좀 더 자세히 말하자면 이렇게 됩니다.

리눅스 쉘 해석 순서 

1. 쉘(shell)이 띄어쓰기를 보고 단어들을 인식한다

2. 쉘이 단어들 중 와일드카드나, 환경변수, 특수기호가 있나 명령어를 확인한다


3. 쉘이 환경변수 호출기호 "$"가 붙은 "PATH"가 환경변수라는 것을 인식


4. 환경변수에 "PATH"라는 것이 있나 확인하고, 찾을 시 "환경변수 PATH의 값"을 "$PATH"대신 넣음


5. 명령어 "echo"를 실행하고, 명령어 "echo"는 치환된 "환경변수 PATH의 값(/usr/local/bin:/bin:/bin:.......)"들을 인식하고 그대로 화면에 출력함

이런식으로 쉘은 와일드카드나 환경변수, 특수 기호를 먼저 처리를 한 뒤에,
명령어를 처리한다는 것인데 

이걸 설명한 이유는 '나 "를 안 붙일 시 에러가 발생하는 게 바로 이 쉘이 명령어를 해석하는 순서 때문에 생기는 거라서 그렇습니다. 좀 더 자세하게는 "iii)"에서 알려드리겠습니다!

계속해서 이번엔 '$PATH' 와 같이 '따옴표'를 붙이면 어떻게 바뀌는 지 봐볼까요?





이렇게 ' ' 를 붙이니 "쉘"이 "$기호"를 인식을 못했기에, "echo"는 순수하게 문자 그대로의 "$PATH"로 인식하고 화면에 출력한 것을 볼 수 있습니다.

이렇듯 작은 따옴표(single quotes)쉘이 의미있는 기호를 그냥 문자로 
처리하게 만듭니다.

그렇다면 바로 또 궁금한 게 생기죠 바로 비슷하게 생긴 "큰 따옴표"는 작은 따옴표와 뭐가 다르냐? 라는 의문이 말이죠!

큰 따옴표 " "(double quotes)같은 경우엔 작은 따옴표 ' ' 와 다르게 "$(dollar), `(back quote 또는 grave), \(escape)"만 쉘이 처리할 수 있게 합니다.

""로 문자를 감싸면 $PATH와 같은 "환경변수"나 "`, \"가 붙은 문자들은 쉘이 인식할 수 있다는 것이죠.

큰 따옴표가 허락하는 이 기호들($ ` \)의 특징은 바로 변수들을 사용할 때 사용하는 기호들이라는 겁니다. 쉘 프로그래밍을 안 배운 저희들 입장에선 이 정도만 알고 갑시다~





이렇게 큰 따옴표(")작은 따옴표(')와 다르게  쉘이 $(dollar)가 붙은 환경변수를 인식하게 해주죠


그럼 이번에 와일드카드로도 한번 실험을 해볼게요





이렇게 기존에 와일드카드 "*"를 사용할 시, 쉘이 와일드카드를 명령어 "echo"보다 먼저
인식하여 처리해, "a, ab, ac, ad" 와 같이 제가 만들어 놓은 "a로 시작하는 파일의 이름들"을 "a*" 대신 넣습니다.

그리고 나서 "echo"를 실행하니, 그 파일 이름들(a, ab, ac, ad an...)을 "echo" 명령어가 인식하여 그대로 출력한 것이죠

하지만




이렇게 "a*"처럼 큰 따옴표를 붙이니, 쉘이 와일드카드를 인식을 못하고 "echo"에게 그대로 a*를 넘깁니다. 그래서 "echo"는 a*이라 출력을 한 것이죠.

여기까지 "큰 따옴표"는 "$(dollar), `(back quote 또는 grave), \(escape)만 쉘에게 허락한다는 것을 알려드린 겁니다.

이렇게만 보면 "큰 따옴표"는 되게 복잡하고 짜증나는데, 큰 따옴표의 진가는 여러분들이 쉘 스크립트(코드)를 짤 때 느낄 수 있을거에요 ㅎㅎ

자 되게 길게 이야기 했는데, 그럼 이제 본격적으로 왜 find -name에 '"를 써야하는 지
설명하겠습니다!



iii) 왜 와일드카드를 사용할 때 따옴표를 같이 안쓰면 오류가 발생하는가? 


일단 증상을 보기 위해, '와 "를 사용하지 않고 와일드카드를 이용해 파일을 찾아볼게요





주황색 1번으로 표시한 와일드카드 * 같은 경우 따옴표가 없으니 에러가 납니다.

그 다음 초록색 2번으로 표시한 와일드카드 ? 같은 경우에도 따옴표가 없으니 에러가 나죠.

하지만 파란색 3번으로 표시한 와일드카드 [] 같은 경우 에러가 안납니다.
같은 와일드카드인데 왜 어떤 건 되고 어떤 건 안될까요?

그 이유는 바로 제가 앞에서 설명한 "쉘"의 명령어 처리 순서 때문입니다. 한번 위의 와일드카드들을 정밀하게 분석해볼게요!

1번 주황색 *인 경우,




이렇게 현재 디렉토리에 a로 시작하는 파일들이 2개 이상입니다. 이게 에러의 원인이 된겁니다.

무슨 소리냐면 "-name" 조건은 "조건 값"을 1개 밖에 못 받습니다. 

하지만 저희가 find / -name a* 와 같이 따옴표 없이 와일드카드를 쓸 경우 쉘은 와일드카드를 제일 먼저 처리하여 현재 디렉토리 내 "a로 시작하는 모든 파일들의 이름"을 "a*" 대신 넣고 find / -name 명령어를 실행합니다.

즉 find / -name a* 라고 칠 경우 이건 find / -name a ab ac ad anaconda-ks.cfg 이렇게 바뀌어 처리되는 것이죠.

그래서 당연히 "-name 조건 값"이 "여러개"니까 에러가 난 것입니다.

같은 원리가 초록색 2번인 와일드카드 ?에도 적용이 되어 에러가 난 겁니다.






이렇게 현재 디렉토리 내에 "a로 시작하는 2글자 파일"이 여러 개여서 이 명령어 "find"보다 "와일드카드 ?"을 먼저 처리하기에 find / -name a? 이 아니라 find / -name ab ac ad 로 처리가 되어 조건 값이 여러개라 오류가 난 것이죠.

반면에 파란색 3번인 와일드카드 [] 인 경우





참고로 [a-d]처럼 대괄호와 "-"를 같이 쓰인 경우에는 "a부터 d까지"란 의미가 있습니다.
즉, [a-d]는 "a b c d" 인 것이죠! 그냥 그런게 있구나~ 하고 넘어갑시다. 이런 기호들의 특징들은 다른 포스트에서 집중적으로 다루겠습니다!

자 다시 돌아와 사진을 보시면 현재 디렉토리 내에 [a-d] 와일드카드에 해당하는 파일"a" 하나 뿐이라서

쉘이 와일드카드를 먼저 처리해도, -name 조건에 "a" 하나만 들어가기에 find / -name [a-d]find / -name a 와 같이 바뀌어서 문제 없이 잘 처리가 된 것이였습니다.

물론 에러가 안 난 것뿐이지 실제로 저희가 원하는 결과는 아니지만 말이죠 (우린 a가 아니라 리눅스 전체에서 a부터 d 이름의 파일들을 찾는 걸 원했기에)

자 그럼 저희는 이제 작은 따옴표(')와 큰 따옴표(")를 제대로 배웠기에 와일드카드를 제대로 사용하려면 어떻게 써야하는 지 이제 압니다.

네 그렇습니다.
1번인 경우 find / -name a* 가 아니라 find / -name 'a*' 또는 "a*" 로 해야하고
2번인 경우 find / -name a? 가 아니라 find / -name 'a?' 또는 "a?" 로 해야하고
3번인 경우 제대로 하려면 find / -name [a-d] 가 아닌 find / -name '[a-d]' 또는 "[a-d]"
를 쓰면 문제 없이 잘 작동할 겁니다.


1번인 경우 검색 되는 파일이 너무 많기에, 3번만 보여드리겠습니다.(2번은...?)


















따옴표를 붙이니 우리가 원하는 결과가 제대로 나왔죠?

자 여기까지 ii)에서 배운 "작은 따옴표와 큰 따옴표 의미, 그리고 쉘 명령어 처리 순서"
이용해 "iii) 왜 와일드카드를 사용할 때 따옴표를 같이 사용해야하는지" 를 이해한 겁니다.


와... 수 많은 조건들 중 하나 배우는데 왜 이렇게 긴지, 나머지는 어떡하냐 겁이 나시죠ㄷㄷ
걱정 마세요 "-name"만 진짜~ 긴 거고 나머지는 속전속결로 금방 끝날 겁니다!

물론 맨 밑쯤 "명령 조건"에선 다시 조금 길어지겠지만요 ㅎㅎ좀만 더 힘냅시다! 제 포스트가 길어서 읽기 힘드시겠지만 솔직히 다 읽는데 40분도 안 걸리잖아요~
(학원에선 3시간정도 배웁니다, 아니면 대충 명령어만 따라하고 1시간만에 끝나거나)

포스트 내용을 전부 안 읽고, 명령어 형식과 조건만 대충 따라만 하고 넘어가신다면, 여러분들은 원리를 모르기에 자꾸 까먹고, 이후 "find"명령어 뿐만 아니라 다른 명령어, 쉘, 쉘 스크립트, 시험 준비과정에서 궁금한 게 끝도 없이 생겨나서 결국 이 포스트로 다시 돌아오시게 될 겁니다 ㅎㅎ

그러니 이번에 확실히 한번에 끝내고 간다고 생각하고 힘내서 읽어보자구요!
(물론 인간의 뇌는 한번만에 전부 외울 순 없지만요 핳핳)




3. find -user [찾을 소유자]




"-user" 조건은 영어 "user"의 뜻처럼, "조건 값"으로 "유저의 이름(소유자 이름)"을 
넣습니다.  





자 이렇게 "find / -user mamu" 라고 치니 소유자가 "mamu"인 파일들이 모두 나옵니다.
물론 이렇게만 보면 제대로 검색이 된 건지 모르죠?

그래서 저희는 바로 "-ls"라는 조건을 또 배우고 같이 사용해 볼겁니다.

"-ls(list)"우리가 아는 그 명령어 "ls(list)"와 같은 의미의 조건입니다. 그런데 이건 find 명령어용으로 만든 것으로, 굳이 말한다면 "ls"보단 "ls -l"와 비슷합니다. 

또한 이 조건 "-ls"는 우리가 아는 "ls" 명령어처럼 옵션을 넣을 수 가 없습니다.. 그래서 이걸 쓰는 것보단 나중에 "명령 조건"에서 ls를 쓰는 것도 방법입니다

뒤에 "조건 값"을 넣을 필요 없는 조건으로, 앞의 조건이 검색한 파일들을 받아서 "ls"처럼 inode(자세한 정보들)을 보여줍니다.





이렇게 앞에서 했던 "-user mamu"에 "-ls"를 더해 검색하니 "inode"와 "inode번호"까지
나오며, 소유자 mamu 파일들이 잘 검색된 걸 알 수 있죠?





4. find -group [찾을 그룹]





"-group"이란 영어 group의 뜻처럼, "찾을 그룹의 이름""조건값"으로 넣습니다.






이렇게 뒤에 적은 그룹이 속한 파일을 찾습니다. "-ls"를 쓴 것은 이제 설명 안해도 되죠?





5. find -type [찾을 파일 타입]



"-type"란 영어 이름 대로, "조건 값""파일의 타입"을 넣습니다.
파일의 타입은 "파일과 디렉토리" 포스트에서 다뤘었죠?
(f{-},d,l,p,b,c,s)등등 말이죠
기억이 안나시거나 모르시는 분들은 보고 오시면 좋을 것 같습니다!
https://mamu2830.blogspot.com/2019/07/blog-post.html





이렇게 파일 타입중 블록파일(b)를 치니 블록 파일들이 잘 검색된 것을 볼 수 있습니다.
리눅스 운영체제는 파일크기를 "블록"이라는 최소 단위로 다룬 다는 것을
파일시스템 포스트에서 배웠었죠? 잘 모르시는 분들은
https://mamu2830.blogspot.com/2019/11/fdisk-df-etcfstab-blkid.html

보고 오시면 좋습니다~

일반 파일인 경우 "find -type"에서 찾을 때 "-"가 아닌 "f"를 써줘야 합니다~





6. find -size [+-(이상,이하)크기(c, k, M)]



"-size"도 이름 뜻대로, "조건 값""해당하는 크기의 파일을 찾는" 조건입니다.

"+""이상"이란 뜻으로 "-size +10M" 이렇게 하면 "10M이상의 파일"을 찾으란 겁니다.
"-""이하"라는 뜻으로 "-size -10M" 이렇게 하면 "10M이하의 파일"을 찾으란 겁니다.
물론 "+"나 "-" 중 아무것도 안쓰면 정확하게 뒤에 적은 사이즈 파일만 찾습니다.

그런데 여기서 정확한 사이즈의 파일을 찾고 싶으면 "바이트단위(c)"로 찾아야 합니다.
KB나 MB같이 단위가 들어간 경우, 정확한 파일만 찾는게 아니라 근삿 값까지 찾습니다.

파일의 사이즈의 단위는
c(Byte), k(KB), M(MB)가 있습니다만, "KB"는 "소문자 k"이고 "MB"는 "대문자 M"인지는 저도 잘 모르겠습니다.. 참 누가 만들었는지 ㅡㅡ...

일단 "Byte"소문자 "c"인 걸 외우는 방법은, 원래 "소문자 c"는 컴퓨터에서
"글자"를 뜻하는 "c(characters)"로 자주 쓰이거든요?

그리고 대부분 한 글자(character)2~4 Byte가 쓰입니다.
그리고 리눅스에서 "byte"단위같이 작은 용량이 쓰이는 경우는, 글자 외 거의 없습니다
(눈에 보이는 것들 중에선)

그러니 byte는 byte단위가 쓰일 만한 건 글자! c(character)! 이렇게 연상해서 외우시면
좋을 것 같습니다.


- 88byte 파일을 찾고 싶다? -
"find / -size 88c"





- 10MB 이상 파일을 찾고 싶다? -
"find / -size +10M -exec ls -lh {} \;"





명령 조건인 "-exec ls -lh {} \;"를 쓴 이유는 "-ls"는 보기 편하게 사이즈가 안나오기에
한 겁니다. 밑에서 설명할 것으므로 지금은 대충 넘어가 주세요!

- 10MB 이상이며 15MB 이하 파일을 찾고 싶다? -
"find / -size +10M -size -15M -exec ls -lh {} \;"






find(찾겠다) /(최상의 루트디렉토리에서) -size +10M(사이즈가 10M이상이고)
-size -15M(사이즈가 15M 이하인 파일을)

제가 말했던 것처럼 조건들의 순서만 잘 지켜주시면 어떻게 사이즈를 줘서 찾아야할 지
감이 자동으로 오실 겁니다 ㅎㅎ





7. find -newer [파일이름]



이것도 매우 쉽습니다.
"-newer"의 영어 new(최신의) + er(비교용 접미사) 뜻대로
"뒤에 적은 파일"보다 "더 최근에 만들어진 파일들"찾으라는 뜻입니다.

ex) "find / -newer [파일이름]"
이런식으로 사용하는 것인데, 아마 여러분들은 리눅스 시스템이 시간이 엉망이 되어있어서
이 명령어를 실행하면 원하는 값이 안나올 겁니다 ㄷㄷ

하지만 아직 제가 시스템 시간 맞추는 방법을 알려주지 않았다는 것...
이건 다음에 포스팅을 할 터이니 일단은 그런가보다~ 하고 넘어가주세요 ㅠㅠ





8. find -empty



"-empty(비어있는)"이란 뜻에 걸맞게 "아무것도 안 들어있는 파일을 찾는 조건"입니다.
일반 파일이라면 아무것도 안 쓰여있으니 크기가 0이고,
디렉토리 파일이라면 말 그대로 디렉토리만 있는 상태라 자체 크기 6바이트 크기입니다.

당연히 조건 값은 필요 없습니다!

이렇게 "find .("/"는 너무 파일들이 많기에) -empty -ls"하니




초록색으로 표시한 곳을 보시면 "d"라고 디렉토리라는 것을 알 수 있고 빈 디렉토리지만
디렉토리 자체의 기능때문에 6바이트 크기인 걸 알 수 있고

파란색 "-(f)" 일반파일인 경우 아무것도 안 쓰여있기에 0바이트인 것을 알 수 있습니다.





9. find -perm [권한 8진수]



"-perm(permissions)"도 영어 뜻 대로, 뒤에 적은 권한번호가 포함된 파일을 찾습니다.
저희가 권한공부를 할 때, 각 권한에 해당하는 번호를 외운 이유가 바로 이것 때문이였죠 !

여기서 중요한 것은 자기가 입력한 권한과 정확하게 같은 파일을 찾을거면, "-" 없이 
그냥 권한을 입력하면 되지만  ex) "find / -perm 0775 또는 775"

어떠한 권한이 포함된(특수권한 같은) 파일을 찾고 싶으시면 "-"를 붙여야 합니다. 
ex) "find / -perm -2000"처럼 말이죠.

권한번호는 제가 굳이 쓰지 않아도 되겠죠? 이걸 아직도 못 외웠다면 당신은
권한을 제대로 이해하고 배운 것이 아니라, 그저 따라하기만 했다는 것이죠!

권한이라는 것은 리눅스에서 매우매우매우매우매우 중요하니 꼭 배우고 오십쇼!

권한과 디렉토리 하위까지 권한 적용 : https://mamu2830.blogspot.com/2019/09/rwx.html
특수권한 : https://mamu2830.blogspot.com/2019/10/setuid-setgid-sticky-bit.html


-SetUID가 있는 파일들을 찾고 싶다?-
"find / -perm -4000 -ls "





-권한이 정확히 4750(rwsr-x---)인 파일을 찾고 싶다?-
"find / -perm 4750 -ls"






이런식으로 "-"를 붙일 지, 안 붙일지 생각하시고 사용하시면 되겠습니다




10. find -exec [명령어] {} \;

    

하.. 드..드디어 거의 끝에 다다랐네요! 지금부터 설명할 것은 제가
시작 부분에 살짝 언급했던 "명령 조건"들 중 하나인 "-exec(execute)" 입니다.

"execute""실행하다"란 의미대로 "뒤에 적은 명령어를 실행하라"는 조건입니다.

그래서 이론상으론 다른 조건들 처럼 "조건 값만 넣은 모습"인
"-exec [명령어(우리가 아는 터미널 명령어)]" 이렇게 사용할 수 있을 것 같지만

실제로 우리가 사용하는 명령어는 보통 단어가 여러개로 이루어져 있잖아요?
그래서 이 "명령 조건"은 특이하게 끝에  "\;" 넣는데 이건
"명령 조건"에게 "여기까지가 끝이야"를 알려주는 역할입니다.
원래 프로그래밍 언어에서 ;(세미콜론)은 끝이라는 걸 알려주는 역할이기 때문이죠.

그리고 "{}"란 앞서 "실행된 조건들에 의해 검색된 파일들"을 뜻합니다. 무슨소리냐
"find / -name 'abc*' -exec rm -rf {} \;" 이렇게 명령어를 쳤을 때,




위 그림처럼 "앞의 조건에서 검색된 파일들"이 "{}"안에 들어가서
"rm -rf"의 대상 파일이 된 것이죠.


자 그럼 왜 []가 아니라 "{}"를 쓰며, 또 ";"는 왜 \(역슬래쉬, 이스케이프)와 함께 써야하는 지 설명해드리겠습니다!


i)  -exec 에서 왜 []를 못 쓰는가 

왜 -exec에서 "[]"는 안되고"{}"는 되냐면  "2-i) 와일드카드"에서 설명한 것 처럼
"[]"는 문자 단위로 처리를하고, "{}"는 단어 단위로 처리를 하기 때문입니다.

-exec에 "{}"대신 "[]"를 넣었다고 가정해 봅시다.
그러면 앞의 조건들이 발견한 파일 이름들이 "[]"안에 들어간 다음
문자 단위로 나눠질 겁니다. 상상만 해도 끔찍하죠?

그래서 -exec나 -ok와 같은 명령 조건엔 "[]"를 못 씁니다.

또한 이런 질문이 있을 수 있죠. '왜 -exec의 {}는 따옴표와 함께 쓰이지 않나요?'라고
말이죠.

{}를 따옴표 없이 -exec에서 그냥 쓰는 이유
"아무것도 안들어있는 {}"와일드카드가 아니기에 "find"명령어와 같이 쓰여도,
"find"명령어보다 먼저 처리되지 않기 때문입니다.

그래서 "명령 조건에서의 {}"작은 따옴표나 큰 따옴표를 붙이지 않는겁니다.



ii)왜 ";"가 아닌 "\;"인가? 


;(세미콜론)이 여기까지가 끝이다라고 알려주는 건 알겠는데, 왜 그냥 ;를 쓰지 않고
\(이스케이프)를 붙여 쓰느냐?

그것은 아까 "2-ii) 쉘의 명령어 처리순서"와 관련이 있습니다.
"2-ii)"에서 쉘은 명령어보다 특수기호, 와일드카드, 변수를 먼저 처리한다고 했었죠?

그래서 ";"가 아닌 "\;"를 쓰는겁니다.

네? 좀 이해가 안된다고요?
다시 말해서 "\;"가 아닌 ";"로 쓰면 "find 명령어의 -exec가 처리하는 ;"가 아닌
"앞의 명령어를 처리했으면 뒤에 명령어를 처리하라는 의미"의 ";"가 된다는 겁니다.

기존의 리눅스 쉘에서의 ;(세미콜론)의 의미




위 사진처럼 "앞의 명령어를 처리한 뒤, 뒤에 명령어를 처리하란 의미"거든요.
그래서 "find -exec"에서 그냥 ;(세미콜론)을 쓰면 에러가 나는 겁니다.

그렇기에 \(이스케이프, 기존의 의미에서 빠져 나오겠다)를 ;(세미콜론)에 붙여서 
쉘이 먼저 처리하지 않게 하는 겁니다.


이 포스트를 잘 읽으신 분이시라면 또 다른 의문이 드실겁니다

바로 '나 "로 문자를 감싸면, 쉘에서 일반 문자로 취급한다고 했으니 ("는 $, `. \ 제외)
\(이스케이프) 문자 대신 '나 "를 대신 써도 되지 않을까??
라고 말이죠.

크으... 맞아요! 그렇게 해도 됩니다!!





사진에서 \에 묻혀 잘 안보지만. \; 로 할 때의 결과와




이렇게 작은 따옴표, 큰 따옴표로 했을 때와 같은 결과죠?

즉  \; 를 한 이유는 단지, 쉘에서의 ; 로 해석되는 걸 막기 위해서였다~ 입니다.




11) find -ok [명령어] {} \;



"-ok"는 "-exec"와 같은 명령 조건인데 "-exec"와 정말 사용방법이 똑같습니다.
단지 이름 "ok"뜻대로, 찾을 파일에 명령어를 실행할 때마다 확인을 구합니다.

"find / -name 'abcdef*' -ok rm -r {} \;" 이렇게 할 경우
검색된 "abcdef로 시작하는 파일들"을 삭제할 때마다 is ok? is ok? is ok? 물어보는 거죠





이렇게 명령어를 실행할 때마다 물어보는데, "y"나 "yes"를 하지않고
그냥 엔터를 누르면 실행이 안됩니다.

솔직히 삭제 명령어와 같이 위험한 행위를 할 땐, 아무래도 -exec보단 -ok를 쓰는게 더 
좋겠죠?

참고로 명령어를 실행할 때, 명령어의 강제 옵션 "-f"를 붙인 경우 형식상 
물어보기만 합니다.

그래서 만약 "-ok rm -rf {} \;" 이렇게 한 경우 "y"를 안해도 이미 파일들은
삭제가 된 상태라는 거죠(답장너 상황이랄까...)
이 점만 유의해주시면 될 것 같습니다!




와... 진짜 정말 빨리 끝날 줄 알았던 "find" 명령어 편이 3일이나 걸릴 지는 몰랐네요..
자꾸 예외가 발생해서 그 규칙을 찾느라 구글링하고.. 구글링 해도 안 나와서 결국
저 스스로가 몇 시간동안 연구하며 규칙을 발견하고 ㅠㅠ

힘든 만큼 꼭 도움이 되셨으면 좋겠고!! 오타나 잘못된 정보 발견시 댓글로 꼭 알려주세요~

도움이 되셨다면 따뜻한 댓글 부탁해요 !
정말 큰 힘이 되어 제가 더 퀄리티 좋은 포스트를 쓰게 만듭니다!





2019년 12월 10일 화요일

lvm 이란 매우 쉽게!

안녕하세요~ 마무입니다! 오늘은 드디어 "lvm 이란"에 대해서 배워볼 겁니다만, "lvm"의 개념을 먼저 설명하고 "lvm 설정", "lvm 확장", "lvm 삭제" 등을 하고 자세하게 개념을 설명할 겁니다!

당연히 이것을 완벽하게 이해하기 위해선 앞서 포스팅한 "마운트"개념을 알아야 하고요,
"파일시스템 개념"을 알고 있으면 이해에 더 좋습니다!

*이 글을 이해하기 위해 필요한 개념*
마운트 및 하드디스크 추가 :https://mamu2830.blogspot.com/2019/11/fdisk-df-etcfstab-blkid.html
파일시스템 : https://mamu2830.blogspot.com/2019/10/chs-lba.html


--목차--

1. LVM이란?? 왜 LVM을 쓰는 것이지?

2. 이미 리눅스에서 사용되고 있던 LV인 "/dev/sda2"

3. "PV(Physical Volume)", "VG(Volume Group)", "LV(Logical Volume)", "PE(Physical Extent)", "LE(Logical Extent)"란?
i) "PV(Physical Volume)", "PE(Physical Extent)"
ii) "VG(Volume Group)"
iii) "LV(Logical Volume)", "LE(Logical Extent)"

4. LVM관련 명령어들 "pv,vg,lv(create, scan, display, remove, extend, reduce)"
i) [pv, vg, lv]create
ii) [pv, vg, lv]scan, display
iii) [vg, lv]extend
iv) [vg, lv]reduce
v) [pv, vg, lv]remove

5. "centos VG"를 확장한 다음 "루트파일시스템의 LV"인 "/dev/mapper/centos-root"의 
크기를 확장해보자
i) XFS 파일시스템이 확장된 공간을 인식하게 해주는 명령어 "xfs_growfs"


---------

여기서 못 찾은 정보는
운영체제 독학:https://mamu2830.blogspot.com/p/blog-page_14.html
리눅스 독학:https://mamu2830.blogspot.com/p/blog-page_13.html
에서 찾아보세요!




1. LVM이란?? 왜 LVM을 쓰는 것이지?


자 리눅스의 "LVM(Logical Volume Manager)"이란 이름 뜻 그대로 Logical(논리적인) Volume(공간을) Manager(만들게 해주는{관리 해주는} 프로그램)입니다.

그럼 여기서 "엥? 우리가 평소에 디스크를 파티션을 나눈 것도 논리적으로 만든 것
아닌가요?"  라고 의문이 드실 수 있을텐데 "파티션"은 "논리적으로 만든 것"이라고
하긴 애매합니다.

과일을 예시로 설명해볼게요.

"파티션"이란 어떤 하나의 뭔가를 여러개로 나누는 개념으로, 수박 한 통을 여러 조각으로 짜르는 개념이라고 생각하시면 됩니다.  수박 한 통(디스크 하나)을 이제 원하는 크기의 여러 조각(파티션)으로 나누는 거죠.

우리는 이렇게 "나누는 행위""만든다"라고 표현을 하지 않잖아요?

하지만 "LVM"은 사과 하나, 바나나 하나, 먹다 남은 수박 몇 조각 등등 과일 여러개를
모두 한 그릇에 담아서 화채를 만들어주는 것과 같습니다. 여러개의 과일(디스크 공간)이나 짜투리 과일(짜투리 공간)을 합쳐서, 하나의 화채(LV)"만든 것"이죠

자 그럼 방금의 설명으로 "LVM"이란 기능을 언제 쓰는지, 왜 쓰는지, 어떻게 쓰는지
대충 감이 오실 겁니다. 그렇죠! 바로

1. 여러개의 디스크 공간을 합쳐서 하나인양 사용하기 위해

2. 사용하기 애매한 공간의 디스크 파티션(짜투리)들을 활용하기 위해

3. 기존에 사용중인 디스크의 공간을 확장할 수 있기에

크게 이렇게 볼 수 있겠습니다.

그런데 "디스크 공간을 합친다는 것"을, 이렇게 글로만 보면 이해가 될 듯~ 말~듯 싶으실 겁니다. 그래서 제가 밑에 그림을 하나 준비해 보았습니다.

밑에서 사진을 본 뒤, 다시 한번 제 설명을 보시며 "디스크 공간"을 합친다는 것을 이해해보면 좋을 것 같습니다.





이 그림을 보시면, 위에서 말한 LVM을 쓰는 이유 "1번"과 "2번"이 이해가 되실겁니다
하지만 3번 "기존에 사용중인 디스크의 공간을 확장할 수 있다"라는 건 이해가 안 되실
텐데요!

그건 밑에서 저희가 이미 리눅스에서 사용중인 "/dev/sda2"를 예시로 들며
설명해 드리겠습니다






2. 이미 리눅스에서 사용되고 있던 LV인 /dev/sda2


저의 "마운트와 디스크추가" 포스트를 보셨던 분이시라면 이 소제목만 봐도 대충 제가 뭘 설명할 건지 느낌이 오실겁니다만, 모르는 분들도 상관은 없어요~
https://mamu2830.blogspot.com/2019/11/fdisk-df-etcfstab-blkid.html
보고 오시면 되니까요 ㅎ

꼭 전부다 보고 오실 필요는 없구,
1. "마운트" 개념과 디스크 "파티션", sda디스크 구조
부분만 보고 오시면 될 겁니다!





자 위에 언급한 부분을 보고오시면 이렇게 윈도우로 치면 "C드라이브"인, 리눅스의 "/dev/sda"가 사실은 "/dev/sda1""/dev/sda2" 파티션으로 나뉘어져있으며

"/dev/sda2"는 오늘 배울 "LVM"이란 기능으로 "LV(Logical Volume)"이란 하나의
가상디스크로 만들어진 다음,

"Centos-root"라는 "최상위 루트 디렉토리용 파티션"
"Centos-swap"이라는 "swap용 공간 파티션"으로 나눠진다는 것을 아셨을 겁니다.

자, 그럼 여기서 의문이 드실겁니다. '
왜 굳이 /dev/sda2를 "LVM"을 사용해,"LV"로 만든다음 사용하는 것이지???'
라고요

다시 말해서 그냥 애초에 "/dev/sda""/dev/sda1, /dev/sda2, /dev/sda3"이렇게
3개의 파티션으로 나눈다음 각각 "boot용, 루트파일시스템, swap파일시스템" 이렇게
사용하면 되는 걸

굳이 귀찮게 "/dev/sda2"를 "LV"로 만든 다음 "루트파일시스템용, swap용"으로
나눠 사용하냐는 것이죠

맞습니다.

제가 말한 것 처럼 LV으로 안 만들고, 그냥 3개의 파티션으로 나눠 사용해도 상관 없어요. 하지만 왜 "LVM"으로 만들어 사용하냐면 그것이 바로 제가 위에서 언급한 "LVM을 사용하는 3번째 이유" "기존에 사용중인 디스크의 공간을 확장할 수 있기" 때문입니다

우리가 현재 사용하고 있는 윈도우의 "C 드라이브"를 한번 생각해볼까요?
저희는 기존에 사용하고 있던 드라이브의 공간이 부족해지면 어떻게 했었나요?

뭐.. 파일을 지워서 공간을 확보하거나 아니면 백업을 한 뒤, 더 큰 디스크로 교체를
할 수 밖에 없었죠?

리눅스도 마찬가지입니다. 리눅스도 "윈도우의 C드라이브"처럼 물리적인(실제) 디스크 공간에 파일시스템을 포맷해서 사용할 경우, 용량이 부족해질시 더 큰 디스크로 바꿀 수 밖에
없습니다.  

뭐 여기까지는 개인적인 컴퓨터를 사용하는 사람들에겐, 이렇게 디스크만 교체하는 건 별 문제가 아니지만

실제로 서버를 운영할 때 자주쓰이는 리눅스인 경우, 갑자기 서버 인기가 많아져서 확장을 해야한다거나 할 때마다 일일이 엄청나게 큰 용량의 디스크 내용들을 백업하고 교체하는 건 매우 매우 힘든 일이거든요 그래서 "LVM"을 쓰는 겁니다.

"LVM"으로 만든 "Logical Volume"에 파일시스템을 포맷해서 사용할 경우, 용량이 부족할 시, 단순히 다른 디스크의 공간을 기존에 사용중이던 "/dev/sda2"에 추가해 사용할 수 있기 때문이죠!

말로는 잘 이해가 안 되시죠? 그림을 보여드리며 다시 설명해볼게요





















이렇게 물리적인 디스크에 파일시스템을 포맷한 경우, 디스크 공간을 추가할 수가
없습니다. 하지만







그림처럼 "LVM"기술을 사용해 만든 "LV, /dev/sda2"는 이렇게 쉽게 공간을 추가할
수 있습니다.

물론 사진을 보니 뭔 이상한 영어들 "PV, PE, VG, LE, LV"가 보이셔서
벌써부터 머리가 아파지실텐데...

음 어렵게 생각하지 마세요! 단지 위 사진은 디스크에 공간을 추가하기 위한 총 과정
모두 그려서 복잡한 겁니다. 지금 여기서는 "3번"과 "4번"만 보시면 됩니다.

지금보니 잘 안보이는데 "3번"과정을 보시면, 주황색 영역에 "LV"라는 것이 써진 것이
보이시나요?  "/dev/sda2"도 "LV"의 공간으로 만들었기 때문에, 같은 "LV"를 합쳐 
쉽게 공간을 확장할 수 있다는 걸 보여드린 겁니다!

물론 저 "LV"을 추가하는데 필요한 전체 과정을 보셨기에 벌써부터 한숨이 나오실 겁니다.
ㅋㅋㅋㅋ 자자 원리만 알고나면 그리 어려운 건 아니니 마음 가다듬고
이제 "LV"를 추가하는데 필요한 전체 과정을 보도록 하겠습니다.






3. "PV(Physical Volume)", "VG(Volume Group)", "LV(Logical Volume)", "PE(Physical Extent)", "LE(Logical Extent)"란?






맨 위에 "0번""fdisk"라고 표시한 곳이 보이시나요?
제일 먼저 할 행동은 바로 여분의 디스크 공간을 저번 포스트 "마운트"에서 배운
명령어 "fdisk"를 이용해, "lvm시스템용"으로 바꾸는 겁니다.


일단 여분의 디스크 공간이 있어야 하므로, 가상머신에서 하드 디스크
"20GB"와 "10GB", 총 "2개"를 추가해줍니다.(마운트와 디스크 추가 포스트를 보셨으면
이 부분은 아시죠?)




이렇게 항상 혹시 모르니, 장치 이름 확인해 주시고!

"fdisk /dev/sdb"이렇게 명령어를 쳐서 세팅해 줍시다.





하나의 디스크를 통째로 한 파티션으로 만듭니다.





잘 만들어진 걸 "p"로 확인하신 다음

"t"를 이용해 파티션의 "시스템 id"를 변경해줍니다.

모르실 경우 "L"를 누르시면 모든 시스템 id가 나와요! 기억 안 날시 확인하고 하시면 돼요!



리눅스용 "LVM"의 시스템 id는 16진수로 "8e"입니다.
이제 8e를 입력해서 바꿔주시면





이렇게 잘 바뀐 것을 볼 수 있죠? 잊지말고 "w"로 나가주세요
(q로 나가면 저장 안되는 겁니다!)

같은 방식으로 "/dev/sdc""LVM"용으로 세팅해주세요~

여기까지 하시면 이제 "0번"은 끝난 겁니다 ㅎㅎ 왜 "1번"이 아닌 "0번"이라 제가
썼냐면, 디스크에 관련된 어떤 일을 할땐, 가장 먼저 무조건 디스크 공간을 "fdisk"를 이용해
시스템 id를 바꿔줘야 하기 때문입니다!

자 이제 본격적으로 "LVM"을 만드는 "1번"의 과정을 알아볼까요?
첫 번째 과정은 바로 "LV"을 만드는데 필요한 디스크 공간을 "PV(Physical Volume)"으로
만드는 것
입니다.


i) PV(Physical Volume), PE(Physical Extent)


"PV(Physical Volume)"말 그대로 그냥 기존의 디스크 공간과 별 차이가 없는
"물리적 공간"입니다. 그러면 왜 "PV"라는 개념으로 따로 구분을 하느냐?

기존의 디스크랑 큰 차이는 없지만 약간의 차이가 있기 때문이죠.(???)

그 약간의 차이라는 것은
1. "LVM"에서 사용하기 위한 개념 이라는 것과
2. "PV"의 최소 단위를 "PE"라 부르며, "PE"로 전체 공간을 나눴다는 것
입니다.

기존의 디스크 공간은 최소 단위가 "섹터(Sector)"로 나뉘워져 있다는 것을 이젠 다들 아시죠? (모른다면 얼렁 "디스크 원리" 포스트를 읽고 오시길 
https://mamu2830.blogspot.com/2019/11/fdisk-df-etcfstab-blkid.html)

"PV"라는 건 기존의 디스크공간과 다르게 섹터가 아닌, "PE(Physical Extent)"라는
단위로 이루어져 있다는 겁니다.





이렇게 말이죠 그럼 "PE(Physical Extent)"란 뭐냐? 그냥 해석하면 "물리적 공간"
입니다 ㅋㅋ 뭐 말장난 하는 건가 싶죠?

아 그리고 저희가 현재 자연스럽게 사용하는 "LVM"은 사실 "LVM2"입니다.
버젼 2라는 것이죠. 그리고 이 "LVM2"에선 기본적으로 "PE"의 사이즈가
4MB로 되어있습니다. 

"PE"의 사이즈를 바꿀 수도 있지만 알아보니 그냥 그대로 쓰는 걸 추천하더라고요

어쨌든, 굳이 "PE"라는 개념을 왜 사용하냐라고 한다면 이제 서로 다른 디스크 공간을
합쳐서 "LV"로 만들기 위해선 공간의 가장 작은 단위부터 통일을 해야하지 않겠습니까?

즉, "PV(Physical Volume)"을 만드는 이유는 "LV"를 만들기 쉽게, 디스크의 최소 공간들을
"PE"라는 것으로 통일하는 과정이라고 생각하시면 됩니다.


ii) VG(Volume Group)





자 "LV"를 만드는 2번째 과정 "VG(Volume Group)"은 어렵게 생각하실 것 없습니다.

위 사진을 보시면 이제 이 "PV"들을 합쳐서 "VG(Volume Group)"를 만드는 것을
알 수 있죠? 그게 답니다.

네?

네 그게 답니다. Volume 'Group' 이란 이름대로 공간들을 그냥 하나의 그룹,
즉 합친 겁니다.

맨 처음 "LVM"를 "화채"에 비유했었는데 기억 나시나요?
그 때 화채를 만들기 위해 "다듬은 과일조각들"이 이제 "PV(Physical Volume)"인 것이고
이제 그 "PV"들을 하나의 그릇에 담은 것이 바로 "VG(Volume Group)"인 것입니다.

딱히 어려울 건 없죠? ㅎㅎ


iii) LV(Logical Volume), LE(Logical Extent)


자 우리 과일들을 다듬어서 이제 한 그릇에 모두 담았습니다.
남은 건 뭐일까요? 그렇죠 각자 먹을 만큼 덜어가서 막걸리든, 사이다든, 밀키스든
부어서 먹으면 되죠?

이렇게 음료를 부어서 완성 시킨 "화채"가 바로 "LV(Logical Volume)"이라고
보시면 됩니다.

물론... 각자 먹을만큼 덜어가서 만드는게 아니라, 처음부터 스까스까! 하면서
만든 다음 나눠 먹을 수도 있지만, 아무래도 덜어서 만드는게 위생에 더 좋지
않을까요 ㅎㅎ..



이렇게 합친 "VG(Volume Group)"을 필요에 따라 덜어서 "LV(Logical Volume)"
으로 만들어 사용하는것이죠.

그림을 보시면 "LV"을 만들 시 "PE(Physical Extent)""LE(Logical Extent)"로 바뀌는 게
보이실텐데요 그냥 "Logical Volume"에서 사용하는 것이니 "Logical Extent"다 라고
생각하시면 됩니다.

"LVM2"에선 기본적으로 "PE"의 사이즈가 "4MB"라고 했었는데, 이
"PE"가 변한 "LE"도 똑같이 "4MB"입니다.

자 이제 "PV, VG, LV, PE, LE"의 개념에 대해서 대충 이해가 되셨을 겁니다.
이제 여러분들은, 방금 설명한 각 과정들에 필요한 명령어들만 아시면
"LVM"란 기능을 자유자재로 사용하실 수 있을겁니다!




4. LVM관련 명령어들 "pv,vg,lv(create, scan, display, extend, reduce, remove)"



이 부분이 조금 명령어가 많다고? 느끼실 수 있어서 잘 안 외워지실 텐데,
제가 알려드린데로 외우시면 이제 금방 외우실 겁니다!

"LVM"에서 쓰이는 명령어들은 대부분 "pvcreate", "vgcreate", "lvcreate"
이런식으로 앞에 "pv, vg, lv"를 제외하면, 뒤에 오는 영어들은 다 똑같습니다.
즉 뒤에 영어들만 외우면 된다 이거죠!



i) [pv,vg,lv]create : "pv, vg, lv"를 만들겠다

pvcreate [블록 파일]... : 뒤에 적은 블록파일(들)을 "PV"로 만들겠다




항상 블록 파일에 대한 작업을 할 땐, "ls /dev/sd*"로 확인하시고 해야하는 것! 잊지마세요
그리고 "sdb, sdc"가 아니라 "sdb1, sdc1"인거 아시죠?

위 명령어를 실행시



이렇게 "Physical volume"이 잘 만들어졌다고 뜹니다~



vgcreate [만들 VG이름] [VG으로 합칠 PV들...] : 맨 처음 이름으로 "VG"를 만들겠다,
그 뒤에 적은 "PV"들로  




사진처럼 "vgcreate(vg를 만들겠다) VG_30GB(이란 이름으로) /dev/sdb1
/dev/sdc1(이 pv들로)"을 치시면 성공적으로 Volume group이 만들어졌다고 뜹니다.


lvcreate -n(name) [만들 LV이름] -L(LV사이즈) [만들 LV사이즈{단위 붙여서}] [VG이름] :  
-n 옵션 뒤에 적은 이름으로 "LV"를 만드는데 -L 옵션 뒤에 적은 사이즈로 만들겠다,
맨 뒤에 적은 VG로부터 

pvcreate와 vgcreate와 다르게 "lvcreate"는 필수 옵션이 2개 "-n""-L"
있습니다.







꼭 "-n" 옵션을 먼저 써야 한다는 것은 없습니다.

리눅스는 무조건 [-a 옵션] [a 옵션 값] [-b 옵션] [b 옵션 값] 이렇게,
"옵션" 바로 뒤에는 "옵션 값"을 적는 규칙만 지켜주면, 옵션의 순서는 모든 명령어에서
중요하지 않습니다.

어쨌든 위 사진을 보시면 성공적으로 "lv_10G"라는 이름의 Logical volume이 만들어졌다고
뜹니다.

물론 대문자 "-L"이 아니라 소문자 "-l"을 쓸수도 있는데 이 경우엔 뒤에 PE의 개수를
적어줘야 합니다. "PE"가 하나당 4MB라고 했었죠?

솔직히 이를 이용하면 정교하게 줄 수는 있지만 누가 이렇게 주겠습니까...
일단 알고만 있으세요~ 큼직하게 용량을 줄 수 있는 건 큰(대문자) "-L",
정교하게 용량을 줄 수 있는 건 작은(소문자) "-l"



ii) [pv, vg, lv]scan, display


자 우리 지금까지 성공적으로 "PV --> VG --> LV" 순으로 완성했습니다.
그럼 당연히 확인하는 명령어도 있겠죠?

확인하는 명령어에는 "scan"과 "display"가 있습니다. 둘다 뜻이
보여준다는 식으로 비슷하죠? 하지만 살짝의 뉘앙스 차이가 있습니다.

"scan"은 스타크래프트 테란의 스캔처럼, 있는지 없는지 정도만 간략하게
확인한다는 느낌이고

"display"는 이제 제대로 쫘~악 펼쳐서 세부적으로 정보를 보여주는 느낌입니다.

둘다
[pv, vg, lv]scan
[pv, vg, lv]display 형식으로 사용이 가능하며, 딱히 옵션은 알 필요 없을 것 같습니다.

[pv, vg, lv]scan : pv, vg, lv가 뭐뭐 있는지 간략하게 보여준다














[pv, vg, lv]display : pv, vg, lv가 뭐뭐 있는지와 세부적인 정보를 보여준다














iii) [vg, lv]extend

"extend"라는 뜻은 뭔가를 "확장"한다는 의미죠?
리눅스 명령어에서도 그~대로 쓰입니다.
기존의 만들어진 "VG""LV"의 공간을 확장하겠다는 것이죠.

어? "왜 PV"는 "extend"가 없나요?"라는 질문이 생각나실겁니다.
그리고 질문 하려는 순간! 바로 또 다른 생각이 나실 겁니다.

'아~ 실제 디스크 공간인 PV(Physical Volume)는 확장이 안됐지, 그래서 우리가 
VG, LV를 만들어서 사용하는 것이고'

Excellent!, 아주 훌륭해염~ 바로 그거죠! 제 포스트를 잘 읽으셨군요!
그렇습니다. 실제 디스크 공간이랑 별 차이가 없는 "PV"는 확장할 수가 없죠!

"확장"이 있으면 "축소"도 있음이 세상에 이치, 당연한 것,
바로 밑에서 "축소"명령어도 배울텐데 그 역시 마찬가지 입니다.
실제 디스크 공간인 "PV"는 축소가 안되죠~ 축소랑 파티션을 혼동하시면 안됩니다!



vgextend [확장할 VG이름] [VG에 넣을 PV이름] : vg의 공간을 확장하겠다.



아,, 실수 했네요 우리 이미 모든 디스크를 사용하고 있어서 확장할 공간이 더 없네요 하하..

다시 가상 머신에서 디스크 하나를 추가해주고 아까 "0번"과정인
"fdisk"로 lvm시스템으로 세팅한 다음 "PV"를 만들어주겠습니다.(이 과정은 좀 생략할게요
번거롭게 해서 죄송합니다 ㅠ)

 

이렇게 추가한 거 확인하고~ fdisk로 lvm 시스템 세팅 해주고




"PV"를 하나 더 만들어 줬습니다.

자 이제 본격적으로 "VG"를 확장해보겠습니다.






이렇게 vgextend(VG을 확장하겠다) VG_30GB(이 이름의 VG를) /dev/sdd1(이 녀석의
공간을 합쳐서) 하니 성공적으로 확장됐다고 뜹니다.

확인해볼까요? 위에서 배운 "vgdisplay"를 써보죠




자 "2번"을 보시면 "LVM2"를 이용하여 만든 "VG"라는 것을 알 수 있고

"3번"을 보시면 사이즈가 대략 40GiB 정도 되며

"4번"을 보시면 Alloc(Allocate, 얼마나 할당, 현재 쓰고 있는가)PE 2560이라고
아까~ 초반에 배운 "PE"가 현재 2560(대략 10GiB)가 쓰이고 있다는 것을 알 수 있습니다.

"5번"은 뭐 Free PE로 남은 PE공간 이라는 것을 알 수 있죠?

"6번"은 UUID네요! "마운트"포스트에서 마지막쯤 배웠었죠?




lvextend -L [바꿀 LV사이즈] [LV이름] : -L 뒤에 적은 사이즈대로 LV의 용량을 바꾸겠다.



명령어는 확장이라서 더 큰사이즈로만 변경이 가능합니다. 주의하실 것은
"lvextend -L 10G [LV이름]" 이렇게 하면 LV의 사이즈가 10G만큼 증가하는 게 아니라
10G로 바뀝니다.

물론 확장 명령어이기 때문에 기존 사이즈 이상 용량만 줄 수 있으며,
기존 용량보다 작게는 안 변합니다.





이렇게 기존 용량보다 작은 용량을 잘못 줘도,
기존 2560PE(10GiB)사이즈보다 주어진 값이 1280PE(5GiB)가 작다며 적용이 안됩니다. 
그러니 용량를 잘못 줄 걱정은 안하셔도 됩니다.




자 이렇게 "lvextend -L 20G /dev/VG_30GB/lv_10G" 이렇게 한 뒤,
"lvscan"으로 확인하니 용량이 20GiB로 증가한 걸 확인할 수 있습니다.

참고로 이렇게 "LV"를 확장하면 그만큼 "VG"의 용량이 줄어듭니다.




딱 이 그림처럼 말이죠!




iv) [vg, lv]reduce


자 위에서 말했었죠, 확장이 있다면 축소도 있다구 말예요.
그러니  "왜 PV는 reduce가 없느냐"란 질문은 대답할 필요는 없겠죠?


vgreduce [축소할 VG이름] [VG에서 뺄 PV...] : VG을 이루고 있는 PV를 빼서 VG공간을
축소하겠다.

이건 사이즈를 주면서 축소하면 안되죠 왜냐면





이렇게 "VG"는 "PV" 여러개를 고대로 이어 붙여 만들었었기 때문입니다~

자 축소하기 전에 "pvscan" 명령어로 우선 사이즈와 구성 PV들을 확인하고,
축소를 해줍시다. 리눅스에서 "축소, 제거" 같은 명령어는 꼭! 확인을 한 뒤에 
하시는 습관을 들여야 해요 자칫하면 큰일 나기 때문이죠 ㄷㄷ






이렇게 "vgreduce VG_30GB(VG이름) " 이 상태에서 "tab"을 2번 누르시면
이 공간에 올 수 있는 파일들을 보여줍니다~ "vgreduce"뿐만 아니라
모든 명령어에서 사용할 수 있습니다~

"vgdisplay"로 확인해보시면



아까 새로운 디스크를 추가해서 40GiB였었는데, 제거하여 다시 30GiB가 된 걸
확인 할 수 있습니다.

아 물론 여기서 사용중인 PV를 제거하면 어떡하지 ㄷㄷ.. 하실 수 있는데




이렇게 사용중인 PV라고 뜨며 실행이 안되니 걱정 안하셔도 됩니다~



lvreduce -L [만들 LV용량] [LV이름] : -L 뒤에 적은 용량으로 LV의 크기를 축소하겠다.

딱 "lvextend"의 정반대 개념이라고 생각하시면 됩니다.
"reduce"라는 단어가 들어가는 것처럼 기존의 용량보다 큰 사이즈를 줄 순 없습니다.

"lvreduce -L 10G [LV이름]" 이렇게 할 시 LV의 사이즈를 10G로 만들어 버립니다.

하지만 확장하는 것과 달리 주의해야할 점이 있습니다. 그것은 바로
늘리는 건 막 늘려도 되지만, 줄이는 용량에 사용중인 데이터가 있을 수 있다는 건데요.

손님에게 서비스라고 하며 음식을 더 주는 건 문제가 되지 않지만,
손님이 먹던 음식을 갑자기 뺏으면 손님이 불같이 화내겠죠?(비유가 좀..)

같은 맥락입니다.






먼저 "lvscan"으로 용량을 확인 한다음
"lvreduce -L 15G /dev/VG_30GV/lv_10G" 이렇게 기존에 용량이 20GiB던 LV를
15G로 줄인다고 하자 

빨간 줄로 표시한 곳에 "지금 이 행위가 당신의 데이터를 파괴할 수 있습니다.
정말로 용량을 줄일 겁니까? [yes / no]"
이렇게 물어보죠? 저희는 딱히 이 LV에 만든 것도 없기에
걱정없이 그냥 "Y(태양신 만ㅅ....)" 을 쳐줍니다.




네 성공적으로 용량이 15GiB로 줄었습니다.


iii) [pv, vg, lv]remove


자 마지막으로 지우는 명령어를 알아야겠죠? 사실 이건 매우 간단합니다.
그냥 지우는 거니깐요, 원래 만드는 건 힘들지만 없에는 건 엄청 편하잖아요?

오랜만에 "PV"가 등장했네요! 왜 일까요? 그야 당연히 물리적인 공간도
"제거"하는 건 할 수 있기 때문이죠!

아 중요한 것은 제거하는 건 만드는 것과 반대로
"LV --> VG --> PV"순으로 제거 해야합니다. 뭐 당연한거쥬?

만약 순서를 틀리게 제거하려 하면





이렇게 사용중이며 "PV면 VG"를, "VG면 LV"를 먼저 제거해달라고 나옵니다.



lvremove [제거할 LV이름] : LV를 제거하겠다.





"lvscan"으로 확인 한 뒤 제거 완료! 제거한 공간 만큼 다시 "VG"공간은 확보되겠죠?



vgremove [제거할 VG이름] : VG를 제거하겠다.





"pvscan"이 vgscan보다 더 좋은 것 같아요 ㅋㅋ 확인한 뒤
제거~



pvremove [제거할 PV이름] : PV를 제거하겠다.






"pvscan"으로 확인한 다음

"2번"대로 성공적으로 제거한 뒤, 다시 "pvscan"으로 확인하니
"/dev/sdd1"이 성공적으로 사라진 걸 볼 수 있습니다~


자 이제 여러분은 95%정도 마스터 하셨습니다.
마지막 5%는 이제 저희가 실제로 사용하는 루트파일시스템이 포맷된
"/dev/sda2"의 크기를 증가시켜 봅시다!




5. "centos VG"를 확장한 다음 루트파일시스템의 LV인 "/dev/mapper/centos-root"의 
크기를 확장해보자



"lvscan"명령어로 한번 지금 사용중인
"루트 파일시스템이 포맷된 LV"의 용량을 확인해 봅시다!






"/dev/centos/root" 라는 이름이 보이시죠? 저게 지금 바로
"최상단 루트 디렉토리에 마운트 된" "root LV"입니다.

이제 용량을 증가시켜 봅시다! 어떻게 하면 될까요?
참고로 이 "root LV"를 증가시키는 것엔 약간 함정이 있습니다

그것은 바로 "root LV""centos라는 LV"로 만들어졌다는 것이죠!
정확히 말하자면 저희가 저번부터 얘기를 했던 "LV가 된 /dev/sda2"
이름은 바로 "centos"였던 겁니다.


한번 "vgdisplay"으로 봐 봅시다.




 자 그럼 이제 어떻게 해야할 지 한번 생각해봅시다.
























그렇죠
 1. 아직 지우지 않은 PV가 2개 있었는데 그걸 "vgextend"명령어로 "centos" VG를 
확장한 다음






2. 확장한 "centos" VG를 이용해 
"lvextend -L [바꿀 사이즈] /dev/centos/root 이렇게 하면 될 겁니다!


하지만 아무래도 정확하게 남김 없이 용량을 주려면 "-l [PE개수]" 이렇게 줘야겠죠?

"vgdisplay"로 먼저 "ceotos"VG의 "남은 PE 개수"를 확인해주시고





"lvdisplay"로 "/dev/centos/root"의 "현재 PE 개수"를 확인해준다음





두 값을 더한 "14589"‬을






이렇게 줍니다. 이 "GiB"라는 값이 참 애매한 것 같아요...

자 이제 끝났으니 확인해볼까요?






머지?? 왜 증가가 안 됐죠?
그 이유는 저희는 분명 공간을 늘렸지만, 현재 최상위 루트 디렉토리에 포맷된
파일시스템 "XFS"는 공간이 늘어난 것을 인식하지 못했기 때문입니다.

그러므로 i) XFS파일 시스템이 늘어난 공간을 확인할 수 있게 해주는 명령어를 줘야하는데

바로 "xfs_growfs [파일시스템이 포맷된 마운트공간]"
입니다.




사진처럼 /dev/centos/root LV를 xfs로 포맷하고 마운트한 "/"를 대상으로
명령어를 실행하니, 파일시스템을 포맷하듯이 수 많은 정보가 뜨며

마지막에 블록의 크기가 증가했다고 뜹니다.

이제 다시 확인해볼까요?




크으 성공적으로 30GB가 증가한 모습입니다!



여기까지 하셨으면 이제 여러분들은 "LVM"이 뭔지 확실히 알게 됐을겁니다.

와,, 그동안 네트워크 공부를 하다가 오랜만에 리눅스 포스트를 써보는데,
카페에서 아메리카노 한잔 시키고 11시간동안 풀 집중해서 포스트했네요 ㅋㅋㅋㅋ ㅠㅠ
토할 것 같아요..

제 하루와 영혼을 갈아넣은 이 포스트가 꼭 도움이 되셨으면 좋겠고!
도움이 되셨다면 구글 블로그 팔로우, 좋아요 클릭과 따듯한 댓글 부탁합니다!

공감, 댓글을 달려면 로그인 해야하니 귀찮으실거 압니다.
하지만 여러분의 그 노력으로 단 공감 및 댓글은 정말 블로거에 엄청 큰 힘이 됩니다!

그럼 다음에는 더욱 무시무시한 ㅎ.. RAID에 대해서 포스트해보겠습니다!