Chrome이나 Safari같은 웹브라우저의 검색창에 http://google.com 을 검색하면 브라우저는 입력된 URL의 프로토콜(http)을 파싱해서 어떤 프로토콜인지 확인하고, "http" 프로토콜을 사용하여 "google.com" 도메인에 대한 HTTP 요청을 생성한다.

 

그렇다면 이 과정은 어떻게 될까?

 

DNS 질의 개요도

 


   1. 로컬 DNS 캐시에서 검색

 

 먼저 브라우저는 로컬 DNS 캐시에서 "google.com" 도메인 이름과 관련된 IP 주소를 찾는다.
 로컬 DNS 캐시는 이전에 방문한 도메인 이름의 IP 주소를 저장한다. 만약 캐시에 해당 도메인 이름의 IP 주소가 있으면, 브라우저는 바로 해당 IP 주소로 HTTP 요청을 보낸다.

 

   2. 로컬 DNS 서버에서 검색

 

 만약 로컬 DNS 캐시에 해당 도메인 이름의 IP 주소가 없으면, 브라우저는 로컬 컴퓨터에 설정된 기본 DNS 서버에게 "google.com" 도메인 이름과 관련된 IP 주소를 질의한다.
 로컬 DNS 서버는 이를 받아들이고, 자신이 가지고 있는 DNS 캐시에서 "google.com" 도메인 이름과 관련된 IP 주소를 찾는다.

 

   3. 로컬 DNS 서버에서 검색

 

 만약 로컬 DNS 서버에도 해당 도메인 이름의 IP 주소가 없으면, 로컬 DNS 서버는 인터넷에서 가장 높은 계층에 위치한 루트 DNS 서버에게 "google.com" 도메인 이름과 관련된 IP 주소를 질의한다.
 루트 DNS 서버는 이를 받아들이고, "com" 도메인 이름을 관리하는 TLD(Top-Level Domain) DNS 서버의 IP 주소를 알려준다.

 

   4. TLD DNS 서버에서 검색

 

 로컬 DNS 서버는 TLD DNS 서버의 IP 주소를 받은 후, 해당 서버에게 "google.com" 도메인 이름과 관련된 IP 주소를 질의한다.
 TLD DNS 서버는 이를 받아들이고, "google.com" 도메인 이름을 관리하는 DNS 서버의 IP 주소를 알려준다.

 

   5. 도메인 이름을 관리하는 DNS 서버에서 검색

 

로컬 DNS 서버는 마지막으로 "google.com" 도메인 이름을 관리하는 DNS 서버에게 "google.com" 도메인 이름과 관련된 IP 주소를 질의한다. 이 DNS 서버는 "google.com" 도메인 이름에 대한 IP 주소를 알려준다.

 

   6. 로컬 DNS 서버에 도메인 저장

 

로컬 DNS 서버는 해당 정보를 자신의 DNS 캐시에 저장하고, 해당 정보를 웹 브라우저에게 반환한다. 웹브라우저는 반환받은 IP주소를 바탕으로 해당 도메인의 웹 페이지를 불러온다.


 이런 기나긴 여정을 통해서 google.com의 웹 페이지가 사용자의 화면에 보일 수 있는 것이다.
 물론 "6. 로컬 DNS 서버에 도메인 저장"  에서 유추할 수 있듯이 이미 한번 질의과정을 거쳐 로컬 DNS 서버의 캐시에 도메인이 저장된 경우에는 위와 같은 질의 과정이 필요없다.

 

참고 : https://www.cloudflare.com/ko-kr/learning/dns/what-is-dns/

 

IP 주소?

 IP 주소는 인터넷 프로토콜(Internet Protocol) 주소의 약자로, 컴퓨터 네트워크 상에서 통신을 위해 부여되는 주소다. IP 주소는 각각의 컴퓨터나 장치를 고유하게 식별하며, 데이터를 정확하게 전달하기 위해 필요하다.

 

IP 주소의 유형

IP 주소의 유형에는 Public IP(공인 IP)와 Private IP(사설 IP)가 있다.
 간단하게 설명하면, Public IP는 인터넷에서 공개적으로 액세스 가능한 IP 주소, Private IP는 내부 네트워크에서 사용되는 IP 주소다.

 Public IP는 인터넷 서비스 제공업체(ISP)로부터 제공되며, 인터넷을 통해 전 세계적으로 접근할 수 있습니다. 반면, Private IP는 로컬 네트워크에서만 사용되며, 일반적으로 라우터에 의해 할당됩니다. 따라서 인터넷에서는 Private IP에 직접 접근할 수 없다.

 

Public IP와 Private IP의 차이점

  • Public IP는 인터넷 상에서 공개되어 있는 IP 주소이며, 모든 인터넷 사용자가 접근 가능하다. 반면 Private IP는 로컬 네트워크에서만 사용되며, 인터넷에선 접근할 수 없다.
  • Public IP를 사용하면 인터넷 상에서 공개적으로 접근할 수 있기 때문에, 원격 접속이나 서버 호스팅 등에 유용하다. 반면에 Private IP는 로컬 네트워크에서만 사용되기 때문에, 내부적인 통신에 쓰기 좋다.
  • Public IP는 한 사용자에게 유일하게 할당되는 고유한 IP 주소이기 때문에, 전 세계에서 공유되지 않는다. 따라서 보안에 취약한 면이 있을 수 있다. 하지만 Private IP는 로컬 네트워크에서만 사용되기 때문에, 외부 공격으로부터 상대적으로 안전하다.
  • Public IP는 인터넷 서비스 제공업체(ISP)에서 할당하며, 사용하는데 요금을 지불해야 한다. 하지만 Private IP는 로컬 네트워크에서 라우터나 스위치 등을 통해 할당되며, 추가 비용이 들지는 않는다.

공인 IP와 사설 IP의 차이 - NordVPN

 

공인 IP 주소는 인터넷 통신 목적으로 사용되고, 사설 IP 주소는 로컬 네트워크 통신 목적으로 사용된다는 점에서 차이가 있기에 어느 IP 주소가 더 좋다고 이야기하기는 힘들다.

그러나 공인 IP 주소는 인터넷에서 식별이 가능하기에 공인 IP 주소가 노출되어 개인 데이터가 유출되지 않도록 주의할 필요가 있다.

클라우드 컴퓨팅

클라우드 컴퓨팅은 인터넷을 통해 서버, 스토리지, 데이터베이스, 소프트웨어 등 다양한 컴퓨팅 리소스를 제공하는 기술이다.

기존의 온프레미스 방식(직접 물리적인 서버를 구축하는 방식)과는 달리, 클라우드 컴퓨팅은 인터넷에 연결된 기기에서 언제 어디서든 접근할 수 있는 편리한 환경을 제공할 수 있다.

 

클라우드 컴퓨팅은 기업의 IT 비용을 절감하고, 인프라 구성과 관리에 대한 부담을 줄여줌으로써 비즈니스를 유연하게 만들어 줄 수 있다.

또한, 클라우드 컴퓨팅은 대규모의 데이터를 다루는 데 매우 유용하며, 데이터 분석과 인공지능 등의 기술 발전을 촉진하는 데도 큰 역할을 하고 있다.

 

분류

클라우드 컴퓨팅은 다양한 모델로 제공됩니다. 대표적인 세 가지 모델은 IaaS, PaaS, SaaS다.

각 모델은 사용자가 관리하는 부분과 제공자가 관리하는 부분이 다르며, 그래서 사용자는 필요한 서비스를 선택할 수 있다.

 

IaaS (Infrastructure as a Service)

IaaS는 가장 기본적인 클라우드 컴퓨팅 모델이다. 사용자는 클라우드 서비스 제공자가 제공하는 인프라를 사용해 가상 머신, 스토리지, 네트워크 등을 생성하고 관리할 수 있다.

 

일례로, 기업이 IaaS 모델을 사용하여 자사 서버를 클라우드 상에서 운영할 경우에, 서버 운영 환경을 스스로 구축하고 관리할 필요 없이 클라우드 서비스 제공자가 제공하는 인프라 위에 가상 머신을 생성하고 필요한 소프트웨어와 애플리케이션을 설치하여 사용할 수 있다.

 

대표적인 서비스로는 아마존의 aws, Google의 Compute Engine(GCE), 등이 있다.

 

PaaS (Platform as a Service)

 

PaaS는 IaaS에서 제공되는 인프라뿐 아니라 플랫폼까지 제공하는 모델다. 사용자는 인프라와 운영 체제, 미들웨어, 개발도구 등을 설치할 필요 없이 PaaS 제공자가 제공하는 플랫폼 위에서 애플리케이션을 개발하고 배포할 수 있다.

 

예를 들어, 기업이 PaaS 모델을 사용하여 웹 애플리케이션을 개발하고자 할 때, 클라우드 서비스 제공자가 제공하는 플랫폼 위에서 필요한 소프트웨어와 개발 도구를 사용하여 애플리케이션을 개발하고, 배포 및 운영까지 가능하다.

 

대표적인 서비스로는 Heroku가 있다.

 

SaaS (Software as a Service)

SaaS는 가장 최상위 계층에 해당하는 클라우드 컴퓨팅 모델이다. 사용자는 클라우드 서비스 제공자가 제공하는 소프트웨어 애플리케이션을 사용한다.

 

예를 들어, 기업이 SaaS 모델을 사용하여 이메일 클라이언트나 공유 문서 플랫폼을 이용하고자 할 때, 클라우드 서비스 제공자가 제공하는 애플리케이션을 사용하여 이메일이나 문서를 관리할 수 있다.

 

대표적인 서비스로 폴라리스 웹, Google Docs, 등이 있다.

 

IaaS vs. PaaS vs. SaaS

각 모델은 제공하는 서비스의 범위와 사용자가 관리하는 부분이 다르다.

모델 서비스 범위 고객이 관리하는 부분
IaaS 인프라 가상 머신, 스토리지, 네트워크 등
PaaS 플랫폼 및 개발 도구 애플리케이션 개발, 배포, 운영 등
SaaS 소프트웨어 애플리케이션 애플리케이션 사용

각 모델은 사용자의 요구사항에 따라 선택할 수 있다.

예를 들어, 인프라를 직접 운영하고자 하는 기업은 IaaS 모델을 선택할 수 있고, 애플리케이션을 개발하고자 하는 기업은 PaaS 모델을 선택할 수 있다. 그리고 소프트웨어 애플리케이션을 사용하고자 하는 기업은 SaaS 모델을 선택할 수 있다.

리눅스 운영체제에서는 파일과 디렉토리를 포함한 모든 객체들에 대해 read, write, execute 권한이 적용된다.

파일의 권한

  • 파일의 read 권한: 파일을 읽을 수 있다. 즉, 파일의 내용을 볼 수 있다.
  • 파일의 write 권한: 파일을 쓸 수 있다. 즉, 파일의 내용을 수정할 수 있다.
  • 파일의 execute 권한: 파일을 실행할 수 있다. 즉, 파일이 실행파일인 경우 실행할 수 있다.

위의 권한들은 아래처럼 파일의 권한 정보로 나타낼 수 있다.

 

예시 : 파일 "example.txt"에 대해 read와 write 권한이 있고 execute 권한이 없는 경우

-rw-r--r--

위의 권한 정보에서 첫 번째 문자인 "d"는 디렉토리인 경우 "d"로 표기된다.

파일인 경우 "-"로 표기되고, 두 번째부터 열 번째 문자는 소유자, 소유자 그룹, 그 외 사용자 순으로 read, write, execute 권한을 나타낸다.

여기에서 "r"은 read 권한이 있는 것을 나타내며, "w"는 write 권한이 있는 것을, "x"는 execute 권한이 있는 것을 나타낸다. 권한이 없는 경우 "-"로 표기된다.

 

디렉토리의 권한

  • 디렉토리의 read 권한: 디렉토리 안의 파일 목록을 볼 수 있습니다.
  • 디렉토리의 write 권한: 디렉토리 안에 새 파일을 생성하거나 기존 파일을 삭제할 수 있습니다.
  • 디렉토리의 execute 권한: 디렉토리 안으로 진입할 수 있습니다. 이 권한이 없으면 디렉토리 안으로 진입할 수 없습니다.

디렉토리의 권한은 파일의 권한과 조금 다르다. 디렉토리의 execute 권한이 없으면 해당 디렉토리 안으로 진입할 수 없기 때문이다.

 

예시 : 디렉토리 "example"에 대해 read와 write 권한이 있고 execute 권한이 없는 경우

drw-rw-r--

맨 앞글자로만 디렉토리인지 파일인지 구분해주는 것을 제외하면 권한 표기 자체는 파일의 표기와 다르지 않다. 

 

파일/디렉토리의 권한 변경 명령어 : chmod

chmod 명령어는 파일이나 디렉토리의 권한을 변경하는 데 사용되며, 다음과 같은 형식을 가진다.

chmod [옵션] [모드] [파일/디렉토리]
  • 옵션: 권한을 변경할 때 사용할 옵션을 지정한다.
  • 모드: 권한을 변경하는데 사용된다.
  • 파일/디렉토리: 권한을 변경할 파일이나 디렉토리의 경로를 지정한다.

옵션은 아래와 같다.

  • -r: 하위 디렉토리와 파일에 대해 권한을 변경
  • -v: 변경된 파일과 디렉토리의 이름을 출력

모드에는 아래와 같은 기호, 숫자를 사용할 수 있다.

  • u: 소유자에 대한 권한을 지정
  • g: 소유자 그룹에 대한 권한을 지정
  • o: 그 외 사용자에 대한 권한을 지정
  • a: 모든 사용자에 대한 권한을 지정
  • +: 권한을 추가
  • -: 권한을 제거
  • =: 권한을 지정한 대로 설정
  • 숫자: 권한을 나타내는 숫자

예시1 : '+', '-' 기호를 사용해서 파일 "example.txt" 파일에 읽기 권한을 추가하고 쓰기 권한을 제거하는 경우

chmod +r-w example.txt

예시2 : 숫자표기를 사용해 "example_dir" 디렉토리의 권한을 변경하여 모든 권한을 제거하는 경우

chmod 000 example_dir

위 명령어에서 "000"은 모든 권한을 제거하는 것을 나타낸다. 따라서 이 명령어를 실행하면 "example_dir" 디렉토리의 권한이 모두 제거된다.

 

이 숫자표기는 순서대로 소유자, 그룹, 기타 순으로 표기되며 각 숫자의 의미는 이렇다.

권한 표기
읽기 r 4
쓰기 w 2
실행 x 1

예를 들어서 소유자가 읽기와 쓰기 권한을 가진 파일의 권한을 나타내기 위해서는 6(4+2)이라는 값을 사용하게 된다.

비슷하게 모든 권한을 가진 파일의 권한은 7(4+2+1)이라는 값을 사용한다.

이 권한값들은 위 예시처럼 chmod 명령어에서 사용되며, 파일이나 디렉토리의 권한을 변경할 때 사용한다.

grep 명령어는 파일 내의 문자열 검색에 사용되는 명령어이다.

grep 명령어의 기본 사용법은 이렇다.

grep [OPTIONS] PATTERN [FILE...]

여기서 OPTIONS는 옵션을 의미하며, PATTERN은 검색하려는 문자열 패턴, FILE은 검색 대상 파일을 나타낸다. 파일 이름이 제공되지 않은 경우, grep은 표준 입력에서 데이터를 읽어온다.

 

grep 명령어의 자주 사용되는 옵션들은 이렇다.

  • -i: 대소문자를 구분하지 않고 검색합니다.
  • -v: 지정한 패턴을 포함하지 않는 라인을 출력합니다.
  • -r: 하위 디렉토리를 재귀적으로 검색합니다.
  • -n: 검색 결과에서 일치하는 라인의 번호를 출력합니다.
  • -w: 패턴과 정확히 일치하는 단어만 검색합니다.
  • -c: 검색 결과의 갯수를 출력합니다.

몇가지 예시를 들어보자.

 

예시 1 : 파일 내에서 "apple"이라는 문자열을 찾는다면, 다음과 같이 입력한다.

grep apple file.txt

예시 2 : 파일 내에서 "apple"이라는 문자열을 대소문자를 구분하지 않고 찾는다면, 다음과 같이 입력한다.

grep -i apple file.txt

위와 같이 입력하면 대소문자를 구분하지 않고 "apple"이라는 문자열을 검색한다.

 

이와 같이 grep 명령어를 사용하여 파일 내의 문자열을 검색할 수 있다.

필요에 따라 다양한 옵션을 사용하여 검색 결과를 정밀하게 조정할 수도 있기 때문에 매우 유용하게 쓰인다.

데몬? 서비스?

리눅스에서 데몬(Demon)은 백그라운드에서 실행되는 프로그램을 말한다. 리눅스 시스템에는 많은 데몬들이 있고, 이 데몬들은 시스템의 여러 기능을 제공하는 역할을 한다. 예를 들어서, httpd 데몬은 웹 서버 기능을 제공하고, cron 데몬은 작업 스케줄링 기능을 제공한다. 그 외에도 하드웨어 장치 관리, 마운트(USB, HDD, 등 물리적인 장치를 디렉토리에 연결해주는 작업), 프로세스간 통신, 등 많은 일들을 한다.

 

서비스(Service)는데몬의 일종으로 특정한 데몬의 실행을 관리하는 기능을 한다. 서비스를 이용해서 다른 데몬을 손쉽게 시작하거나 중지할 수 있고, 부팅 시 자동으로 실행되도록 설정할 수도 있다.

 

데몬 예시 : httpd

httpd는 Apache HTTP Server의 데몬 이름이다. Apache HTTP Server는 인터넷 상에서 웹 서버를 운영하기 위한 프로그램 중 하나로, 전 세계적으로 많이 사용되는 웹 서버 중 하나다. httpd 데몬은 백그라운드에서 클라이언트로부터 HTTP 요청을 받아들여, 이에 따른 응답을 반환한다.  

 

#시험용 html페이지를 만든다.
$ echo "<html><body><h1>시험용 html 페이지 <h1><body><html>" > index.html

#html페이지가 생성됐는지 확인한다.
$ ls
index.html

#웹 서버를 실행하고, 8888번 포트를 통해서 접속 할 수 있도록 한다.
$ busybox httpd -h . -p 8888

#웹서버에 접속해 웹 서버가 제대로 열렸는지 확인한다.
$ curl http://localhost:8888
<html><body><h1>시험용 html 페이지 <h1><body><html>

#프로세스 확인 명령을 해서 httpd 데몬이 실행중인지 확인한다.
$ ps aux | grep httpd
ubuntu     10876  0.0  0.0   2456    76 ?        Ss   13:25   0:00 busybox httpd -h . -p 8888
ubuntu     10884  0.0  0.2   7004  2240 pts/0    S+   13:26   0:00 grep --color=auto httpd

#kill 명령어를 사용해 확인한 pid(process id)로 프로세스를 종료시킨다.
$ kill -9 10876

#웹 서버에 다시 접속하면, 접속이 불가능 한 것을 확인할 수 있다.
ubuntu@patient-rat:~$ curl http://localhost:8888
curl: (7) Failed to connect to localhost port 8888 after 0 ms: Connection refused

 

데몬 예시 : cron

cron은 시스템에서 주기적으로 실행되는 작업을 관리하는 데몬이다. cron 데몬을 사용하면, 특정 시간에 특정 작업을 실행하거나, 주기적으로 반복되는 작업을 실행할 수 있다.

예를 들어서, 백업파일을 만드는 스크립트를 매일 자정에 실행하도록 하거나, 아래처럼 매 분마다 날짜와 시스템 가동시간을 파일에 기록하는 명령을 실행할 수 있다.

#crontab -e를 사용해 cron으로 실행할 명령을 입력할 수 있다. 여러 에디터 중 하나를 선택해서 작성할 수 있다.
$ crontab -e
no crontab for ubuntu - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 1

#에디터를 열면
# * * * * * echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log
#를 입력해준다.
#이 명령은 
#'* * * * *'-> 매 분마다
#'echo $(/bin/date) - $(/usr/bin/uptime)date' -> date 명령의 출력과 uptime 명령의 출력을 합쳐서
# '>> ~/uptime.log' -> ~/uptime파일에 기록한다.
#라는 의미이다.

#에디터 사용이 끝나면 새 스케쥴 명령이 성공적으로 등록된 것을 확인할 수 있다.
crontab: installing new crontab

#시간이 지난 뒤에 uptime.log 파일을 확인해보면 작성한 예약명령이 정상적으로 작동하는 것을 확인할 수 있다.
$ cat uptime.log
Mon Mar 13 14:08:01 KST 2023 - 14:08:01 up 1 day, 23:54, 1 user, load average: 0.00, 0.00, 0.00
$ cat uptime.log
Mon Mar 13 14:08:01 KST 2023 - 14:08:01 up 1 day, 23:54, 1 user, load average: 0.00, 0.00, 0.00
Mon Mar 13 14:09:01 KST 2023 - 14:09:01 up 1 day, 23:55, 1 user, load average: 0.00, 0.00, 0.00
Mon Mar 13 14:10:01 KST 2023 - 14:10:01 up 1 day, 23:56, 1 user, load average: 0.00, 0.00, 0.00
Mon Mar 13 14:11:01 KST 2023 - 14:11:01 up 1 day, 23:57, 1 user, load average: 0.00, 0.00, 0.00

#가만 냅두면 uptime.log파일에 내용이 계속 쌓이게 되므로 crontab을 초기화 시켜줘야만 한다.
ubuntu@patient-rat:~$ crontab -r
ubuntu@patient-rat:~$ crontab -l
no crontab for ubuntu
  • 명령을 반복할 시간을 지정해주고 싶을 때

앞서 입력했던 명령어의 ' * * * * * ' 부분은 순서대로 분, 시각, 날짜(1달 기준), 달, 날짜(일주일 기준)을 말한다.

예를 들어서 ' 0 22 * * 1-5 ' 는 매주 월요일부터 금요일 22시 0분을, ' 5 4 * * sun' 은 매주 일요일 04시 5분을 말한다.

다른 예시는 https://crontab.guru/  에서 확인할 수 있다.

서비스 관리 (systemctl)

모든 데몬의 목록은 systemctl 명령으로 확인할 수 있다,

아래는 systemctl명령어의 간단한 사용 예이다.

#cron 데몬의 상태를 확인한다.
$ systemctl status -l cron
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-03-09 12:00:23 KST; 4 days ago
       Docs: man:cron(8)
   Main PID: 666 (cron)
      Tasks: 1 (limit: 1096)
     Memory: 2.5M
        CPU: 630ms
     CGroup: /system.slice/cron.service
             └─666 /usr/sbin/cron -f -P

Mar 13 14:08:01 patient-rat CRON[10972]: pam_unix(cron:session): session closed for user ubuntu
Mar 13 14:09:01 patient-rat CRON[10979]: pam_unix(cron:session): session opened for user ubuntu(uid=1000) by (uid=0)
Mar 13 14:09:01 patient-rat CRON[10980]: (ubuntu) CMD (echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log)
Mar 13 14:09:01 patient-rat CRON[10979]: pam_unix(cron:session): session closed for user ubuntu

systemctl 명령어는 위에 있는 서비스 상태 확인 기능을 포함해서

  • 서비스 관리 (시작, 중지, 다시 시작, 재시작, 등)
  • 서비스 로그 보기
  • 시스템 로그 보기
  • 부팅 시 서비스 자동 실행 여부 확인

같은 기능들도 수행한다.

 

아래는 systemctl의 주요 하위 명령어들이다.

하위 명령어 설명
start 지정된 서비스를 시작한다.
stop 지정된 서비스를 중지한다.
restart 지정된 서비스를 다시 시작한다.
reload 지정된 서비스를 다시 로드한다.
status 지정된 서비스의 상태를 표시한다.
enable 지정된 서비스를 부팅 시 자동으로 시작되도록 설정한다.
disable 지정된 서비스를 부팅 시 자동으로 시작하지 않도록 설정한다.
mark 지정된 서비스를 비활성화 하고 완전히 차단한다.
unmask 지정된 서비스를 다시 활성화 한다.
is-enabled 지정된 서비스가 부팅 시 자동으로 시작되는지 여부를 확인한다.
list-units 현재 활성화된 모든 유닛(서비스, 타이머, 디바이스, 등)을 표시한다.
list-sockets 현재 활성화된 소켓을 표시한다.

 

multipass는 Windows에서 Ubuntu 리눅스를 쉽게 쓸 수 있게 해주는 툴이다.

https://multipass.run/install

 

Multipass orchestrates virtual Ubuntu instances

Install Multipass Get an instant Ubuntu VM with a single command. Multipass can launch and run virtual machines and configure them with cloud-init like a public cloud. Prototype your cloud launches locally for free. Select OS to get started Install Multipa

multipass.run

먼저 공식 홈페이지에서 내 운영체제에 맞는 mulitpass 설치파일을 다운로드 받는다.

multipass 공식 홈페이지 설치파일 다운로드 화면

그리고 설치파일을 실행한다.

 

처음에 Hypervisor를 선택하라고 할텐데 Windows education, pro, enterprise버전은 그냥 Hyper-V를 선택해도 좋다.

하지만 Home버전의 경우에는 Hyper-V 기능이 제공되지 않기 때문에 따로 VirtualBox를 설치해줘야한다.

 

https://www.virtualbox.org/

 

Oracle VM VirtualBox

Welcome to VirtualBox.org! News Flash New January 17th, 2023VirtualBox 7.0.6 released! Oracle today released a 7.0 maintenance release which improves stability and fixes regressions. See the Changelog for details. New January 17th, 2023VirtualBox 6.1.42 re

www.virtualbox.org

VirtualBox까지 설치하고 나면, Add multipass to PATH? 라고 물어볼텐데

여기서 Do not Add를 선택하면 사용자가 직접 귀찮게 설정해줘야 하므로 모든 사용자, 또는 현재 사용자의 PATH에 추가한다고 해준다.

 

multipass를 설치하고 나면 앱을 실행시켜준다.

아래처럼 시스템 트레이에 multipass 아이콘이 추가될텐데, 여기서 우클릭을 한 후 Open Shell을 눌러 쉘을 실행시켜준다.

터미널창이 나오고 첫 초기화가 진행되고 나면 터미널이 실행된다.

 

정상적으로 실행된 리눅스 터미널

'Linux' 카테고리의 다른 글

[Linux] vi 에디터 사용법  (0) 2023.03.27
[Linux] nslookup 명령어  (0) 2023.03.15
[Linux] read, write, execute 권한  (1) 2023.03.14
[Linux] 파일 내용 필터링 명령어 : grep  (0) 2023.03.14
[Linux] 데몬(demon)과 서비스(service)  (0) 2023.03.13

현재 서비스를 제공하는데 필요한 서버에 사용하는 운영체제는 Linux의 점유율이 압도적이다.

 

미국의 비즈니스 기술 뉴스 웹사이트인 ZDNet에 따르면 세계 상위 백만개의 서버 중에서 약 96.3%가 리눅스 운영체제를 사용하고 있다.

https://www.zdnet.com/home-and-office/networking/can-the-internet-exist-without-linux/

 

​Can the Internet exist without Linux?

Yes, but it wouldn't be the Internet you know.

www.zdnet.com

 

여기에는 여타 다른 운영체제와는 차별화되는 장점이 있다.

  • 오픈 소스이기 때문에 파생되는 압도적인 경제성, 뛰어난 보안성과 활성화된 커뮤니티 지원

 오픈 소스 소프트웨어는 일부 예외를 제외하고 대부분 비용 없이 제품을 사용할 수 있고, 소스 코드가 공개되어 있다.

일반적으로 오픈 소스라면 보안에 취약할 거라고 생각할 수도 있다. 하지만 리눅스처럼 어마어마한 사용자들이 있는 오픈소스의 경우에는 거대한 사용자 규모에 걸맞은 활발한 커뮤니티 활동이 오히려 모든 것이 투명하게 공개되어 있는 소스 코드의 취약점들을 빠르게 파악하고 대처할 수 있다는 장점이 있다. 

 이 커뮤니티는 리눅스의 높은 보안성에 기여할 뿐만 아니라, 리눅스를 사용하고 있는 사람들이 어떤 문제에 막혀 작

작업하는데 곤란한 상황을 구원해줄 동아줄이 되어준다.

  • 편한 유지보수, 뛰어난 안정성

 현재 서비스 제공에 사용되는 서버 인프라는 각기 다른 역할을 담당하는 여러대의 서버를 동시에 운영하는 경우가

많은데, 여기에는 오랜 시간동안 안정적으로 서버가 동작하는 것이 매우매우 중요하다. 그런 면에서 최초 부팅 수           

시스템이 계속 켜져 있는 시간인 업타임(uptime)이 다른 운영체제보다 훨씬 우월하다.

 예를 들어 윈도우의 경우에는 보안패치를 적용하고 시스템의 재부팅이 필요한 경우가 많은데, 리눅스 애초에 설계 단계에서부터 시스템 충돌이나 불안정성 문제가 발생하지 않도록 되어있기 때문에 시스템을 재부팅해야하는 경우가 매우 드물다.

 그래서 1년 365일 24시간 내내 최대한 서비스를 많은 시간에 제공해야하는 서비스. 즉, 높은 가용성을 요구하는 서비스의 경우에 리눅스가 적합하다.

  • 어떤 하드웨어 환경에서도 작동할 수 있는 높은 이식성

 인텔의 x86 아키텍처같은 널리 쓰이는 아키텍처 외에도 라즈베리파이, 슈퍼 컴퓨터와 같은 환경에서도 문제없이 동작한다.

 이런 높은 이식성과 오픈 소스로서 가지는 자유로운 커스터마이징이 시너지 효과를 일으켜 결국 상위 500대 슈퍼컴퓨터운영체제 점유율 100%를 차지해버렸다. 

 

 

      https://www.top500.org/statistics/list/ 

 

List Statistics | TOP500

TOP500 Release November 2022 June 2022 November 2021 June 2021 November 2020 June 2020 November 2019 June 2019 November 2018 June 2018 November 2017 June 2017 November 2016 June 2016 November 2015 June 2015 November 2014 June 2014 November 2013 June 2013 N

www.top500.org

 

물론 다른 이유도 있을 수 있지만 이들 이유만으로도 서버시장에서 다른 운영체제보다 리눅스가 우월한 지위에 있다는 것에 대한 설명은 충분할 것이다.

https://www.acmicpc.net/problem/1027

 

1027번: 고층 건물

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)

www.acmicpc.net

문제

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)은 (i,0)부터 (i,높이)의 선분으로 나타낼 수 있다. 고층 빌딩 A에서 다른 고층 빌딩 B가 볼 수 있는 빌딩이 되려면, 두 지붕을 잇는 선분이 A와 B를 제외한 다른 고층 빌딩을 지나거나 접하지 않아야 한다. 가장 많은 고층 빌딩이 보이는 빌딩을 구하고, 거기서 보이는 빌딩의 수를 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 빌딩의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 1번 빌딩부터 그 높이가 주어진다. 높이는 1,000,000,000보다 작거나 같은 자연수이다

 

 

출력

첫째 줄에 문제의 정답을 출력한다.

 

풀이

각 빌딩 간의 선분을 전부 찾고, 해당 선분들 중 가장 많은 종단점이 위치한 빌딩을 찾으면 된다.

 

먼저 (i1, h1)에서 (i2, h2)로 가는 선분이 i1 초과 i2 미만 구간에 속한 빌딩과 접촉하는지 안하는지 판별한다.

 

 

해당 선분의 방정식은 이렇다.

빌딩간 선분의 방정식

이 방정식의 i자리에 판별하고 싶은 빌딩의 위치를 입력해주면 그에 해당하는 선분의 h값과 빌딩의 높이를 비교하면서 가장 많은 종단점이 위치한 빌딩을 찾는다.

 

소스코드

 

더보기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//백준 1027번 고층빌딩 골드 4
namespace BaekJoon_1027
{
    class Program
    {
        static void Main(string[] args)
        {
            //입력받기
            int N = int.Parse(Console.ReadLine());

            string[] raw_building = Console.ReadLine().Split(' ');

            double[] building = new double[N];
            for(int i = 0;i<N;i++)
                building[i] = double.Parse(raw_building[i]);

            //building의 인덱스가 i좌표, 해당 배열의 값이 높이라고 보면 된다.

            Solution(building, Combination(N), N);
            Console.ReadLine();

        }

        static List<int []> Combination(int N) {//주어진 수보다 작은 수들 2개씩 조합 뽑기(중복허용 X)
            List<int []> Combinate = new List<int []>();
            for (int i = 0; i < N; i++) { 
                for(int j = i+1;j<N;j++){
                    int [] a = {i, j};
                    Combinate.Add(a);
                    //Console.WriteLine(a[0] + ", "+ a[1]);
                }
            }
            return Combinate;
        }

        static void Solution(double[] building, List<int[]> comb, int N)
        {
            int[] count = new int[N];
            count.Initialize();

            for (int i = 0; i < comb.Count; i++) {//각 조합마다 연산한다.
                double y_dif = building[comb[i][1]] - building[comb[i][0]];
                double x_dif = comb[i][1] - comb[i][0];
                double vert = (building[comb[i][1]] - building[comb[i][0]]) / (comb[i][1] - comb[i][0]);//선분의 기울기.
                double y_mt = building[comb[i][0]] - comb[i][0] * vert;//선분의 y절편
                bool is_available = true;

                for (int j = comb[i][0] + 1; j < comb[i][1]; j++) { //두 빌딩 사이에 있는 빌딩들이 선분과 만나는지 비교한다.
                    if (building[j] >= vert * j + y_mt) { //빌딩이 해당 선분과 만난다면
                        is_available = false;
                        break;
                    }
                }

                if (is_available)//유효한 선분이면
                {
                    int[] a = { comb[i][0], comb[i][1] };
                    count[comb[i][0]]++;//두 빌딩의 볼 수 있는 빌딩 갯수를 1개씩 추가한다.
                    count[comb[i][1]]++;
                }
            }

            Array.Sort(count);//count배열 정렬 후 가장 큰값 출력.
            Console.WriteLine(count[N-1]);

            return;
        }
    }
}

'Algorithm > BaekJoon' 카테고리의 다른 글

[백준] 파이썬 알고리즘 풀이 1057번 - 토너먼트  (0) 2023.03.08

https://www.acmicpc.net/problem/1057

 

1057번: 토너먼트

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를

www.acmicpc.net

문제

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이때, 번호를 매기는 순서는 처음 번호의 순서를 유지하면서 1번부터 매긴다. 이 말은 1번과 2번이 스타를 해서 1번이 진출하고, 3번과 4번이 스타를 해서 4번이 진출했다면, 4번은 다음 라운드에서 번호 2번을 배정받는다. 번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다.

마침 이 스타 대회에 임한수도 참가했다. 김지민은 갑자기 스타 대회에서 우승하는 욕심은 없어지고, 몇 라운드에서 임한수와 대결하는지 궁금해졌다. 일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 1 라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력하는 프로그램을 작성하시오.

 

 

 

풀이

스타 토너먼트의 총 라운드 수는 log(총 참가자 수)다.

라운드마다 승리하면 바뀌는 지민이와 한수의 번호를 가지고 비교해 만나는 라운드를 구하면 쉽게 풀 수 있다.

 

 

소스코드

 

더보기
n, jimin, hansoo= map(int, input().split())


rounds = ceil(log2(n))


if jimin > hansoo:
    mx = jimin
    mn = hansoo
else:
    mx = hansoo
    mn = jimin


result = 0
for i in range(rounds):
    if (mx-mn) == 1 and (mn%2) == 1:
        result = i+1
        break
    else:
        if mx%2 == 1: mx = (mx//2)+1
        else: mx = mx/2


        if mn%2 == 1: mn = (mn//2)+1
        else: mn = mn/2


print(result)

 

'Algorithm > BaekJoon' 카테고리의 다른 글

[백준] C# 알고리즘 풀이 1027번 - 고층 건물  (0) 2023.03.08

+ Recent posts