Kylian 태그 관리 글쓰기 방명록
분류 전체보기 (18)
2023-11-30 10:42:55

유닉스의 기본 편집기인 VI 에디터를 개량한 버전이, 바로 VIM (빔) 에디터입니다.

따라서 본질적인 차이는 없습니다.

VIM 은, "Vi IMproved (향상된 Vi)"의 약자입니다.

 

1976년에 빌 조이가  VI 편집기를 만들었습니다.

vi라는 이름은 한 줄씩 편집하는 줄단위 편집기가 아니라 한 화면을 편집하는 비주얼 에디터(visual editor)라는 뜻에서 유래했습니다.

간결하면서도 강력한 기능으로 사용자가 많습니다.

리눅스에는 vim 에디터만 설치되어 있습니다.

소문자로 vi 라고 치면 vim 이 실행되고, vim 이라고 쳐도 vim 이 실행됩니다.

리눅스에서는 vi를 쓸지 vim을 쓸지 고민하지 않아도 됩니다. 둘다 똑같은 것입니다.

vim 안에는 vi 의 기능들도 다 포함되어 있기에, 유닉스를 다룬다고 하더라도 vi 를 따로 익힐 필요는 없습니다.

 

삽입

키기능

i 커서 위치에 Insert
I 줄 맨 앞에서 Insert
a 커서 다음에 Insert
A 줄 맨 뒤에서 Insert
o 커서 아래로 한 줄 띄우고 Insert
O 커서 위로 한 줄 띄우고 Insert

i / a / o 를 누르면 -- INSERT -- 모드로 변경돼서 입력이 가능하다.

 

이동

키기능 

개인적으로 많이 쓰는 이동키는 {} 와 :$ / :^ 이다.

그리고 전체 삭제할 땐 :1,$d를 누르면 해당 파일의 전체 내용이 삭제된다.

   
w 단어 첫 글자 기준으로 다음으로 이동
W 공백 기준으로 다음(단어의 시작)으로 이동
b 단어 첫 글자 기준으로 이전으로 이동
B 공백 기준으로 이전으로 이동
e 단어 마지막 글자 기준으로 다음으로 이동
E 공백 기준으로 다음(단어의 끝)으로 이동
gg 문서 맨 앞으로 이동
G 문서 맨 아래로 이동
^ 문장 맨 앞으로 이동
$ 문장 맨 뒤로 이동
{ 띄어쓰기가 있는 문단의 맨 앞으로 이동
} 띄어쓰기가 있는 문단의 맨 뒤로 이동

 

참고사항 : vi 편집기가 아닌 커맨드라인(명령줄)에서  

맨 앞으로 가고 싶을 땐  ctrl + a (append)  

맨 뒤로 가고 싶을 땐  ctrl + e (end)  

 

검색

:/단어 = 검색할 단어를 검색, `n`과 `N`으로 다음/이전 찾기

:se nu = 코드 줄 번호를 볼 수 있다. (set number의 약자로 se nu라고만 입력해도 줄 번호를 볼 수 있다.)

:se nonu = set number 모드를 취소할 수 있다.

ex) :3   =   3번째 줄로 커서를 이동시킬 수 있다.

 

편집

키기능 = 복사, 붙여넣기, 잘라내기 할 때 유용하다.

ex) 만약 잘 못 삭제한 코드가 있다면 u를 입력해서 되돌리기가 가능하다.

5줄을 동시에 복사할 땐 5y를 하면 5줄이 복사되고 붙여넣고 싶은 줄에 p를 입력하면 5줄이 복사된다.

dd 현재 줄 잘라내기
yy 현재 줄 복사하기
p 붙여넣기
u 실행취소 (Undo)
ctrl + r 재실행 (Redo)
v Visual모드
y 복사
c 잘라내기

 

저장

키기능 : 코드 수정 후에 저장 또는 저장하지 않고 닫기를 해야 한다.

:w 저장
:q 닫기
:q! 저장하지 않고 닫기
:wq 저장하고 닫기
:숫자 지정한 줄 번호로 이동

 

h, j, k, l - 좌,하,상,우 커서이동
i - 현재 커서 위치에 Insert 하기
I - 현재 줄 맨앞에 Insert 하기
a - 현재 커서 다음칸에 Insert 하기
A - 현재 줄 맨뒤에 Insert 하기
O - 윗줄에 Insert 하기
o - 아랫줄에 Insert 하기

w - 단어 첫글자로 이동하기
W - 화이트스페이스 단위로 다음 글자로 이동하기
b - 백워드 방향으로 단어의 첫글자로 이동하기
B- 백워드 방향으로 화이트스페이스 단위로 다음 글자로 이동하기
e - 단어의 마지막 글자로 이동하기
ge - 백워드 방향으로 단어의 마지막 글자로 이동하기
gg - 문서 맨 앞으로 이동
G - 문서 맨끝으로 이동
^ - 문장 맨 앞으로 이동
0 - 라인 맨 앞으로 이동
$ - 문장 맨 뒤로 이동
f문자 - 문자의 위치로 이동 ; 를 누르면 계속 이동
F문자 - 백워드로 문자의 위치로 이동
t문자 - 문자의 앞위치로 이동
T문자 - 백워드방향으로 문자의 앞위치로 이동

/단어 - 문서에서 단어 찾기 n이나 N으로 다음/이전 찾기
* - 현재 단어를 포워드 방향으로 찾기
# - 현재 단어를 백워드 방향으로 찾기

Ctrl + f - 다음 페이지 이동
Ctrl + b - 이전 페이지 이동
Ctrl + u - 페이지절반만큼 다음으로 이동
Ctrl + d - 페이지절반만큼 이전으로 이동
H - 현재 화면의 맨 위라인으로 이동
M - 현재 화면의 중간 라인으로 이동
L - 현재 화면의 마지막 라인으로 이동

]] - 포워드 방향으로 여는 컬리 블레이스( { )로 이동
[[ - 백워드 방향으로 여는 컬리 블레이스( { )로 이동
][ - 포워드 방향으로 닫는 컬리 블레이스( { )로 이동
[] - 백워드 방향으로 닫는 컬리 블레이스( { )로 이동
% - {}나 ()에서 현재 괄호의 짝으로 이동

dd - 현재 줄 잘라내기
dw - 단어 잘라내기
yy - 현재 줄 복사하기
p - 붙혀넣기
r - 현재 글자 교체하기
u - Undo
Ctrl + R : Redo
x - 현재 글자 지우기
X - 앞의 글자 지우기
> - 들여쓰기
< - 내어쓰기
. - 이전 명령어를 다시 실행

v - 비쥬얼모드(비쥬얼 모드에서 커서 이동해서 블럭지정 가능)
y - 복사하기
c - 잘라내기
cw - 단어 잘라내기
J - 다음 라인을 현재 줄의 끝으로 이어 붙힘
~ : 선택 문자 대소문자 변경
Ctrl + A : 숫자를 증가시키기
Ctrl + X : 숫자를 감소시키기

:w - 문서 저장하기
:q - 현재 문서 닫기
:q! - 저장하지 않고 닫기
:wq - 저장하고 닫기
:숫자 - 지정한 라인넘버로 이동

:new - 가로로 분할된 창 열기
:vs - 세로로 분할된 창 열기
Ctrl + w - 분할창 간에 이동하기
:tabnew - 새로운 탭 열기
:gt - 다음 탭으로 이동하기
:gT - 이전 탭으로 이동하기
:e ./ - 현재 탭에 오픈할 파일 탐색하기( ./ 는 현재위치에서 탐색 시작)
:colorscheme 스키마명 - VIM의 칼라스키마를 변경함(blue, desert, evening 등.. 스키마명에서 탭누르면 자동완성됨)

zc - 코드 접기(fold)
zo - 접힌 코드 펼치기
zd - fold 지우기
zR - 접힌 코드 모두 펼치기
zM - 코드 모두 접기
zD - 모든 fold 지우기

:buffers - 현재 Vim에서 여러 파일을 열었을때 버퍼에 있는 목록 확인
:buffer 숫자 - 버퍼 목록에 나온 숫자를 입력하면 해당 파일을 오픈함 ( :buffer 대신 :b 도 가능)
:bnext - 버퍼에 있는 다음 파일로 이동 ( :bn 도 가능)
:bprevious - 버퍼에 있는 이전 파일로 이동 ( :bp 도 가능)
:ball - 버퍼 목록에 있는 파일들이 가로로 분할된 창에 열림

 

 

 

참고

https://wayhome25.github.io/etc/2017/03/27/vi/

https://velog.io/@courage331/Vim%EA%B3%BC-Vi-%EC%B0%A8%EC%9D%B4

'주요 개념 > 리눅스' 카테고리의 다른 글

Linux 리눅스 프로세스 확인 명령어(ps, ps -ef, grep)  (0) 2023.11.18
VMware Centos7 Nginx 설치하기  (0) 2023.11.13
사용자 계정  (0) 2023.06.14
2023-11-25 16:23:32

TCP란? (Transmission Control Protocol)

TCP란 인터넷 상에서 데이터를 메시지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜을 말한다.

TCP는 애플리케이션에게 신뢰적이고 연결지향성 서비스를 제공한다.

즉, 서버와 클라이언트 간에 데이터를 신뢰성있게 전달하기 위해 만들어진 프로토콜이다. 

그리고 TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위해 3-Way Handshake를 사용한다.

TCP 3 Way handshake

통신을 시작하거나 데이터를 전송하기 전에 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정(연결)을 의미한다.

Client > Server : TCP SYN

Server > Client : TCP SYN ACK

Client > Server : TCP ACK

 

여기서 SYN은 'synchronize sequence numbers', 그리고 ACK는'acknowledgment' 의 약자이다.

이러한 절차는 TCP 접속을 성공적으로 성립하기 위하여 반드시 필요하다.

  1. SYN
    A클라이언트가 B서버에 연결 요청을 보내기 위해 SYN 패킷을 전송한다.
    이 패킷에는 클라이언트가 사용할 초기 시퀀스 번호가 포함되어 있다
    이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다.
  2. SYN-ACK
    B서버는 A클라이언트의 SYN 요청을 받고, 연결을 수락한다는 의미로 SYN-ACK 패킷을 보낸다.
    이 패킷에는 서버가 사용할 초기 시퀀스 번호와 클라이언트의 시퀀스 번호에 1을 더한 값이 포함된다
    이때 B서버는 SYN_RECEIVED 상태가 된다.
  3. ACK
    마지막으로 A클라이언트는 B서버에게 ACK를 보내서 연결 요청에 대한 응답을 한다.
    이후부터 연결이 이루어지고 데이터가 오가게 된다.
    이 ACK 패킷에는 서버의 초기 시퀀스 번호에 1을 더한 값이 포함된다.
    이때의 B서버 상태가 ESTABLISHED 이다.
  4. 데이터 전송 시작
    → 이러한 과정을 통해 클라이언트와 서버는 신뢰성 있는 데이터 전송을 위한 TCP연결을 설정하고 통신을 시작한다

4-Way Handshake

3-Way Handshake는 TCP의 연결을 초기화 할 때 사용한다면,

4-Way Handshake세션을 종료하기 위해 수행되는 절차이다.

  1. 클라이언트 FIN 플래그
    A클라이언트가 B서버에 연결을 종료하겠다는 FIN 플래그를 전송한다.
  2. ACK
    B서버는 A클라이언트에게 ACK(확인메시지)를 보내고, 자신의 통신이 끝날 때까지 기다린다.
    이때 B서버는 TIME_WAIT 상태가 된다.
  3. 서버 FIN 플래그
    B서버가 통신이 끝났으면 연결이 종료됐다고 A클라이언트에게 FIN 플래그를 전송한다.
  4. ACK
    → A클라이언트는 B서버에 확인했다는 메시지(ACK)를 보낸다.

만약 B서버에서 FIN을 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송으로 인해 FIN 패킷보다 늦게 도착한다면?    뒤늦게 도착한 패킷은 유실되어 데이터 손실 발생

⇒ 이런 상황에 대비해 A클라이언트는 B서버로부터 FIN을 수신해도 일정시간(디폴트 240초)동안

세션을 남겨놓고 잉여 패킷을 기다리는데 이 과정을 TIME_WAIT라고 한다.

 

2023-11-23 11:32:38

Linux 외부(인터넷)으로 핑(ping)이 안나간다면?

1. 물리적 장치를 확인한다.

- 랜선이나 전원 코드가 잘 꼽혀있는지 확인

2. 네트워크 인터페이스 카드를 확인한다.(NIC)

확인방법은 3가지가 있다.

- nmcli (Network Manager Command-Line Interface)

nmcli를 사용하면 Network Manager 및 네트워크 상태, Linux 시스템에서 네트워크 장치 및 연결을 관리하고 구성하는 데 사용할 수 있는 명령어이다. 새 네트워크 연결 만들기, 기존 연결 수정, 네트워크 장치 관리와 같은 네트워크 구성을 위한 포괄적인 기능을 제공한다. 명령줄 작업을 선호하는 사용자에게 유용한 도구이다. 시간이 절약되고 자신감이 생기며 스크립트에서 사용할 수 있으며 Linux 서버 네트워킹 문제를 해결하고 기능을 신속하게 복구하기 위해 사용하는 첫 번째 도구이다.

nmcli dev status (사용 가능한 모든 장치의 상태 표시)
nmcli dev show <장치 이름(ex.ens33)> (해당 장치의 구성 세부 정보 출력)
nmcli con show (사용 가능한 모든 연결의 상태를 표시)
nmcli con show ens33 <연결 이름> (해당 연결의 세부 정보 출력)
nmcli con add con-name <연결 이름> ifname <인터페이스 이름> type <연결 타입>

<연결 이름>을 원하는 연결 이름으로, <인터페이스 이름>을 사용하려는 인터페이스 이름으로, <연결 타입>을 생성하려는 연결 유형(예: 이더넷, wifi 등)으로 작성한다.
nmcli con up <연결 이름>  (해당 이름의 연결이 활성화 된다.)
nmcli con down <연결 이름> (해당 이름의 연결이 비활성화) 
nmcli con edit <연결 이름> (해당 연결의 구성을 변경할 수 있는 대화형 편집기가 열린다.)
nmcli con mod <이름> ipv4.addresses <ip/24> ipv4.gateway [gateway ip] ipv4.dns [dns ip] 

<이름>을 수정하려는 연결로 바꾸고 <IP/24>로 원하는 IP 주소와 서브넷 마스크로 바꾼다. 게이트웨이와 DNS서버도 등록 가능

- nmtui (Network Manager Text User Interface)

nmtui는 Network Manager를 사용하는 Linux에서 연결을 관리할 수 있는 간단한 TUI(Text User Interface) 화면을 제공한다. nmcli의 기능을 화면으로 볼 수 있는 그래픽 인터페이스를 제공한다. 그래픽 화면을 제공하기 때문에 nmcli 명령줄 입력을 선호하지 않는 사용자에게 보다 쉽고 간단하게 네트워크 구성을 할 수 있도록 편의를 제공해준다.

nmtui 초기 화면 = 3가지 기능 제공(연결 수정, 연결 활성화, 호스트네임 수정)
Edit a connection 화면 = 네트워크 세부사항을 수정할 수 있다.
Activate a Connection 화면 = NIC(ens33)에 *별 표시가 들어와야 활성화가 됐다는 뜻이다.
Set System Hostname = nmtui에서는 호스트 네임도 쉽게 변경할 수 있다.

- vi /etc/sysconfig/network-scripts/ifcfg-ens33

  1. TYPE= 여기에 이더넷 유형이 있습니다. 와이파이, 팀, 본드 등을 가질 수 있습니다.
  2. BOOTPROTO= 값이 "dhcp”인 경우 dhcp 서버에서 동적 IP를 가져옵니다. 값이 "static"인 경우 동적 IP를 사용하지 않고 고정 IP를 할당할 수 있습니다.
  3. NAME= 인터페이스 명이며, 장치명을 뜻합니다.
  4. DEVICE= 이 프로필과 연결된 네트워크 장치의 이름입니다.
  5. ONBOOT= 기본 값은 "no"로 설정되어 있으며,  "yes"로 변경 할 경우 부팅 시 컴퓨터가 이 프로필을 읽고 기기에 설정에 둔 고정IP를 할당하려고 시도함을 의미합니다. 
  6. PREFIX= 서브넷 마스크 값, 24는 255.255.255.0을 의미합니다. 바이너리 형식을 적어두면 서브넷 마스크를 더 잘 이해할 수 있습니다. 예를 들어 값 16, 24, 26은 처음 16, 24 또는 26비트가 각각 1이고 나머지는 0임을 의미하며, 정확히 네트워크 주소와 할당할 수 있는 IP 범위를 정의합니다. 즉 IP를 사용할 수 있는 호스트는 256명입니다.
  7. GATEWAY= 게이트웨이 IP, VMware NAT Gateway IP
  8. IPADDR은 프로필에 할당하는 고정 IP입니다.
  9. DNS1, DNS2= 사용할 두 개의 DNS 서버, 보통 168.126.63.1(KT DNS 서버) / 8.8.8.8(구글 DNS 서버)를 입력합니다.

vi로 네트워크 인터페이스 카드를 변경해준 뒤에는 

systemctl restart network 명령어 입력을 통해 네트워크 연결을 최신화해줘야 한다!

2023-11-21 22:11:31

 

커트라인이 720점인데 간신히 넘겼다.

평소에 어려워서 자주 틀리던 문제가 많이 나와서 당황했지만 어쨌든 합격!!

 

공부 방법

개념 공부

유데미 강좌 1회 듣기 : 링크

  • 국비교육 때 AWS 공인과정을 들었을 때부터 준비했더라면 어땠을까...
  • 유데미 강좌에 기본 개념이 다 나와있어서 한글 자막으로 보고 유튜브 AWS 강의실도 보면서 이해를 했다.

AWS 강의실 교육은 기본 개념에 대해서 차근차근 알려주셔서 이해가 잘 됐다.

AWS 강의실 유튜브 강의는 입문자가 클라우드가 무엇인지, VPC는 무엇이고

CIDR, 서브넷같은 용어를 배우기에 가장 적합했다.


솔루션 아키텍트 시험에서 가장 많이 나오는 S3 스토리지 종류, ALB-NLB, 보안그룹, NAT-PAT, Aurora, Dynamo DB 같이 자주 등장하는 것들도 알 수 있었다.

서버리스로 비용효율적으로 구성하는 방법이라던지, 최소한의 운영 오버헤드로 아키텍처를 설계하는 법 등등을 배울 수 있다.

유데미는 한글 자막이 있긴 하지만 완벽하게 이해하긴 어려워서 그냥 AWS 강의실 클라우드 기초교육 쭉 듣고 기출 문제 푸는 게 나을지도??

 

AWS 루트 계정 만들고 VPC-서브넷-인터넷&NAT 게이트웨이-라우팅 테이블(라우팅 편집 및 명시적 서브넷 등록)-보안그룹-EC2-RDS 생성하고 EC2에 접속해서 서비스깔아보고 WEB-WAS-RDS 3티어(3계층) 연결할 줄 안다면 시험 준비 가능??

 

문제풀이

덤프를 달달달달 돌리면 된다.

실제 시험에서도 똑같이 나왔다. 근데 기본적인 이해가 없으면 아예 풀기 어렵다.

올해 8월부터 C02에서 C03으로 버전이 올라갔다는데 덤프가 600문제가 넘어서 진짜 도 닦는 기분?

  • 블로그 문제 풀이 : 링크

근데 덤프에 오답이 좀 많다. Examtopic에서 토론을 보면서 이해를 많이 했다.

나는 VEC Player를 구매해서 600문제 + 자체 기출 95문제로 695문제를 대충 3회독 정도한 것 같은데 1회독까지 진짜 힘들었고 2, 3회독은 그냥 틀린 것 위주로 봤다.

 

자격증 시험 신청

같이 공부하던 세 분은 이미 1주일 전에 다 땄다.

나는 자신없어서 1주일 뒤로 미뤘는데 잘 한 선택인 것 같다.

 

  • 대면 : 지정된 시험장에 직접 가서 볼 수 있다.(aws training certification) *일정 및 장소 예약 가능, 2회 변경 가능
  • 비대면 : 캠으로 온라인 감독관 감독하에 시험

 

비대면 시험은 준비가 까다롭다고 해서 그냥 대면으로 압구정에 있는 시험장에서 봤다.

한국어로 시험보면 170분을 줘서 더 좋다.

영어 번역 기능도 있고, 태그 기능도 있어서 나중에 검토가능하다.

(검토하면서 답을 변경했는데 원래 답이 맞아서 몇 개 더 틀렸다;;)

 

문제는 총 65 문항인데 1,000점 만점에 720점 커트라인이다.

이 중 15문항은 테스트? 통계용? 문제라고 하니 50문제 중 최소 35문제 정도는 맞혀야 하는 시험이다.

그리고 문제 중 '2개를 고르시오, 3개를 고르시오' 문제도 3개 정도 출제된 것 같다. 

 

대면 시험 후기

처음에 가서 종이에 이름적고 신분증 확인한다.

여권이 없으면 신용카드나 체크카드보여달라고 한다.

그리고 캠으로 얼굴 사진찍고 싸인하고 대기하라고 한다.

14시 시험이었는데 좀 일찍 갔더니 13시 30분에 보겠냐고 물어보셔서 30분 일찍 봤다.

소지품은 모두 사물함에 넣고, 핸드폰은 끈 상태로 넣어야 한다.

자리에 앉아서 기다리면 곧 시험 화면이 뜬다. 

덤프 문제랑 완전 똑같이 나온다. 강의는 이해 용도고 무조건 기출 문제 꼭 풀어야 한다!!!

 

문제를 아예 외워버린 건 바로 1초만에 찍고 넘어갔다!!! 문제 은행으로 돌리는 것 같다.

 

문제 다 풀면 5분간 설문조사 끝나고 최종 제출하면 끝이다. 시험장에서 그냥 나오면 된다.

머리 위에 CCTV가 있으니 부정행위는 금지!!

 

시험 결과

시험 결과는 8시쯤 메일로 날라왔다.(생각보다 빨리 알려주는 듯...)
13시 30분에 들어가서 시험보고 나왔을 때가 15시 18분이었으니 2시간 조금 안되게 풀고 나온 듯!

저번에 CKA 떨어졌는데 AWS SAA따서 다행이다.

메일과 함께 AWS Badge도 다운로드 받을 수 있다.

이제 막 첫걸음이지만 앞으로 AWS 뱃지 벌집을 만들어봐야겠다!!

만료기간

자격증은 만료기간이 있다. 3년이면 만료된다.

'일상생활' 카테고리의 다른 글

교육 수료 후 첫 면접 후기  (0) 2023.10.29
2023-11-18 13:02:15

리눅스에서 프로세스를 확인하려면 PS 명령어 입력

- ps : Process Status (현재 실행 중인 프로세스 목록을 보여줌)

- ps -e : 모든 프로세스를 출력한다.

- ps -f : 풀 포맷을 보여줌(UID, PID, PPID 등)

PID(Process ID)

PID는 운영체제에서 프로세스를 구분하기 위해서 부여받은 번호를 의미합니다.

PPID(Parent Process ID)

PPID는 해당 프로세스를 만든 부모 프로세스의 PID를 의미합니다.
보통 프로그램을 실행한 프로세스가 PPID로 할당됩니다.
예를 들어서 쉘프롬프트에서 명령어을 통해 하나이 프로세스를 실행한다면 해당 프로세스의 PPID는 쉘의 PID가 됩니다.

SID(Session ID)

세션(Session)은 여러 프로세스의 묶음을 의미합니다.
SID는 이런 세션을 식별하기위해서 부여되는 번호를 의미합니다.

UID(User ID), GID(Group ID)

해당 프로세스를 실행한 사용자의 정보를 나타냅니다.
UID는 사용자의 아이디를 나타내며 0~32767의 숫자로 나타내고 0은 슈퍼(root)유저를 나타냅니다.
그리고 리눅스에서는 사용자를 그룹으로 묶을 수 있는데 이 그룹을 구분지을 수 있는 ID가 GID입니다.

 

- ps -l : 긴 포맷으로 보여줌

- ps -p : 특정 PID(프로세스 ID)의 프로세스를 보여줌.

- ps -u : 특정 사용자의 프로세스를 보여준다.

 

 

 

 

 

 

 

'주요 개념 > 리눅스' 카테고리의 다른 글

[Linux] 리눅스 VI / VIM 편집기  (1) 2023.11.30
VMware Centos7 Nginx 설치하기  (0) 2023.11.13
사용자 계정  (0) 2023.06.14
2023-11-16 11:52:37

Git은 Commit 할 때, 총 3가지 영역을 바탕으로 작동합니다.

  • Working Directory : 내가 작업하고 있는 프로젝트의 디렉토리
  • Staging Area : 커밋을 하기 위해 $ git add 명령어로 추가한 파일들이 모여있는 공간
  • Repository : 커밋들이 모여있는 저장소

열심히 코드를 작성하다가 커밋을 해야하는 순간이 오면 git add .를 통해 커밋할 파일들을 추가합니다.

이 파일은 바로 Repository에 올라가지 않고, Staging Area에 올라가게 됩니다.

 

Staging Area에 추가한 파일들을 Commit을 한다면 최종적으로 저장소(Repository)로  저장되게 됩니다.

 

Git 에서 세 가지 영역

Git 프로젝트는 Git 디렉터리, 워킹 디렉터리, Staging Area 라는 세 가지 영역을 갖게 됩니다.

Git 프로젝트에서 파일들은 아래 세 가지 영역별로 다양한 상태를 가지게 됩니다.

 
 

워킹 디렉터리(워킹 트리)

워킹 디렉터리는 Git 디렉터리에서 특정 버전을 Checkout 해온 것입니다.

또한 우리는 이곳에서 프로젝트 작업(개발 및 수정)을 진행하게 됩니다.

쉽게 말하면 내가 작업하고 있는 프로젝트의 디렉터리를 뜻합니다. Git Directory는 지금 작업하는 디스크에 있고 그 디렉터리 안에 압축된 데이터베이스에서 파일을 가져와 Working Directory를 만듭니다.

git clone 'github repo https 주소'

Staging Area

또 다른 하나는 Stating Area이며, 실제로는 Git 디렉터리에 파일로 존재합니다. Index 영역이라고도 하지만 Staging Area가 표준 명칭으로 자리 잡힌 상태입니다.

Staing Area는 워킹트리에서 작업한 내용이 Git 디렉터리에 Commit 되기 전에 거쳐가는 공간이지만, 이곳을 거치지 않고 바로 Commit 될 수 있습니다.

 

스테이징 영역은 작업 디렉토리와 Git 저장소의 변경 이력 사이에 징검다리 역할을 하는데요. 

작업 디렉토리는 아직 커밋할 준비가 안된 변경 내용을 자유롭게 수정할 수 있는 공간인 반면에, 

스테이징 영역은 커밋할 준비가 된 변경 내용이 Git 저장소에 기록되기 전에 대기하는 장소라고 생각할 수 있습니다. 

git add 명령어를 사용하면 현재 작업 디렉토리에 있는 모든 또는 일부 변경 내용을 스테이징 영역으로 이동시킬 수 있습니다.

1. git add . (현재 디렉터리에 있는 모든 디렉터리 및 파일을 staging area로 보냄)

2. git add /경로/추가할 파일만 지정 가능)

3. git status (staging area에 잘 들어갔는지 확인)

 

git status는 크게 3개의 영역으로 구성 되어 있습니다.

  • Changes to be committed: 이 영역은 스테이징 영역에 넘어가 있는 변경 내용을 보여줍니다.
  • Changes not staged for commit: 이 영역은 아직 워킹 디렉토리에 있는 변경 내용을 보여줍니다.
  • Untracked files: 이 영역도 아직 워킹 디렉토리에 있는 아직 한 번도 해당 Git 저장소가 관리한 적이 없는 새로운 파일을 보여줍니다.

 

Git 디렉터리(.git 디렉터리, 깃 저장소)

Git 디렉터리는 최초에 git init 명령으로 프로젝트가 Git 프로젝트로 만들어질 때 .git이라는 이름으로 생성되며, Git 프로젝트의 모든 메타데이터와 객체 데이터베이스가 이곳에 저장됩니다. 따라서 가장 중요한 공간이며, Git의 핵심이라고 할 수 있습니다. 또한 Clone으로 원격 저장소를 복사해서 가져올 때 이 .git 디렉터리를 만들고 원격 저장소의 모든 데이터를 복사하여 가져옵니다.

 

Git으로 하는 작업

Git으로 하는 작업은 기본적으로 다음과 같습니다.

1. 워킹 디렉터리에서 파일을 수정합니다.

2. Staing Area에 파일을 Stage 하여 커밋할 스냅샷(버전)을 만듭니다.

3. Staing Area에 있는 파일들을 Commit 하여 Git 저장소에 영구적으로 스냅샷을 저장합니다.

 
 

영역별 상태

영역별 상태는 단순히 세 영역을 구분지어 설명하자면 다음과 같으며, 세밀하게 들어가면 더욱 복합적인 상태들이 존재합니다. 다음은 파일들의 상태가 영역별로 어떤 상태로 존재하는지를 나타냅니다.

1. Git 디렉터리에 존재하는 파일들은 Committed 상태입니다.

2. Git 디렉터리로부터 워킹 트리에 Checkout 하고 파일을 수정하고 Staging Area에 추가했다면 Staged 상태입니다.

3. Git 디렉터리로부터 워킹 트리에 Checkout 하고 파일을 수정했지만 아직 Staging Area에 추가하지 않은 경우 Modified 상태입니다.

더욱 자세한 상태는 [Git] Git 상태 확인하기 - git status 명령어 및 상태에 대한 설명을 참고합니다.

 

Git의 Staging Area는 어떤 점이 유용한가

Git에는 Staging Area라는 공간이 있다.

어떤 변경사항이 저장소에 커밋되기 전에, 반드시 거쳐야만 하는 중간단계이다.

다른 버전관리 도구에는 이에 정확히 대응하는 것은 없다.

저장소가 추적하는(관심의 대상이 되는) 파일들의 목록을 유지하고, 그 파일들에 대한 메타데이터를 관리하는 것은 다른 저장소들도 하는 일이지만, Git 처럼 커밋될 예정인 파일의 내용들까지 기억하지는 않는다.

 

이 Staging Area의 존재는 처음 Git을 사용하는 입장에서는 그저 불편만 안겨주고 이해만 더디게 만들어주는 목적불명의 무언가에 지나지 않는다. 다른 SCM에선 파일을 고치고 바로 커밋하면 되었는데, Git은 반드시 그 전에 add를 해 줘야 한다. 이런 비용을 감수하면서까지 Git이 Staging Area라는 공간을 사용자들에게 노출시키고 있는 이유는 무엇일까. 어떤 상황에서 Staging Area가 유용한지 살펴보면서 이해해보자.

 

일부분만 커밋할 때

Working directory에서 코드를 고칠 때는 자유롭게 고치고 싶다.

하지만 커밋할때는 일부분만 하고 싶다. 이를 가능하게 하려면 커밋할 때 working directory 전체가 아니라 부분만 커밋하면 될 것이다.

staging area라는 것이 없다고 가정해보자. ‘커밋될 예정인 내용들’을 디스크에 저장해 둘 공간이 없으므로, 커밋할 때 어느 부분을 커밋할지 한번에 결정해야 한다.

한번에 어렵지 않게 결정할 수도 있지만 시간을 들여 생각해야 할 수도 있다.

시간을 들여 조금씩 커밋할 부분을 결정해 나간다고 하면, 그 시간동엔 나의 결정사항들은 메모리상에 존재해야 한다.

메모리에 올라와있는 정보는 디스크에 저장되어 있는 정보보다 다루기 까다롭다.

Staging Area에 저장되어있는 ‘곧 커밋될 예정인 내용’들은 쉽게 git diff --staged등의 명령으로 확인할 수 있겠지만, 이것이 메모리에 올라와있는 상태라면, 해당 메모리 영역을 사용하고 있는 프로세스를 찾아서 물어봐야 알 수 있다.

실수로 그 프로세스를 죽였다면 공들여 커밋을 준비하던 것이 허사가 된다.

(커밋을 깔끔하게 만드는데 과도하게 공을 들인다는 생각이 드는가? 하지만 이런 개발자들이 실제로 있다)

충돌을 해결할 때

충돌을 해결해야 하는 상황에서도 비슷한 문제가 있다.

5개의 파일을 merge(병합)했는데 그 중 2개에서 충돌이 발생했다고 해 보자.

3개의 파일은 그냥 커밋하면 되고 2개는 충돌을 해소(resolve)해줘야한다.

여기서도 위와 같은 문제가 생긴다.

큰 규모의 충돌이 발생한 경우 이를 해결하는 것은 상당히 시간이 들어가는 일이고, 이를 위한 작업 데이터를 메모리에만 올려놓는 것은 참으로 불안하다.

따라서 이 정보 역시 Staging Area와 같이 디스크의 어떤 공간에 저장해두는 것이 훨씬 좋을 것이다.

이것은 Staging Area가 없는 Subversion이라도 마찬가지다.

서브버전은 어떤 파일이 충돌했는지 ‘파일 상태’를 기억한다. 그러나 이보다는 Git의 방식이 더 낫다.

서브버전은 파일 단위로 충돌 여부를 기억하기 때문에, 파일의 일부분만 충돌을 해소한 후 커밋하는 것은 매우 어렵기 때문이다. Git이라면 간단하다.

충돌이 발생한 파일에서, 필요한 만큼만 충돌을 해소하고 그 부분만 add하여 커밋하면 된다.

커밋 다시하기

commit --amend 명령으로 커밋을 다시 할 때도 Staging Area의 존재는 빛을 발한다.

커밋을 다시 할 때 로그메시지만 고치는 것이 아니라 파일들도 좀 고치고 싶다면, commit --amend 전에 파일을 고쳐서 Staging Area에 add하기만 하면 된다. Staging Area가 없었다면 commit --amend시에 Git에게 다른 방법으로 패치를 전달해주었어야 했을 것이다.

요약

Staging Area는 단순하지만 유용한 저장공간이다.

많은 Git의 명령들이 Staging Area를 활용하여 Git을 더욱 생산적인 도구로 만들어준다.

물론 Staging Area라는 생소한 개념이 Git의 진입장벽을 더욱 높이는 것은 사실이지만, 그럼에도 불구하고

Git을 즐겨쓰는 많은 개발자들에게 Staging Area는 여전히 필수불가결한 존재이다.

누군가 이해하기 쉬우면서도 현 Staging Area에 대한 요구를 흡수할(혹은 불필요하게 만들) 수 있는 어떤 개념을 만들어낸다면 몰라도 그 전까지는 Git의 핵심 기능이자 특징으로서의 지위가 변하는 일은 없을 것이다.

 

 

Git 설치 방법 (CentOS 7 기준)

repo 설치에 필요한 명령어 복사하여, 터미널에 붙여넣거나 수기로 입력한 다음 Enter키를 눌러준다.

(인터넷이 된다면) yum install https://repo.ius.io/ius-release-el7.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum install -y git

1. Github 계정 생성
2. Github repository 생성
3. Git 설치 및 설정
	1) 터미널에서 명령어 입력
		 git --version
		 git clone 'github repo https 주소'

	2) git token
		 Github Settings - Developer settings - Personal access tockens(classic)
		 repo 권한 부여, 생성된 토큰은 잘 보관하기
		 git password를 요구할 경우 git token 사용

	3) git 초기 설정
		 # User_name 설정
		 git config --global user.name "your_name"
		 # User_email 설정
		 git config --global user.email "your_email"
		 # 설정 확인
		 git config --list

4. Github에 처음 코드 업로드
	 1) 초기화(처음 업로드 할 때만 해주면 된다)
			git init

	 2) 추가할 파일 add
			1. git add . (현재 디렉터리 안에 있는 파일을 모두 추가)
			2. git add /경로/추가할 파일 (파일 지정해서 추가)

	 3) 상태 확인(add가 잘 됐는지)
			git status

	 4) commit(업로드명 설정)
			# 같은 이름의 파일을 변경해서 업로드할 때 구분하기 힘들기 때문에
			# github에 올릴 때 commit을 설정하는 것이다
			ex) git commit -m "first commit"

	 5) github repository와 연결
			# https://github.com/nkw/testproject.git 이 repository로
			# 내 소스코드를 보낸다는 의미
			git remote add origin https://github.com/nkw/testproject.git
	 
	 6) 연결 확인
			git remote -v

	 7) 업로드 하기
			# git branch 확인
				git branch
			# git push
				git push origin "branch 명"
				ex) git push origin master
        Username for 'namgungu': [깃허브 네임]
        Password for '~~~~~~~': [이전에 만든 token 값]

5. github 새로고침
	 업로드한 파일이 github repository에 올라가있는걸 볼 수 있다.
     
6. 변경사항 적용 후 업로드
	 yml 파일 변경사항 적용 후 저장
	 git pull origin master(push전에는 push 해주기)
	 git add .
	 git status
	 git commit -m "second commit"
	 git push origin master
2023-11-13 15:22:51

VMware workstation17에 Centos7을 이용해 Nginx 설치해보자!

example VM IP: 10.0.2.33


요약

  1. yum 외부 저장소 추가
  2. yum install
  3. 방화벽 포트 개방
  4. nginx 포트 설정
  5. nginx 데몬 실행
  6. nginx 페이지 확인

1. cd etc/yum.repos.d/ 이동 후 vi nginx.repo 레포지토리 등록(아래 붙여넣기)

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

 

2. Nginx 설치

yum install -y nginx

 

3. 방화벽 포트 개방

firewall-cmd --permanent --add-port=8089/tcp 
firewall-cmd --reload 
firewall-cmd --list-port

 

4. Nginx 포트 설정(8089로 변경)

vi /etc/nginx/conf.d/default.conf 

server { 
    listen       8089;   # 이 부분만 변경
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

5. Nginx 데몬 실행

systemctl start nginx 
systemctl enable nginx

 

6. nginx 페이지 확인

인터넷 브라우저에 http://10.0.2.33:8089 검색

2023-11-07 15:54:15

NAT (Network Address Translation)

사설 IP가 공용 IP로 통신할  수 있도록 주소를 변환해주는 방법

3가지 종류

1. Dynamic NAT : 1개의 사설 IP를 가용 가능한 공인 IP로 연결

- 공인 IP 그룹(또는 NAT Pool)에서 현재 사용 가능한 IP를 가져와서 연결

- 어떤 공인 IP를 쓸 지는 NAT Pool에서 사용하지 않는 공인 IP를 사용함.

 

2. Static NAT : 하나의 사설 IP를 고정된 하나의 공인 IP로 연결

- AWS Internet Gateway가 사용하는 방식

- 사설 IP 숫자만큼 공인 IP 숫자가 필요함.

 

3. PAT(Port Address Translation) : 많은 사설 IP를 하나의 공인 IP로 연결

- NAT Gateway / NAT Instance가 사용하는 방식

- PAT 방식이 일반적인 회사나 학원, 집 등에서 사용하는 일반적인 방식!

- 포트 기반으로 사설망의 어떤 기기가 통신을 받아야 하는지 정하는 방식이 PAT 방식임.

(ex. 192.168.0.2는 61.123.44.1과 통신해야 하는데 Port 5000번으로 나갈 때 공인 IP로 주소가 변환되면서 Port도 50001로 바뀌어서 트래픽이 전송됨)

장점: 다양한 사설 IP 주소가 하나의 공인 IP를 공유해서 외부와 통신할 수 있다는 장점

- 포트가 다르기 때문에 공인 IP가 1개여도 내부적으론 문제없이 통신됨

 

 

사설 IP (Private IP)

한정된 공인 IP 주소를 최대한 활용하기 위해 IP주소를 분할하고자 만든 개념

IPv4 기준으로 최대 IP갯수는 43억개(4,294,967,296)

 

공인 IP 부족을 해결하고자 만든 것 : 사설망

사설망 내부에는 외부 인터넷 망으로 통신이 불가능한 사설 IP로 구성

외부로 통신할 때는 통신 가능한 공인 IP로 나누어 사용

보통 하나의 망에는 사설 IP를 부여받은 기기들과 NAT 기능을 갖춘 Gateway로 구성

 

참고 : IPv6 최대 IP 개수

2^128 = 340,282,366,920,938,463,463,374,607,431,768,211,456개

(즉, 340 2823 6692 938 4634 6337 4607 4317 6821 1456개)

 

 

IP Class 기반 라우팅

IP Class는 IPv4 주소를 영역별로 나눈 것으로 크게 A, B, C, D, E 클래스로 나뉘며 각각 네트워크 크기와 호스트의 수가 다르다. 이중 D와 E는 특수용도로 D는 멀티캐스트용, E는 향후 사용을 위해 예약된 주소다.

나머지 A, B, C는 일반 사용자에게 부여하는 용도로 이번에 어떻게 나뉘는지 알아보려고 한다.

 

아래의 범위에 있는 IP들은 사설 IP로 정하자고 약속함.

예를 들어  61.123.44.1 주소가 있다면, 아래의 사설 IP 주소 대역에 속하지 않으므로

일반적으로 공인 IP 주소로 간주된다.

이름 Class IP Address Range IP 개수(호스트 수) 서브넷 마스크
24-bit block A 10.0.0.0~10.255.255.255 16,777,216 255.0.0.0
20-bit block B 172.16.0.0~172.31.255.255 104,857 255.240.0.0
16-bit block C 192.168.0.0 ~ 192.168.255.255 65,536 255.255.0.0
  D      
  E      

IP 주소를 8비트로 4등분한 각각을 옥텟(Octet)이라고 한다. 각 옥텟 별로 0~255개의 범위가 되므로 각 256개가 들어갈 수 있다.

그리고 이 옥탯 별로 IP의 클래스를 A, B, C로 나눌 수 있다. 각 클래스마다 위에서 배운 네트워크 ID 부분과 호스트 ID 부분 범위가 서로 다른 것을 볼 수 있다. 이런 식으로 나눔으로써 각 클래스마다 할당되는 총 호스트 개수가 나뉘어 보다 체계적으로 관리할 수 있게 된다.

 

 

CIDR

Classless Inter Domain Routing(CIDR) : 클래스에서 발전하여 더 이상 클래스를 사용하지 않음.

CIDR이란 무엇인가요?

Classless Inter-Domain Routing(CIDR)은 인터넷상의 데이터 라우팅 효율성을 향상시키는 IP 주소 할당 방법

인터넷에 연결되는 모든 컴퓨터, 서버 및 최종 사용자 디바이스는 IP 주소라는 고유한 번호가 연결되어 있다.

 

- IP는 주소의 영역을 여러 네트워크 영역으로 나누기 위해 IP를 묶는 방식

- 여러 개의 사설망을 구축하기 위해 망을 나누는 방법

 

 

 

CIDR Block  CIDR를 기반으로 나눈 것이 CIDR Block : IP 주소의 집합

CIDR Notation : CIDR Block을 표시하는 방법

- 네트워크 주소와 호스트 주소로 구성

- 각 호스트 주소 숫자만큼의 IP를 가진 네트워크 망 형성 가능

- A.B.C.D/E  예) 172.16.0.0/12

A.B.C.D: 네트워크 주소+호스트 주소 표시 / E: 0~32 네트워크 주소가 몇 bit 인지 표시

CIDR Notation은 네트워크 비트(고정)와 호스트 주소 비트(변경 가능)를 보여준다.

- 호스트 주소 비트만큼 IP 주소를 보유 가능

예) 192.168.2.0/24

     - 네트워크 비트 24

     - 호스트 주소 = 32-24 = 8

     - 즉 2^8 = 256개의 IP 주소 보유(192.168.2.0 ~ 192.168.2.255)

 

서브넷이란?

서브넷 : 네트워크 안의 네트워크

큰 네트워크를 잘게 쪼갠 단위

일정 IP 주소의 범위를 보유

   - 큰 네트워크에 부여된 IP 범위를 조금씩 잘라서 작은 단위로 나눈 후 각 서브넷에 할당(AWS VPC 등)

예) 192.168.0.0/16 이라는 큰 네트워크 안에서 서브넷을 잘게 자를 때 사용하는 것이 CIDR Notation임.

 

 

참고 : AWS 강의실 기초 강좌

https://www.youtube.com/watch?v=3VXLD0-Iq8A



Kylian. Designed by bskyvision.