[Windows7] 내 자격 증명 기억을 해도 네트워크 드라이브 인증을 요구할때

참고 : http://ddoong2.com/m/post/572

네트워크 드라이브를 연결해서 사용하는데 로그인 할때마다 풀리는 경우가 발생했다.


분명 '내 자격 증명 기억'을 체크 했는데


설정 방법은 Windows7 일때...


시작 -> 제어판 -> 자격증명 관리자 -> Windows 자격증명 추가









====================================================================================================================================

네트워크 드라이브 연결 지속


참고 : http://blog.naver.com/hanyu99/80110310727

http://support.microsoft.com/kb/297684/ko


windows의 버전 마다 차이기 있을 수는 있겠지만 네트워크 공유에 드라이브를 매핑하면

 

해당 시스템의 유휴 세션 시간이 지난면 매핑된 드라이브 연결이 끊어 질 수가 있습니다.

 

그로 인해 말씀하신것 처럼 매핑된 드라이브 아이콘에 붉은색 x 를 표시하게 됩니다.

 

하지만 다시 액세스 또는 탐색 시 붉은색 x가 없어지게 됩니다.

 

이런 유휴 시간이 있는 것은 지정된 유휴 시간 후 유휴 연결을 제거하여 사용되지 않는

 

세션에서 서버 리소스가 낭비되는 것을 줄이기 위해서 입니다.

 

만약 해당 연결 시간을 지속적으로 또는 그 시간을 늘리기 위해서는 하기의 명령줄을 활용하시면 되는데요.

 

net config server /autodisconnect:number

 

입니다. 여기서 number는 연결을 끊기 전에 서버가 대기하도록 할 시간이며 최대 값은 65,535입니다.

 

그리고 autodisconnect 값을 0(영)으로 설정하면 autodisconnect 기능은 해제되지 않으며

 

autodisconnect 기능을 해제하려면 아래와 같이 하시면 됩니다.

 

net config server /autodisconnect:-1

 

하기의 링크에서 자세한 사항을 보실 수 있습니다.

 

참고 사항

net config server는 다음과 같은 정보를 표시합니다.

-------------------------------------------------------------------- 
C:\>net config server
서버 이름                             \\culaworld
서버 설명                             테스트

소프트웨어 버전                       Microsoft Windows Server 2003
서버 활성화
        NetbiosSmb (000000000000)
        NetBT_Tcpip_{xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx} (xxxxxxxxxxxx)


서버 숨겨짐                           아니오
로그온 사용자 최대 수                 제한 없음
세션당 열 수 있는 파일의 최대 수      16384

유휴 세션 시간 (분)                   15
명령을 잘 실행했습니다.
-------------------------------------------------------------------- 


Windows XP의 인바운드 연결 제한

http://support.microsoft.com/kb/314882/ko

 

Windows NT Workstation 3.5x 및 4.0으로의 인바운드 연결(Inbound Connection) 제한

http://support.microsoft.com/kb/122920/ko

 

서버 서비스 구성과 조정

http://support.microsoft.com/kb/122920/

 

명령줄에서 공유 폴더 관리

http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ko/library/ServerHelp/df58120a-6f54-43ca-8a23-5ce529f3b8c3.mspx






출처 : http://cappleblog.co.kr/538

우리가 윈도우에서 보는 모든 파일은 파일 시스템의 링크(Link)이다.

Link : 명사 연결 동사 연결하다

윈도우에서는 윈도우 2000 이후 하드 링크(Hard Link)정션(Junction)이 윈도우 비스타 이후 심볼 링크(Symbolic Link)라는 기존의 윈도우에서는 없었던 새로운 개념이 사용되고 있습니다. [참고로 윈도우에서만 새로웠던 겁니다. ^^;] 이러한 링크는 윈도우 탐색기와 같은 파일 관리자가 아닌 NTFS 파일 시스템(File System) 차원에서 관리되는 것으로 파일에 대한 좀 더 유연한 접근과 관리를 가능케 해줍니다. 이번 글에서는 이러한 링크에 대한 개념을 잡아보는 시간을 가지도록 하겠습니다.


"우리가 윈도우에서 보는 모든 파일은 실제 파일에 대한 파일 시스템의 링크(Link)이다."


일단 이 개념을 정확하게 짚고 넘어가도록 하죠. 먼저 매우 기초적인 이야기를 하나 하겠습니다. 파일은 어디에 저장되어 있나요? 바로 디스크입니다. 이렇게 디스크에 저장되어 있는 파일의 본체를 실제 파일이라고 하겠습니다. 그리고 디스크에 저장되어 있는 파일들을 관리하는 건 파일 시스템입니다.

이제 중요한데요. 먼저 생각해야 할 것은 우리가 윈도우에서 어떠한 파일을 보고 있다면, 우리는 디스크에 기록되어 있는 실제 파일을 직접 보고 있는 게 아니라, 파일 시스템에 기록된 실제 파일에 대한 정보를 보고 있다는 겁니다. 그러한 파일 시스템의 정보에는 파일에 대한 여러 가지 고유 정보(파일 이름 등등)과 함께 실제 파일이 디스크의 어디에 저장되어 있는지 찾아갈 수 있는 위치 정보가 저장되어 있습니다.

이게 바로 링크(Link)입니다. 즉, 우리는 이러한 파일 시스템의 링크를 보고 있는 것이고, 그러한 링크를 통해 실제 파일에 접근하여 사용하는 거죠. 우리는(윈도우와 프로그램은) 이러한 방식으로 파일을 읽고 사용하는 겁니다. 이를 간단하게 그림으로 표현하면 아래와 같습니다. [아래의 그림은 볼륨(드라이브)와 파일 시스템을 개념적으로 분리한 모식입니다.]



그림을 보시면 아시겠지만 C:\CApple.txt 이라는 것도 그냥 링크 정보일 뿐입니다. 즉, 어떠한 파일의 경로와 이름이란 것은 실제 파일에 기록되어 있는 파일 자체의 데이터가 아닌, 그저 파일 시스템에서 관리되는 정보일 뿐인 거죠. 과거의 윈도우에서는 이렇게 실제 파일과 파일 시스템의 링크를 무조건 1:1 로 매칭시켰습니다. 즉, 실제 파일 하나에 파일 링크 하나! 이게 기본이었습니다.






하드 링크(Hard Link)와 심볼 링크(Symbolic Link)

그런데 윈도우 2000 부터 아래와 같은 새로운 개념이 사용되기 시작합니다.


즉, 하나의 실제 파일에 두 개 이상의 파일 링크를 연결하여 사용하기 시작한 거죠. 예로 위 그림에서 C:\CApple.txt 라는 파일과 C:\ShinB.txt 라는 파일은 별개의 파일처럼 보이지만, 실제론 $File1 라는 동일한 실제 파일에 동시에 연결되어 있는 완전히 같은 하나의 파일입니다. 둘 중에 어떤 파일로 접근해도 $File1 이라는 실제 파일에 연결되는 것이고, 그렇기에 둘 중에 아무 파일로 접근하여 내용을 수정하여도, 다른 파일에도 동시에 수정된 내용이 적용되는 것이죠.

이렇게 하나의 실제 파일에 두 개 이상의 파일 링크가 연결되어 있는 경우, 다른 하나의 파일을 삭제(Delete) 하더라도 여전히 다른 파일을 통해 실제 파일에 접근이 가능합니다. 즉, 실제 파일에 연결된 모든 파일 링크를 삭제하기 전까진 해당 실제 파일은 삭제(Delete)되지 않는 것이죠. [하지만 실제 파일까지 지우는 Wipe 는 안 됩니다.] 고로, 단 하나의 파일이라도 남아 있다면 실제 파일에는 접근이 가능한 겁니다. 또한 하나의 파일 이름을 바꾸더라도 이것이 다른 파일에 영향을 미치지 않습니다. 간단하죠?



이것을 하드 링크(Hard Link)라고 부릅니다. 실제로 아래와 같이 하드 링크를 생성해보았습니다. 하드 링크로 만들어진 또 다른 파일은 그야말로 완전히 별개의 파일로 보입니다.




파일 속성을 살펴 봐도 둘은 각자 별개의 온전한 파일입니다.



하지만 사실 둘은 하나의 실제 파일에 연결된 같은 파일인 거죠. 간단하죠?





그런데 윈도우 비스타에서는 이러한 하드 링크 외에도 링크에 대한 링크라는 개념도 새롭게 추가가 되었습니다. 즉, 아래와 같은 겁니다.


보시는 것과 같이 C:\WinTT.txt 라는 파일(링크)는 이전과 다르게 $File1 이라는 실제 파일이 아닌 C:\ShinB.txt 파일(링크)에 연결이 되어 있습니다. 즉, 링크에 링크가 연결된 거죠. 그래서 우리가(윈도우가, 프로그램이) C:\WinTT.txt 에 접근하면 곧바로 실제 파일이 아닌 C:\ShinB.txt 라는 링크를 한 번 거쳐서 실제 파일에 접근하게 됩니다. 그래서 이러한 링크에 대한 링크는 하드 링크와는 다르게 1차적인 속성은 바로 가기가 됩니다. 하지만 파일 형식은 하드 링크처럼 지정한대로 인식이 되고, 실제 파일과 동일하게 사용이 가능하며, 데이터가 아닌 링크를 가르키고 있기 때문에 용량은 제로가 됩니다.

이것은 .lnk 파일로 구현되는 바로 가기(Shortcut) 와 비슷하면서도 다른 개념입니다. .lnk 바로 가기는 .lnk 라는 완전히 별개의 파일(해당 .lnk 의 실제 파일도 가지고 있는)이 따로 존재하고, 이러한 .lnk 포맷은 윈도우의 익스플로러 쉘에서 지정된 파일로 이동을 시켜주는 하나의 파일 형식일 뿐입니다. 하지만 지금 이야기하고 있는 링크에 대한 링크는 윈도우가 아닌 파일 시스템 차원에서 연결된 것이며, 이렇게 생성된 파일은 그 자체로 윈도우나 프로그램에서 개별적인 파일처럼 취급이 됩니다.

간단하게 C:\ShinB.txt 파일에 대한 C:\WinTT.lnk 바로 가기(Shortcut)를 만들고, 이러한 바로 가기(Shortcut)를 익스플로러에서 실행하면 C:\ShinB.txt 파일이 열립니다. 하지만 C:\ShinB.txt 에 링크로 연결된 C:\WinTT.txt 는 그대로 C:\WinTT.txt 로 열립니다. 그리고 하드 링크와 같이 최종적으로 서로 동일한 실제 파일로 연결되기 때문에 C:\ShinB.txt 나 C:\WinTT.txt 둘 중에 아무 파일로 접근하여 내용을 수정하면, 다른 파일에도 동시에 수정된 내용이 적용되는 겁니다. 간단하죠?

그런데 이러한 링크에 대한 링크는 실제 파일에 직접 연결되어 있는 게 아니기 때문에 연결한 원본 링크가 사라지면 무용지물이 되는 문제가 있습니다. 즉, 아래와 같이 C:\ShinB.txt 파일이 사라지면 연결 흐름상 실제 파일에 접근할 수 없고, 결국 C:\WinTT.txt 파일은 그냥 더미 링크가 되어 버리는 거죠. 원본 링크 파일을 지우는 것 뿐만 아니라 원본 링크 파일의 이름이 바뀌어도 마찬가지로 링크에 대한 링크는 사용할 수 없게 됩니다.



이러한 방식의 링크를 심볼 링크(Symbolic Link)라고 합니다. 다른 말로 소프트 링크(Soft Link)라고 부르기도 합니다. 실제로 아래와 같이 심볼 링크를 생성해보았습니다. 심볼 링크로 만들어진 파일은 바로 가기 속성이지만, 별개의 독립된 파일로 인식되고, 실제 파일처럼 사용할 수 있습니다.






이야기한 것처럼 심볼 링크로 생성된 파일은 속성을 열어 보면 바로 가기이지만, 파일 형식과 이름은 일반적인 파일처럼 인식되고, 그 자신은 실제 파일이 아닌 다른 링크를 가르키고 있기 때문에 크기는 0 인 것을 확인할 수 있습니다.





지금까지 두 가지 링크에 대해서 이야기를 해봤는데요. 그냥 논리적인 개념상으로 지금까지 이야기한 것들 살펴보자면, 실제 파일은 현재 디스크에 존재하는 거죠. 그래서 실제로 존재하기에 딱딱하다고 봅니다. 하지만 링크는 이에 대한 무형의 정보라고 할 수 있죠. 그래서 부드러운 걸로 봅니다. 즉, 우리가 컴퓨터에서 하드웨어/소프트웨어로 나누듯이, 여기에서도 실제 파일은 하드웨어로, 링크는 소프트웨어로 나눌 수 있는 거죠. [그냥 서로를 개념적으로 따져본다면]

그래서 실제 파일과 직접 연결된 링크를 하드 링크(Hard Link)라고 부르며, 링크에 연결된 링크는 소프트 링크(Soft Link)라고 표현합니다. 그리고 소프트 링크의 정확한 명칭은 심볼 링크(Symbolic Link)이고요. [소프트 링크 = 심볼 링크] 아무튼, 최종적으로 지금까지 이야기한 것을 정리하면 아래와 같습니다.




이것이 바로 윈도우에서 이야기하는 하드 링크와 심볼 링크의 정체입니다. 별거 아니죠? 아래는 지금까지 알아 본 하드 링크와 심볼 링크로 연결된 여러 파일들의 연결을 나타내 본 것입니다.



위의 그림을 보면서 추가로 더 이야기하자면 하드 링크는 실제 파일에 직접 연결해야 하기 때문에 실제 파일이 위치한 동일 드라이브에서만 가능하며, 심볼 링크는 대상만 설정하면 되는 일종의 바로 가기인 연결이기 때문에 동일 드라이브는 물론 다른 드라이브로도 연결이 가능합 니다. 이것은 하드 링크가 가질 수 없는 심볼 링크만의 장점이죠. 실제 사용하면서 느낄 수 있는 하드 링크와 심볼 링크의 가장 큰 차이는 바로 여기에 있다고 할 수도 있겠네요. 또한 심볼 링크는 절대 경로는 물론 상대 경로로도 원본 대상을 지정할 수 있다는 사용할 수 있는 특징이 있습니다.

좀 더 이야기하자면 하나의 실제 파일에 여러 개의 하드 링크 연결이 가능한 것처럼, 하나의 하드 링크에 여러 개의 심볼 링크를 연결하는 것도 가능하며, 마찬가지로 하나의 심볼 링크에 여러 개의 심볼 링크를 연결하는 것도 가능합니다. 그리고 심볼 링크에 연결된 심볼 링크에 다시 심볼 링크를 연결하는 것처럼 다단계로 연결하는 것도 가능합니다. 물론 여러 단계에 걸친 모든 연결이 그러하듯 중간에 하나가 끊기면 그 뒤에 링크들은 더미가 되겠죠.

여기까지가 파일에 대한 하드 링크와 심볼(소프트) 링크에 대한 설명이었습니다. 다음은 폴더(디렉토리)로 넘어가보죠.






폴더에 대한 심볼 링크(Symbolic Link)와 정션(Junction)

일단 폴더는 파일이 아닙니다. 폴더는 파일과 같이 실제로 존재하는 어떠한 데이터 개체가 아닌, 파일 시스템에서 구현된 일종의 논리적인 구조(구역, 공간)이라고 보시면 됩니다. 즉, 파일은 데이터로 하나의 물리적인 개체이지만, 폴더는 파일 시스템에서 설정된 논리적인 어떠한 공간 그 자체인 거죠. [개념을 놓고 보자면] 그래서 폴더에서는 하드 링크라는 개념이 없습니다. [일부는 정션을 하드 링크로 보던데, 이것은 제가 이해를 잘못한 건지 모르겠지만 '정션을 하드 링크로 볼 수 있나?' 라는 생각이 드네요.]

일단 폴더에서는 애초에 윈도우 비스타 이전 즉, 윈도우 XP 시절에도 정션(Junction)이라는 개념이 사용되고 있었습니다. 그리고 이러한 정션은 계속 이어져서 현재에도 사용되고 있죠. 정션이 가지고 있는 특성이나 개념은 심볼 링크와 크게 다르지 않습니다. 그리고 윈도우 비스타에 이르러서 지금까지 이야기한 심볼 링크(Symbolic Link)라는 개념이 추가 되었습니다. 이러한 폴더에 대한 심볼 링크의 특성은 파일에서의 심볼 링크의 특성과 동일합니다.

사실 정션과 심볼 링크를 구별 짓기란 게 참 애매할 정도로 실 사용에서의 정션과 심볼 링크의 특성은 매우 비슷합니다. 둘의 차이점이라면 심볼 링크는 상대 경로의 사용이 가능하며, 정션은 상대 경로는 지정할 수 없다는 것, 심볼 링크는 네트워크 드라이브로의 링크가 가능하며, 정션은 불가능하다는 점이 다른 것을 들 수 있습니다. 이 외에 실제로 사용하면서 느낄 수 있는 사실상의 특성은 동일하다고 보면 되며, 이러한 점을 미루어 봤을 때 정션을 폴더에 대한 구형 소프트 링크로 보고, 심볼 링크를 폴더에 대한 신형 소프트 링크로 보는 것이 좋을 듯합니다.


폴더에 대한 심볼 링크와 정션을 비교하자면 심볼 링크는 파일과 마찬가지로 1차적으로 바로 가기의 속성을 가지고 폴더로 인식 되며, 상대 경로의 사용이 가능하고, 다른 드라이브로 특히나 네트워크 드라이브로도 링크가 가능하다는 특징이 있습니다. 반면 정션은 폴더의 속성을 가지고 폴더로 인식이 되며, [이 부분은 파일의 하드 링크와 같죠. 하지만 아이콘은 또 바로 가기라는 것...] 절대 경로만 사용이 가능하며, 다른 드라이브로의 연결은 가능하지만, 대신 네트워크 드라이브로의 연결은 불가능하다는 차이가 있습니다. 그 외의 둘 모두 원본 폴더가 사라지면 더미 링크가 되는 것과 같은 특성들은 동일합니다.


아래는 실제로 하나의 폴더에 각각 정션 폴더와 심볼 링크 폴더를 생성해본 모습입니다. 일단 두 폴더 모두 윈도우 탐색기 상에서는 아이콘이 바로 가기로 표시됩니다.





하지만 해당 폴더로 들어가보면 일반적인 폴더와 마찬가지로 경로가 그대로 인식이 되는 것을 확인할 수 있으며, 원본 폴더의 파일이 둘 모두 정상적으로 연결되어 출력되는 것을 확인할 수 있습니다.



속성을 살펴 보면 위에서 이야기한 것과 같이 정션 폴더는 폴더로, 심볼 링크 폴더는 속성은 바로 가기로 인식되었음을 알 수 있습니다.



참고로 윈도우에선 예전부터의 호환성을 위한 것인지 윈도우 내부적으로는 심볼 링크보다는 정션을 주로 사용하는 모습을 보여 주고 있습니다. 폴더에선 이 외에 딱히 더 이야기할 것은 없네요.






하드 링크와 심볼 링크, 정션은 왜 필요한가?

간단합니다. 어떠한 서로 다른 경로에 위치한 파일이나 폴더를 동일하게 유지하기 위해서입니다. 즉, C:\Test\A.txt 라는 파일과 C:\Temp\B.txt 라는 파일의 내용이 완전히 실시간으로 동일해야만 하는 경우가 있을 수 있는 거죠. 또는 어차피 같은 의미이지만 하나의 대상에 대한 두 개의 전혀 다른 접근 경로가 필요할 때도 있습니다. 즉, 어느 경로로 접속하나 같은 파일이 필요하다는 거죠. 그래서 파일에 대한 동일성을 유지시키려면 하드 링크나 심볼 링크를, 폴더에 대한 동일성을 유지시키려면 정션 폴더나 심볼 링크 폴더를 사용하게 됩니다.


아주 간단하게 실제 예를 들어보자면 윈도우 XP 시절까지 사용자 폴더의 위치는 C:\Documents and Settings\사용자 계정 폴더였습니다. 하지만 윈도우 비스타부터는 C:\Users\사용자 계정 폴더로 그 위치가 바뀌었죠. 하지만 윈도우 XP 시절에 만들어진 프로그램들은 이렇게 새롭게 바뀐 사용자 폴더 경로를 알지 못하기에, 무조건 기존의 C:\Documents... 를 사용하려는 프로그램들이 많았습니다. 이 문제를 어떻게 해결 할까요?

방법은 간단합니다. C:\Users\사용자 계정 폴더를 원본으로 해서 C:\Documents and Settings\사용자 계정 경로로 정션 폴더나 심볼 링크 폴더를 생성하면 되는 겁니다. 그렇게 되면 기존의 프로그램들은 자신들이 사용하던대로 C:\Documents... 경로로 접근할 수 있고, 그렇게 해당 정션 폴더로 접근하면 자동으로 C:\Users... 폴더의 내용과 연결이 되는 거죠. 즉, 정션 폴더(심볼 링크 폴더)를 통해 두 개의 서로 다른 경로를 하나의 원본 폴더로 동시에 처리할 수 있는 겁니다.

이렇게 정션 폴더나 심볼 링크로 연결된 상태에서는 둘 중에 어느 경로로 접근하든 동일한 내용을 볼 수 있고, 둘 중에 어느 경로에 파일을 저장하든 두 경로 모두에서 동시에 사용할 수 있으니까요. [실제 파일은 원본에 저장되지만 연결되어 있기 때문에 변화는 동시에 적용됨] 간단하죠?


여기에 더해 더 이야기하자면 정션 폴더나 심볼 링크의 특성을 이용해 어떠한 드라이브의 특정 폴더를 통채로 다른 드라이브로 옮길 수도 있습니다. 즉, 나는 C:\Temp 라는 폴더를 사용하지만 이 폴더에 저장되는 파일들은 C: 드라이브가 아닌 용량이 좀 더 큰 D: 드라이브에 저장이 되길 원할 수도 있습니다. 그럴 땐 D: 드라이브에 원본 폴더를 하나 생성한 후 이 원본 폴더에 연결된 정션 폴더나 심볼 링크 폴더를 C: 드라이브에 생성하고, 해당 폴더를 사용하는 겁니다. 그럼 자연적으로 해당 폴더에 저장한 파일들은 D: 로 저장되는 거죠.


또한 하드 링크를 사용하면 여러곳에서 동시에 사용되는 완전히 동일한 파일들을 하나로 합쳐서 관리할 수도 있기 때문에 그만큼 디스크에서의 전체 파일 용량을 줄일 수 있는 이점도 있습니다. 쉽게 이야기하면 하드 링크를 통해 중복 파일을 하나로 통합할 수 있는 거죠. 뭐 그렇습니다. 어떻게 이번 내용이 도움이 되셨는지 모르겠네요. 윈도우에서 링크 기능에 대해서는 이정도면 될 듯 하네요. 사실 오늘 적으려고 했던 글은 아닌데 어쩌다 이 글이 나왔는지 모르겠네요. ^^;;; 이상입니다.





[환경정보]

# OS 확인
$> grep . /etc/*-release

# CPU 코어전체개수
$> grep -c processor /proc/cpuinfo

# 물리 CPU 수
$> grep ^processor /proc/cpuinfo | wc -l

# bit 확인
$> getconf LONG_BIT

# 메모리
$> cat /proc/meminfo | grep MemTotal


[기타]
# 현재 경로
$> pwd
$> pwd -P

# ls로 날짜 포맷 (연도 표시)
$> ls -al --time-style=long-iso



[yum]
# 설치
$> yum install 패키지명

# 삭제
$> yum remove 패키지명

# 설치된 목록
$> yum list installed
$> yum list installed 패키지명

# yum 설치, 변경, 삭제 이력
$> yum history list
$> yum history list 패키지명

# cache clean
$> yum clean all

# yum 패키지 업데이트
$> yum -y update

# yum 업데이트
$> yum update yum


[apt]
# 설치
$> apt install 패키지명

# 삭제
$> apt remove 패키지명

# 설치된 목록
$> apt list --installed

# 사용가능한 패키지 목록 저장소 업데이트
$> apt update

# 설치된 패키지 업그레이드
$> apt upgrade

# 설치된 패키지 업그레이드 (의존성 검사)
$> apt dist-upgrade



[용량]
* 디스크 확인
$> fdisk -l

* 디스크 확인 (해당 디스크)
$> fdisk -l [장치명]
$> fdisk -l /dev/sda

* 파디션 용량 확인
$> df -h

* 파티션 용량 전체 합계
$> df -P | awk '{sum += $2} END {print sum " KB"}'
$> df -P | awk '{sum += $2} END {print sum/1024 " MB"}'
$> df -P | awk '{sum += $2} END {print sum/1024/1024 " GB"}'

* 파티션 용량 전체 합계 (NAS 제외)
$> df -P | grep -v : | awk '{sum += $2} END {print sum/1024/1024 " GB"}'

* 파티션 사용용량 전체 합계
$> df -P | awk '{sum += $3} END {print sum/1024/1024 " GB"}'

* 파티션 사용용량 전체 합계 (NAS 제외)
$> df -P | grep -v : | awk '{sum += $3} END {print sum/1024/1024 " GB"}' 

* 폴더 용량 확인
$> du -hs 폴더명

* 현재폴더의 하위폴더 용량확인
$> du -hs *

* 현재폴더에 있는 폴더 및 파일 중에서 용량이 큰 것 순으로 10개 보기
$> du -hsx * | sort -rh | head -n 10



[cpu 정보]
참고 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_CPU_%EC%82%AC%EC%9A%A9%EB%A5%A0_%ED%99%95%EC%9D%B8

* cpu / 메모리 정보
$> top

* cpu 정보
$> lscpu


[메모리 정보]
참고 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%82%AC%EC%9A%A9%EB%A5%A0_%ED%99%95%EC%9D%B8

* 메모리 정보
$> free

* 1초마다 갱신
$> sar -r 1



[장비]
* PCI 장비 목록
$> lspci

* PCI 장비 목록 자세히
$> lspci -v

* PCI 장비 목록 자세히 및 "/" 입력 시 검색
$> lspci -v | less

* 하드웨어 목록
$> lshw
$> lshw -numeric -C display



[사용중인 포트 확인]
$> netstat -anp | grep LISTEN | grep :포트번호
$> netstat -tnlp | grep :80

$> ps -ef | grep 1722

$> curl -v telnet://IP:Port

$> curl -v telnet://127.0.0.1:443
# 연결이 잘 됐을 때
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ...
* Connected to 127.0.0.1 (127.0.0.1) port 443 (#0)

# 방화벽이 막혔을 때
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ... (여기서 멈춤)

# 방화벽 연결이 되고 서비스가 기동 중이 아닐 때 (서비스 포트 안됨)
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ...
* Connection refused
* Failed connect to 127.0.0.1:443; Connection refused
* Closing connection 0
curl: (7) Failed connect to 127.0.0.1:443; Connection refused





[systemctl]
참고 : systemd(system daemon) 을 관리하는 systemctl 명령어 사용법 (lesstif.com)

systemctl start service_name.service // 시작
systemctl stop service_name.service // 중지
systemctl status service_name.service // 상태
systemctl restart service_name.service // 재시작
systemctl enable service_name.service  // 부팅 시 자동 실행 하기
systemctl disable service_name.service  // 부팅 시 자동 실행 하지 않기
systemctl list-units --type=service  // 실행 중인 모든 서비스 보기
systemctl list-units --type service --all  // 모든 서비스 보기


* systemctl 등록
cd /etc/systemd/system/
vim tomcat.service

[Unit]
Description=Apache Tomcat 8 Servlet Container
After=syslog.target network.target
 
[Service]
User=tomcat
Group=tomcat
Type=forking
Environment=CATALINA_PID=/opt/tomcat/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

systemctl daemon-reload  // systemctl 리로딩
systemctl start tomcat
systemctl enable tomcat


[Apache]
$> yum install httpd-devel
$> systemctl start httpd.service
$> systemctl stop httpd.service
$> systemctl status httpd.service


[Tomcat]
$ systemctl enable tomcat


[user]
# 사용자에 그룹 추가
$> usermod -aG 사용자ID 그룹ID
$> usermod -a -G root bbur01

# root로 사용자 변경
$> sudo su

# root로 사용자 변경 (환경정보 load)
$> sudo su -

# 다른 계정으로 변경
$> sudo su - 계정ID

# sudo su - 와 비슷하게 root로 변경하지만 sudoers 정책에 따라 권한이 부여됨
$> sudo -i

# root 사용자로 변경 (환경정보 load)
$> su - 

# 다른 사용자로 변경
$> su - 사용자ID

# 권한을 빌려서 명령어 실행
$> sudo -u 사용자ID command
$> sudo -u root ls
$> sudo -i -u 계정ID

# sudo로 사용할 수 있는 명령어 목록 조회
$> sudo -l



[jenkins 설치]
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo (최신)
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo (안정)
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins


[방화벽]
firewall-cmd --permanent --new-service=jenkins
firewall-cmd --permanent --service=jenkins --set-short="Jenkins Service Ports"
firewall-cmd --permanent --service=jenkins --set-description="Jenkins service firewalld port exceptions"
firewall-cmd --permanent --service=jenkins --add-port=8080/tcp
firewall-cmd --permanent --add-service=jenkins
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload


[부팅 시 서비스 자동 실행 및 실행]
systemctl enable jenkins
systemctl start jenkins

sudo service jenkins start
sudo service jenkins stop
sudo service jenkins restart


[jenkins]
vi /etc/sysconfig/jenkins
JENKINS_PORT="9090"

/etc/init.d/jenkins start

/var/lib/jenkins/secrets/initialAdminPassword



[gradle]
$> sudo mkdir /opt/gradle
$> sudo unzip -d /opt/gradle gradle-3.4.1-bin.zip
$> export PATH=$PATH:/opt/gradle/gradle-3.4.1/bin


[lsof]
# -u : 사용자가 열고 있는 파일
$> lsof -u tibero | grep tbsvr

# -i : TCP/UDP, 포트로 열고 있는 파일
$> lsof -i TCP
$> lsof -i TCP:22-80


[pstack]
$> pstack ${PID} > pstack.log



[Apache 설치 경로 찾기]
$> find / -name "httpd" -exec ls -al {} \;
$> which httpd
$> whereis httpd


[JDK 설치 경로 찾기]
$> which java
$> ls -l (which java 목록에서 나온 결과값)


[Root 비밀번호 변경]
$> sudo passwd root
$> 현재 로그인된 사용자의 암호
$> 새로 생성할 root 비밀번호
$> 새로 생성할 root 비밀번호 확인


[명령어 로그]
# 로그 출력 안함
$> ./shutdown.sh >& /dev/null

# 로그 출력 안함 (1: 정상, 2: 오류)
$> ./shutdown.sh > /dev/null 2>&1


[Watch]
# ls 결과 건수 (1초마다 갱신)
$> watch -n 1 'ls | wc -l'


[파티션 구성]
참고 : https://kimhyun2017.tistory.com/21


[wget]
# 다운받은 stream을 화면에 그대로 출력
$> wget -q -O - 웹주소
$> wget -qO- 웹주소

# 외부IP (인터넷) IP 확인
$> wget -qO- http://api.ipify.org


[curl]
# Response를 화면에 그대로 출력
$> curl -fsSL 웹주소

# 외부IP (인터넷) IP 확인
$> curl -kLs http://api.ipify.org


[IP]
# 인터넷망 IP 조회
$> ip route get 8.8.8.8 | awk '{gsub(".*src", ""); print $1; exit}'

$> HOST_IP=$(ip route get 8.8.8.8 | awk '{gsub(".*src", ""); print $1; exit}')
$> echo $HOST_IP

# 랜카드 IP 조회
$> ifconfig 랜카드명 | grep 'inet ' | awk '{print $2}'
$> ifconfig 랜카드명 | awk '/inet / {print $2}'


[변수]
# 설정 (빈칸 없이)
$> HOST_IP=$(ip addr)
$> echo $HOST_IP

# 해제
$> unset HOST_IP

# 환경변수 정보
$> env

[시스템]
# 최근 기동 시간
$> uptime

# 재부팅 이력
$> last reboot


[KILL]
Kill 관련 블로그 : https://www.lesstif.com/system-admin/unix-linux-kill-12943674.html

# Kill 명령어 목록
$> kill -l

# Kill 강제 종료
# kill 이후 옵션은 "kill -l" 목록과 동일하며 숫자 또는 목록에서 "SIG" 문구를 제외한 문자열과 동일함
$> kill -9 ${PID}
$> kill -KILL ${PID}

# Kill Graceful 종료
$> kill -15 ${PID}
$> kill -TERM ${PID}

# Process의 PID 찾아서 종료
# "grep -v grep"은 grep 더미 프로세스를 제외함
$> ps -ef | grep java | grep -v grep | awk '{print "kill -TERM "$2}' | sh -x

# PID (Process ID), PPID (Parent Process ID), PGID (Process Group ID), SID (Session ID)
참고 : https://leeyh0216.github.io/posts/sid_pid_ppid_pgid/
$> ps -A -o pid,ppid,pgid,sid,command

# PGID로 Parent -> Child Process 모두 종료하기
$> kill -- -PGID
$> kill -- -827
$> pkill -g PGID
$> pkill -TERM -g 827

# SID로 종료하기 (접속하고 있는 shell 까지 종료됨)
$> pkill -15 -s SID
$> pkill -TERM -s 2748

# Parent -> Child Process 구조에서 Child Process의 PGID를 Parent Process와 다르게 할 경우
parent.sh에서 작성

#!/bin/bash

set -o monitor
./child.sh


[Replace - 치환]

# config.properties 파일 내의 /home/www => /home/apps로 변경
sed -i 's/\/home\/www/\/home\/apps/g' config.properties

# 현재 경로에서 xml 확장자 파일 내의 asd => dsg로 변경 (대소문자 구분 안함)
sed -i "s/asd/dsg/ig" $(find . -type f -name "*.xml")

# /apps 경로에서 xml 확장자 파일 내의 asd => dsg로 변경 (대소문자 구분 안함)
sed -i "s/asd/dsg/ig" $(find /apps -type f -name "*.xml")

# 치환 다른 방법
#     -r : 문자열 검색 옵션
#     -l : 해당 경로(파일명 포함)만 표시
grep -r -l abc * | xargs sed -i 's/abc/def/g'
grep -rl abc . | xargs sed -i 's/abc/def/g'

# xml 확장자 파일만 변경
grep -rl abc --include \*.xml | xargs sed -i 's/abc/def/g'



[VI]
# Vi 설정
~/.vimrc
/etc/vimrc
/etc/vim/vimrc
/etc/vim/vimrc.local

# 현재 파일 확인
Ctrl + G

# 현재 파일 경로 확인
1, Ctrl + G
:!realpath %

# 되돌리기 (undo)
u

# 되돌리기를 되돌리기 (redo)
Ctrl + R

# 치환 (replace)
:%s/[원본단어]/[바꿀단어]/[옵션]
:%s/foo/bar/i => foo를 bar로 변경 (대소문자 구분 없이 첫 번째 찾은 단어만 변경)
:%s/foo/bar/g =>foo를 bar로 변경 (문서 전체) 
:%s/foo/bar/c => foo를 bar로 변경을 확인한다. foo에 focus가 됨, (interactive (대화형))
                        사용자에게 변경할 지 여부를 확인한다.
                        replace with bar (y/n/a/q/l/^E/^Y)?
                        - y: 현재 focus된 단어를 변경하고 다음 단어에 focus
                        - n: 현재 focus된 단어를 변경하지 않고 다음 단어에 focus
                        - a: 더 이상 묻지 않고 모든 단어 변경
                        - q: 변경하는 것을 멈춤
                        - l: 현재 focus된 단어를 변경하고 멈춤
:%s/foo/bar/igc => foo를 bar로 변경 (대소문자 구분 없이, 문서 전체를 변경하면서 변경 여부를 물어본다)
:%s/\/etc\file.txt/\/opt\/user\/data\/file.txt/g => 치환 문자에 경로가 포함된 경우 \/ 로 처리
:%s/\n//g => 문서 내 개행 (줄바꿈) 문자를 모두 없앰 

# 멀티 주석 추가
1. esc를 눌러 명령어i 모드 진입
2. 주석 시작 위치로 이동 후 Ctrl + v를 누르고 cell 편집 모드로 변경되면 화살표 키를 이용하여 세로로 블록 지정
3. Shift + i 로 입력모드 변경하고 주석 문자인 #을 입력 (맨 첫 줄만 #이 삽입된다)
4. esc 키를 누르고 수 초를 기다리면 블록된 라인 주석 처리 됨

# 멀티 주석 추가
1. esc를 눌러 명령어 모드 진입
2. v를 누르면 visual 모드로 전환 되는데 hjkl 을 사용하여 (화살표 키 사용하면 안됨) 블록 지정
3. :를 누르면 :'<,'> 이 표시가 되는데 그 문자를 놔두고 아래처럼 입력
:'<,'>norm i원하는문자
:'<,'>norm i#

# 멀티 주석 삭제
1. esc를 눌러 명령어 모드 진입
2. 주석 시작 위치로 이동 후 Ctrl + v를 누르고 cell 편집 모드로 변경되면 화살표 키를 이용하여 세로로 블록 지정
3. x 버튼을 클릭하여 삭제

# 멀티 주석 삭제
1. esc를 눌러 명령어 모드 진입
2. v를 누르면 visual 모드로 전환 되는데 hjkl 을 사용하여 (화살표 키 사용하면 안됨) 블록 지정
3. :를 누르면 :'<,'> 이 표시가 되는데 그 문자를 놔두고 아래처럼 입력
:'<,'>norm 1x (앞쪽 1개의 문자가 삭제됨)
:'<,'>norm 2x (앞쪽 2개의 문자가 삭제됨)

# Encoding (Charset) 확인
1. esc를 눌러 명령어 모드 진입
2. :set encoding

# Encoding (Charset) 변경하여 보기
1. esc를 눌러 명령어 모드 진입
2. :e ++enc=UTF-8
    :e ++enc=EUC-KR

# Encoding (Charset) 변경하여 저장
1. esc를 눌러 명령어 모드 진입
2. :set fileencoding=UTF-8
    :set fileencoding=EUC-KR



# 붙여넣기 시 탭 들여쓰기 없애기

# 현재 설정 확인
# 기본으로는 paste 옵션이 없음
:set

# paste 옵션 설정 (붙여넣기 시 자동 들여쓰기 안함)
:set paste

# nopaste 옵션 설정 (붙여넣기 시 자동 들여쓰기 함)
:set nopaste

# paste / nopaste 옵션을 단축키 (F2)로 설정하기
# 
$> vi ~/.vimrc
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode


[Profile]
vi ~/.bash_profile

#!/bin/bash

# 폴더/파일을 생성할 때 기본 퍼미션 조정
# Default : 0002
# 설정된 umask 확인 : umask
# 설정된 umask 문자열로 확인 : umask -S
# 폴더 : 777 권한에서 umask에 설정된 값을 뺀 권한이 실제 권한
# 파일 : 폴더 권한에 실행권한(1)을 뺀 권한이 실제 권한, 666에서 시작
# 예제
#     0000 : 폴더 권한(777), 파일 권한(666)
#     0001 : 폴더 권한(776), 파일 권한(665)
#     0002 : 폴더 권한(775), 파일 권한(664)
#     0022 : 폴더 권한(755), 파일 권한(644)
#     0077 : 폴더 권한(700), 파일 권한(600)
umask 022

### AIX 전용
# vi 사용하듯이 편집기 사용
# set -o vi

# back space 적용
# stty erase ^?


[폴더 삭제]
# 하위 폴더만 삭제
find 상위경로 -mindepth 1 -type d -exec rm -rf {} \;

# 하위 폴더만 삭제
ls -al | grep ^d | grep -wv "\." | awk '{print $NF}' | xargs rm -rf

# 특정 폴더에서 하위 폴더만 삭제
ls -al /경로 | grep ^d | grep -wv "\." | awk '{print $NF}' | xargs rm -rf

# .svn 파일 삭제
find . -name .svn -print0 | xargs -0 rm -rf
FOR /R %1 %%1 IN (.svn) DO RMDIR /S /Q "%%1" (Windows 버전)


[Echo Color 적용]
참고 : https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux

# 사용예제

# -e : 백슬래시 escape를 활성화하는 옵션

# 강조된 Red로 출력
$> ehco -e "\033[0;91m<TEXT>\033[0m"

# Bold & 강조된 Yellow로 출력
$> echo -e "\e[0;93m<TEXT>\e[0m"



# Color/Style 샘플

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White


# Escape 문자

|       | bash  | hex     | octal   | NOTE                         |
|-------+-------+---------+---------+------------------------------|
| start | \e    | \x1b    | \033    |                              |
| start | \E    | \x1B    | -       | x cannot be capital          |
| end   | \e[0m | \x1b[0m | \033[0m |                              |
| end   | \e[m  | \x1b[m  | \033[m  | 0 is appended if you omit it |
|       |       |         |         |                              |


# 예제

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |




[LVM - Logical Volume Manager]
개념 : https://tech.cloud.nongshim.co.kr/2018/11/23/lvmlogical-volume-manager-1-%EA%B0%9C%EB%85%90/
* 용어
  - PV (Physical Volume) : LVM에서 물리적인 디스크를 사용하기 위해 PV로 초기화가 필요, PE의 그룹
  - PE (Physical Extent) :  PV를 구성하는 일정크기 블록으로 LVM2에서는 4MB, LV의 LE와 1:1 대응됨
  - VG (Volume Group) : PV의 집합으로 LV를 할당 할 수 있음
  - LV (Logical Volume) : 논리 스토리지로 사용자가 최종 사용하게 되는 볼륨, LE의 그룹
  - LE (Logical Extent) : LV를 구성하는 블록으로 PE 사이즈와 동일

# VG 확인
$> vgs
$> vgdisplay
VG             #PV   #LV   #SN    Attr       VSize         PFree
ubuntu-vg    1      1      0        wz--n-   <464.26g    <264.26g     => 500GB 디스크임, 464GB 중 200GB는 할당되어 있고 264GB가 현재 남아 있음

# PV 확인
$> pvs
$> pvdisplay
PV                     VG             Fmt    Attr   PSize      PFree
/dev/nvme0n1p3  ubuntu-vg    lvm2   a--   <464.26g <264.26g

# LV 확인
$> lvs
$> lvdisplay
LV            VG             Attr           LSize        Pool   Origin   Data%   Meta%   Move   Log   Cpy%Sync   Convert
ubuntu-lv   ubuntu-vg   -wi-ao----   200.00.g

# PV 생성
$> pvcreate /dev/sdb1     => 두번째 ssd의 첫번째 파티션을 PV로 생성
$> pvs
PV                    VG              Fmt    Attr   PSize      PFree
/dev/sdb1                            lvm2   ---   220.0g    220.0g
/dev/nvme0n1p3  ubuntu-vg    lvm2   a--   <464.26g <264.26g

# VG 확장
$> vgextend ubuntu-vg /dev/sdb1    => 500GB 중 200GB만 할당된 ubuntu-vg에 /dev/sdb1을 확장함
$> vgs
VG             #PV   #LV   #SN    Attr       VSize         PFree
ubuntu-vg    2      1      0        wz--n-   <684.26g    <484.26g

# LV 확장
$> lvextend -L+220G /dev/ubuntu-lv


# MBR / GPT
- MBR : 주 파티션 4개까지 사용, 디스크 최대 용량 2TB, BIOS가 설치된 PC에서 사용
- GPT : 주 파티션 128개까지 사용, 디스크 최대 용량 9.4ZB, UEFI가 설치된 PC에서 사용
* 파티션 툴을 사용할 때 MBR은 fdisk, GPT는 parted를 사용

# Partition 확인
$> parted -l
$> fdisk -l

# Partition 명령어
$> parted /dev/sda
$> fdisk /dev/sda (/dev/sda는 device의 sd (ssd)의 a (첫번째 디스크))
$> fdisk /dev/nvme0n1 (첫번째 nvme 디스크)

# Partition 분할 (디스크 추가로 삽입한 경우)
$> parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary 0 3TB     => 0부터 3TB를 첫번째 파티션으로 설정
(parted) mkpart primary 3TB 100%     => 3TB 이후 모든 용량을 두번째 파티션으로 설정
(parted) print     => 파티션 확인
(parted) quit

# Format
$> mkfs.ext4 /dev/sdb1
$> mkfs.ext4 /dev/sdb2

# Mount
$> mount /dev/sdb1 /logs
$> mount /dev/sdb2 /backup

+ Recent posts