0부터 시작하는 Linux 공부 - Storage & 편집기 & SSH

Jaehong Lee·2022년 7월 21일
0
post-thumbnail

1. Storage

  • 클라우드가 퍼지면서 리눅스도 퍼짐
  • 다양한 오픈 소스 프로그램들과 x86 가상화가 가능해지면서, 기존 네트워크 장비 개발 업체들도 클라우드 시장에 뛰어들었다. 이때, 스토리지 관련 업체가 가장 큰 이익을 얻고 있다

Storage는 왜 필요할까?

  • 컨테이너는 삭제되면, 안에 데이터가 삭제된다. 이 데이터를 유지시키기 위해, 물리 서버의 디스크에 마운트해서 데이터를 물리 서버의 디스크에 저장시킨다. 이로써, 컨테이너가 삭제되더라도 해당 데이터를 안전하게 서버에 저장할 수 있다
  • 만약, 컨테이너를 옮긴다면, 도커는 해당 컨테이너의 설정 파일을 보고, 디스크를 마운트하는데, 해당 설정 파일에서는 이전 서버의 로컬 디스크의 위치를 나타내기에 현재 서버의 디스크에 마운트가 불가능하다. 따라서, 이를 해결하기 위해 외부 스토리지에 마운트 한다
  • 영구적으로 제공해주는 볼륨을 Persistent Volume 이라고 한다. 이 Volume은 Block Storage 에서 제공해준다. 이를 통해, 컨테이너가 이동 혹은 삭제되도, 해당 데이터는 영구적으로 Volume에 저장되기에, 재생성해서 다시 Mount하면 기존 인스턴스를 복구할 수 있다
  • 따라서 클라우드 시장에서는 이 외부 스토리지가 필수적이다

Storage의 종류

  1. Block Storage : 클라우드에서 주로 사용하며, Persistent Volume 을 제공해준다
  2. File Storage : NAS , 트리 형태
  3. Object Storage : Key-Value 형태이며 Flat한 구조이다. 계정별로 공간을 제공한다

2. 행 단위 편집기

  • 행 단위 편집기 : sed -> 파일을 열지 않고, Shell 상에서 특정 단어를 변경하는 등의 내용을 작성하면 이를 파일에 반영시킬 수 있다

    • sed -i(변경한다) 's/old/new/' abc.txt -> abc.txt 파일 내에서 만나게 되는 첫번째 old 를 new 로 변경하며, 만약, g를 사용한다면, 파일 전체의 old 를 new 로 변경한다
    • 만약, 변경된 내용을 변수를 이용하여 처리하고 싶다면 ' 대신 " 를 사용하면 된다
  • SED 써보기

  • 디렉토리를 생성하고, 안에 파일을 생성하여 내용을 cat << EOF 를 통해 내용을 추가한다
  • 다시 내용을 수정하고, sed 를 통해 내용을 수정했다

3. 화면 단위 편집기

  • 화면 단위 편집기 : vi(m) - vi의 성능 개선 버전

    • vi와 vim 둘 다 있지만, alias를 통해 vi = vim 이라고 되있기에 vi로 실행해도 vim이 실행된다
  • Vi(m) 써보기

  • 파일을 수정하고, vi로 연다

  • : set nu 로 줄 번호를 표시해준다

  • : set no nu 로 줄 번호를 없앨 수 있다

  • 이동 , 복사 , 삭제 , 복구 와 같은 명령어는 편집기 편을 참조하자 ( $ , gg , yy , p , dd , u 등등 )

  • ' / ' 로 검색하며, 검색 결과는 N , n 로 제어

  • 3G 는 3 번째 줄로 이동

  • I 는 입력 모드 , O 는 한 줄 띄우고 입력 모드

  • 현재 입력한 내용은 파일에 저장된 것이 아닌, 버퍼에 저장되있다. 이를 저장해야지 파일에 적용된다

  • ESC 로 입력 모드로 이동해서 : 을 통해 마지막 행 모드로 이동하고, wq 를 통해 저장하고 나가자

  • cat 으로 확인해보면 잘 저장되었다

  • 간혹 편집기에서 wq 로 저장 후 빠져나오려고 하더라도, 퍼미션 문제로 종료되지 않는 경우가 있다. 이 경우에는 강제 종료를 위해 ! 를 써서 :wq! 로 빠져나와야 한다

4. Vi & SED

  • Vi 에는 SED가 포함되어 있다
  • : 을 통해 SED를 호출해서 사용할 수 있다
  • 다음과 같이 SED를 사용 가능하다. s 만 사용하면 현재 커서가 있는 행에만 적용된다
  • %s 와 g 를 사용하면, 파일의 특정 문자열을 전부 변경한다

5. Quiz

sed 를 이용하여 test.txt 파일 내에 있는 섹션 [database] 아래에 1.1.1.1 이라는 Ip 주소를 추가하라

  • 다음과 같이 6 행에 [database] 라고 작성하고, 저장하고 빠져나가자
  • 다음과 같이 -e 옵션을 사용한다. 7 i 는 7 번째 줄을 의미한다
  • 이렇게 해도 된다. 여러 방법이 있다
  • 만약 [database] 로 쓰고 싶으면 ' [ , ] ' 앞에 ' \ ' 를 추가하여 써야 된다
    • -e 는 정규 표현식을 쓸 수 있게 하여 ' \ ' 를 사용할 수 있다. 이를 동해 [ , ] 를 정규 표현식이 아닌 문자 그래도 사용할 수 있게 해준다
    • a는 append 로 밑 줄에 추가해주는 옵션이다 ( a\ ). g 줄에 추가하려면 i를 사용하면 된다
    • -r 은 한 행을 읽는 옵션이다

6. 편집기를 이용하여 인터페이스 이름 변경

  • 서버의 Len Card 에는 보통 4개의 포트가 있어야한다. 포트는 슬롯에 들어있다
  • CentOS7 버전 이후로 인터페이스의 이름은 다음의 과정을 거쳐 결정되도록 설정되어 있다
  • 이전에는 eth0 , eth1 ... 이었다
  • 이제는 ens ( slot ) -> enp ( port ) 이다. 먼저, ens 를 확인하여 slot을 확인하여 이름을 결정. 만약 slot이 같다면, 그 다음 enp 를 통해 해당 slot의 port 를 확인하여 이름을 결정
  • port 도 같으면 eno ( bios ) 를 통해 bios 이름을 이용하여 결정한다
  • 이번에는 사용자가 직접 정의한 인터페이스 이름을 사용할 것 이다
  • /etc/default/grub 파일을 vim 편집기로 열어주자
  • grup 은 멀티 부트 로더 중 하나로, 부트 로더는 리눅스를 켰을 때, 가장 먼저 실행되고 리눅스 OS의 커널을 로드하고 파라미터를 커널에 넘겨주는 등 부팅 전반에 걸친 작업을 수행한다
  • 다음을 추가해준다. net의 인터페이스 네임을 가지고 결정하는 것을 허용하지 않고, bios 로 이름을 결정하는 것을 허용하지 않는다. 0을 통해 허용하지 않는 것 이다
  • 해당 경로로 와서 ifcfg- 로 시작하는 파일을 출력한다. ens32 와 io 에 대한 설정 파일이 나온다
  • 이름을 바꾸고 편집기로 열자
  • 다음 설정을 빼고, 나머지는 다 삭제해주자
    • TYPE : 포트 타입. 이더넷 이기에 FRAME 처리 가능. 밑에 Ip가 들어있기에 L3 포트다
    • BOOTPROTO : 부팅할 때 어떤 프로토콜 쓸지를 의미한다. 이를 DHCP라고 쓰면, 아래 Ip가 설정되있어도, DHCP 를 통해 Ip를 받아오는데, None 이므로 Ip를 직접 설정해야 한다
    • 우린 여기서 이름을 바꿔주면 된다

  • Vim 내에서 SED 를 호출하여 변경했다
  • 변경된 사항을 grub에 적용시켜주자. 이후 reboot 으로 재부팅 하자. grub2는 grub 2 버전이다
  • 확인하면 잘 바뀌었다
  • 정상적으로 바뀌었으므로 외부와의 통신도 잘 된다

7. SSH 연결

  • 서버 확인 ( 클라이언트가 서버를 확인 )
    • 서버에는 /et/ssh/.pub 에 서버 확인에 사용할 public key를 가지고 있다
    • 클라이언트가 서버에 접속 요청을 하면 서버는 public key 를 전송하여 클라이언트의 known_hosts에 저장한다
    • 다시 접속 요청을 하면, 또 public key 를 전송한다. 클라이언트는 자신에게 온 key 가 처음 보는 key면, 다시 접속하려는 서버가 아닌 것을 인지하고, 접속하지 않는다
    • 만약, 받은 key 가 known_hosts 에 저장된 key와 동일하다면, 해당 서버가 접속하려는 서버임을 인지하고, 접속한다

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

  • 사용자 확인 ( 서버가 사용자를 확인 / 인증 )
    • 서버 확인이 끝났자면, 사용자 확인을 마쳐야 Data 송수신이 가능하다
    • password ( 대칭키, PSK - Pre Shared Key ) 방식은 안전하지 않다. 따라서, Key-Pair 방식을 사용한다. 이 비대칭키는 private key는 클라이언트한테, public key는 서버의 authorized_keys 에 저장한다
      • Key-Pair 는 어디서 만드냐는 중요하지 않다. 어디서든 만들어도 되지만, 반드시 한 쌍의 비대칭키여야 하며, Private Key는 클라이언트에게, Public Key는 서버에 있어야 한다
      • 실습에서 한 방식 처럼 할려면 Data 송수신으로 Key를 보내주므로, 사용자 인증이 끝나지도 않았는데 보내준 것 이다. SSH-COPY-ID도 Data 송수신으로 사용자 인증 전에는 사용하지 못한다. 안전하지 않기 때문이다
      • 만약, SSH-COPY-ID를 통해 Key를 주고 받을려면 Password 인증이 필요하다. 허나, 우리는 Password 인증을 사용하지 않기로 해서, Private Key를 직접 복사해서 붙여넣기 했다. 이 역시 안전하지 않다
    • 클라이언트가 key id 를 보내주면, 서버는 무결성 검사를 위해 난수를 생성하여, 해당 id의 public key 로 암호화하여 보내준다. 이는 한 쌍의 private key 로만 복호화할 수 있다
    • 클라이언트는 이 복호화한 난수가 원본인지 위조된 것 인지 해시 함수에 넣어서 나온 문자열을 서버에 보내준다. 서버에서도 해시 함수에 난수를 넣어 나온 문자열과 받은 문자열을 비교하여 무결성 검사를 한다
    • 두 문자열이 같으면 세션을 형성하여 Data 송수신을 한다
    • 이때 Data는 세션키로 암호화해서 송수신 한다

8. 클라우드 상에서의 SSH 연결

  • control node 에서 key를 만들어 private 키는 사용자에게 준다
  • public 키를 베이스 이미지에 넣으면, 모든 인스턴스에 같은 public 키를 가지므로, 인스턴스가 생성될 때 이 인스턴스에 public 키를 넣어준다
  • 키를 사용자가 따로 가져올 필요 없이 컨트롤 노드에서 --upload 를 통해 서버와 클라이언트에게 키를 넣어준다
profile
멋진 엔지니어가 될 때까지

0개의 댓글