컴퓨터 내의 컴퓨터를 만들어 작동하는 가상 환경이다.
가상머신의 중요한 특징은 머신 안에서 돌아가는 소프트웨어가 가상머신이 제공하는 환경 및 자원에 의해 제약을 받으며, 가상세계를 벗어날 수 없다.
가상화가 유용한 상황
-다른 OS를 활용하고 싶은 상황
-위험부담 없이 여러 실험을 하고 싶을 때
Host : 실제 컴퓨터를 의미한다.
Guest : 가상 컴퓨터를 의미한다.
명령어의 집합 구조이며, CPU가 인식해서 무슨 명령인지 이해하고 실행할 수 있는 기계어의 명령어를 의미한다.
컴퓨터에서 다양한 과정을 걸쳐서 S/W -> H/W 단계로 넘어가게 되는데, 이때 중간다리 역할을 해주는 녀석이 ISA라고 할 수 있겠다.
-x64 and x86
x86계열의 CPU가 32비트까지 나와 있고, 64비트까지 지원하도록 확장된 것이 x86-64이다.
-32bit와 64bit의 차이는 무엇인가?
저장 장치의 bit폭이다. 우리는 이 저장 장치를 레지스터라 부른다. 레지스터 우리가 익히 아는 캐시보다도 빠르고, 저장 용량은 더 작다. 컴퓨터 기억 장치 중 가장 빠르게 작업을 수행할 수 있는 녀석이다. 이 크기가 16bit라면 16bitCPU라고 정의하고 64bit라면 64bitCP가 된다.
-레지스터의 bit가 클수록 좋은 점은?
레지스터는 우리가 생각하는 HDD or SSD와 같은 저장 매체가 아니라 연산 대상 및 연산 결과를 기억하는데 사용된다. 16bit가 한 번에 처리할 수 있는 양은 2의 16제곱 65536이고, 64비트는 2^64 18448744073709551616이 된다. 즉 bit가 클수록 많은 양의 데이터를 처리할 수 있기에 더 빠른 연산을 할 수 있다. 특징으로는 x86명령어가 x86_64에서 실행가능하지만 그 반대로는 불가능하다.
-메모리 제한
32bit환경에선 RAM의 한계가 4GB밖에 되지 않는다. 그러나 64bit는 최대 16EB(엑사바이트)까지 지원하지만, 그까지 인식하는 OS가 없다.
++ 요즘 잘 나가는 M1 칩셋이 RISC구조이고, 인텔은 CISC구조를 사용한다.
여러 운영체제를 실행하는 가상 머신의 베이스가 되는 물리 컴퓨터를 다중화하는 것을 시스템 가상머신이라고 한다.
동시에 여러 개의 운영체제를 설치하고 실행하기 위해 메모리를 분할하여 한 개의 컴퓨터에 여러 개의 분리된 실행환경을 생설할 수 있다.
-대표적으로 VMware, VirturalBox, Parellels 등이 존재한다.
-장점
1. 각 운영체제 환경이 분리된 상황에서 같은 컴퓨터에서 병렬적으로 실행할 수 있다.
2. 실제 시스템과 약간 다른 ISA를 제공해준다.
-단점
1. VM이 동일한 하드웨어에 간접적으로 접근해서 효율성이 떨어진다.
2. 동일한 물리적 환경에서 병렬적으로 실행되는 여러 개의 VM은 시스템 환경에 따라서 성능이 달라질 수 있다.
저장 공간을 여러 개로 분리하는 작업. 실제로 사용하는 데이터와 백업용 데이터를 나눠서 저장하는 등 여러 방면으로 사용할 수 있다. (ex. 윈도우 포맷 후 파티션 할당으로 SSD에 os를 설치하고 HDD는 백업으로 사용)
각 파티션에 대한 정보는 디스크의 파티션 테이블에 저장된다.
이후 운영체제에서는 디스크를 읽을 때 이 테이블을 먼저 읽는다. 운영체제는 이 파티션들을 독립적인 장치로 인식한다.
디스크는 발견 순으로 sda, sdb ...(생략)
파티션은 sd1, sda2... (논리 파티션은 sda5부터)
마운트
하드웨어 장치를 사용하기 위해서 운영체제에 인식시키는 작업이다. 특정 디렉토리에 연결해야 한다.
볼륨
컴퓨터가 인식할 수 있는 파일시스템을 사용해 접근할 수 있는 저장 영역
논리 볼륨
저장공간을 가상화해 물리 디스크 크기에 제한을 두지 않게 할 수 있다. 용량을 유연하게 조절할 수 있고, 실제 데이터에 영향을 끼치지 않고 효과를 테스트할 수 있다.
LVM은 논리적인 공간 관리의 약자이다. 파티션은 어떤 한 개를 여러 개로 나누는 개념이지고, LVM은 여러 구성을 한 개에 담아주는 개념과 흡사하다. 예를 들어 파티션이 한 개의 수박을 여러 조각으로 자르는 것이라면 LVM은 여러 개의 과일을 한 그릇에 담는다고 생각하자.
언제 LVM을 쓸까?
물리적인 드라이브의 공간이 부족해진다면 파일을 지워서 공간을 확보하던지, 더 큰 용랑의 하드나 SSD를 사용해야한다. 그러나 실제로 서버를 운용할 때 자주 사용하는 리눅스의 경우에는 갑자기 서버에 트래픽이 많이 몰려서 확장을 해야한다거나 할 때마다 데이터를 백업하고 더 큰 용량의 디스크를 교체하기란 사실상 불가능하다.
enforce mode
응용 프로그램이 제한된 동작을 수행하지 못하게 제한하는 모드이다.
compain mode
응용 프로그램을 제한하지 않고, 위반 사항을 보고하는 로그만 만든다.
자원을 최대한 효율적으로 사용할 수 있도록 도와주는 운영체제의 핵심 소프트웨어이다.
예를 들어, 아래와 같은 그림에서 한 개의 프로그램이 작업을 수행해야할 때 하드웨어의 자원을 효율적으로 관리하고 사용할 수 있게 해준다. 커널은 운영체제의 핵심 역할 중 하나이다.
iptables의 설정 도구로서 복잡하지 않은 방화벽(Uncomplicated Fireewall)을 의미한다.
서버는 어디서든지 외부에서 접근이 가능해 보안이 취약할 수 있다. 이에 따라 이미 네트워크 구성에서 하드웨어/소프트웨어에서 방화벽이 이미 사용되고 있을 수 있지만, 각 서버의 방화벽 설정은 매우 유용할 수 있다.
iptables가 매우 적합하지만 설정과 관리가 복잡해 UFW가 나오게 됐다.
ufw status
SSH는 Secure Shell의 약자로, 두 컴퓨터 간의 통신을 하게 해주는 하나의 프로토콜이다.
프로토콜의 예시로는 우리가 흔히들 아는 HTTP, HTTPS, FTP등이 있다.
sudo ufw status verbose
HTTPS에서 통신 중 데이터가 암호화된 것처럼 SSH를 이용한 통신에서는 Client와 Host간의 통신이 암호화됐다. 고로 굉장히 안전하여 많은 사람들이 사용한다.
과제에서는 강력한 비밀번호 정책을 세우기를 원해서 아래와 같은 추가 설정이 필요하다.
아래와 같은 설정을 한 후에
command -> sudo vi /etc/login.defs
login.defs
PASS_MAX_DAYS 30
PASS_MIN_DAYS 2
PASS_WARN_AGE 7
sudo apt install libpam-pwquality
sudo vi /etc/pam.d/common-password
pam_pwquality.so 라인에 아래와 같이 추가한다.
retry=3 => 암호 입력을 최대 3회까지
minlen=10 => 암호의 최소 길이는 10이다.
difok=7 => 기존 패스워드와 달라야하는 문자의 수는 7
ucredit=-1 => 대문자 한 개 이상
lcredit=-1 => 소문자 한 개 이상
dcredit=-1 => 숫자도 한 개 이상
reject_username => usename이 그대로거나 뒤집혀서 새 패드워드로 사용했는지 확인한다. 맞다면 reject
enforce_for_root => root 사용자가 패스워드를 바꾸려고 할 경우에도 위와 같이 적용
sudo 사용 중 잘못된 비밀번호로 인한 오류가 발생할 경우에 원하는 사용자 지정 메시지가 표시돼야 한다.
command -> sudo visudo
### /etc/sudoers
Defualts authfail_message="Authentication attempt failed." => 권한 획득을 실패할시에 띄울 메시지
Defaults badpass_message="Wrong password!" 암호 입력이 성공하지 못했을 때
Defaults log_input => sudo를 통해 입력된 input은 로그에 기록된다.
Defaluts log_output => sudo를 통해 입력된 output은 로그에 기록된다.
Defaults requiretty => tty에 연결되지 않은 채로 sudo를 실행하는 것을 금지한다. 예를 들어 쉘에서 sudo 커맨드 금지
Defaults iolog_dir="/var/log/sudo" => 로그 저장 경로
crontab -<옵션>
e : 수정
l : 확인
r : 삭제
uname
proc
cat /proc/cpuinfo
free -m (MB단위)
df -BM -a(MB크기로 용량을 모두 표시)
mpstat (sysstat이라는 패키지를 다운 받아서 쉽게 출력)
who
lsblk
ss (네트워킹 상태 확인 명령어)
/sbin/ipconfig | grep broadcast
/sbin/ifconfig | grep 'ether '
grep /var/log/auth.log
!
sysstat
을 받아서 mpstat
이라는 명령어를 사용하면 쉽게 현재 CPU를 알 수 있다.
#그룹 추가
usermod -G sudo,user42 <사용자이름>
#사용자 추가
sudo adduser user01
#현재 user 한 번에 보는 거
grep /bin/bash /etc/passwd | cut -f1 -d:
#사용자 비밀번호 변경
sudo passwd <사용자이름>
#호스트네임 체크
hostnamectl
#호스트네임 변경
sudo hostnamectl set-hostname <호스트 이름>