유닉스
는 1969년 미국 AT&T의 벨 연구소에서 켄 톰프슨, 데니스 리치, 더글러스 매클로이, 조 오사나에 의해 착안되고 구현되었습니다. 처음 출시된 유닉스는 어셈블리어로 작성되었으며, 1973년 데니스 리치에 의해 일부 하드웨어 및 입출력 루틴을 제외하고는 C언어로 재작성되어 해석 및 확장이 용이해지게 됩니다.
유닉스는 훌륭한 OS였지만 벨 연구소가 AT&T에서 분리된 이후 사유 제품으로 판매하기 시작되며, 사용자의 유닉스 수정이 법적으로 금지되게 됩니다. 여기에 대한 반발로 시작된 GNU 프로젝트는 1983년 리처드 스톨먼의 주도 아래 “완전한 유닉스 호환 자유 소프트웨어 시스템”을 만드는 것을 목표로 개발에 착수했습니다. 1987년에는 컴퓨터과학 교수인 앤드루 타넨바움에 의해 운영체제의 원리 학습을 위한 소형 유닉스 계열 운영체제인 미닉스가 출시되었습니다.
이러한 움직임 속에서 1991년 헬싱키 대학교의 리누스 토발즈는 자신만의 운영체제 커널을 작업하게 되었고, 미닉스를 기반으로 커널 개발을 시작하였으며, GNU 프로젝트에서 개발된 다양한 응용 프로그램을 활용하여 온전히 기능하는 자유 운영 체제를 완성했습니다. 이렇게 탄생하게 된 것이 리눅스
입니다.
이렇듯 역사적으로 리눅스는 유닉스에서 파생된 운영체제입니다. 그래서 유사한 점이 많으며, 광의의 의미로 해석할 때 리눅스는 유닉스에 포함되는 개념이라고도 할 수 있습니다.
유닉스와 리눅스의 주요 차이점을 표로 정리해 보았습니다.
유닉스 | 리눅스 | |
---|---|---|
설명 | 주로 큰 규모의 기업에서 선호하는 OS이며, 리눅스도 포함하는 큰 개념 | 오픈소스 및 무료OS인 것이 특징 |
주로 경량성이 장점으로 활용됨 | ||
제조사 | Oracle, IBM, HP 등 | 오픈소스 커뮤니티(리누스토발즈 관리) |
가격 | 대부분 유료, 일부 무료(Solaris 등) | 대부분 무료, 일부 무료(Enterprises) |
주된 활용 | 트래픽이 많은 서버에 주로 활용 | 서버부터 모바일OS까지 다양하게 활용 |
예시 | Solaris, HP-UX 등 | Ubuntu, Fedora, Debian, Kali 등 |
Unix 대 Linux : UNIX와 Linux의 차이점 - 다른
하위 기술된 모든 쉘 명령은 bash
쉘을 기준으로 합니다.
쉘 스크립트는 문법이 C 계열 언어와 다른 점이 많아 상당히 까다로웠습니다.
한마디로 직관적이지 않더군요.. JSON으로 저장한 파일을 파싱하는 것이 막막했는데,
다행히도 jq
라는 쉘 프로그램을 설치해서 사용하여
awk
, tr
, grep
등의 파싱 명령을 상당부분 대체할 수 있었습니다.
[Linux] jq 명령어 사용법 및 예제 - Bash 스크립트에서 json 파싱
다음은 JSON List에서 각각 “key”항목을 가져와 배열로 만드는 예시입니다. readarray
명령을 사용하면 개행문자로 구문된 문자열을 배열로 저장할 수 있습니다.
# 배열 values가 생성됩니다.
readarray -t values < <(cat "target.json" | jq -c '.[] | .key')
또 제 경우 현재시간을 기준으로 파일이름을 설정했기 때문에, 이를 시간단위로 구분하기 위해 표준형식으로 현재시간을 출력하는 bash 스크립트가 필요했습니다. 다음을 참고하여 현재시간을을 얻었습니다.
[shell script] datetime 현재 날짜, 시간 깔끔하게 출력하기
datetime=$(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)
echo "now: ${datetime}" # 현재시간 출력
위의 명령을 실행하면 YYYY-mm-dd HH:MM:SS
형식의 현재시간을 얻을 수 있습니다.
다음으로는 모든 언어의 문법에서 필수요건이라 할 수 있는 조건문과 반복문입니다.
arr1
의 중복을 제거하여 arr2
에 추가하는 예시를 통해 기본 문법에 익숙해져봅시다.
cnt=0
arr2=( )
for((i=0;i<${#arr1[@]};i++)) # 반복문 예시입니다.
do # arr1의 항목 개수만큼 순회
if [[ ${arr2[@]} =~ ${arr1[i]} ]] # 조건문 예시입니다.
then
echo "exists!" # arr1[i] 값이 arr2에 이미 있는 경우
else
#echo "not exists!"
arr2[$cnt]=${arr1[i]}
cnt=$(($cnt+1)) # cnt += 1 과 같은 의미입니다.
fi
done
아래 링크들을 참고했습니다.
Check if a Bash Array Contains a Value | Baeldung on Linux
Looping over arrays, printing both index and value
GUI 사용과 비교할 때, CUI에서 사용하는 쉘 명령어는 스크립트 파일로 자동화할 수 있다는 것이 가장 큰 특장점입니다. 그래서 서버와 같은 운영 환경을 관리하는 인프라
가 별도의 직군으로 분류될 정도로 큰 역할을 하죠.
다음을 통해 쉘을 이용한 시스템 관리 사례들을 확인할 수 있습니다.
정리/요약하면 개발자 입장에서 다음과 같은 작업을 주로 사용하게 됩니다.
WSL을 설치해야 하는 윈도우와 달리, 맥북은 기본적으로 유닉스 기반의 쉘로 동작합니다.
물론 리눅스는 아니죠, uname -a
로 제 터미널의 커널 이름과 버전을 확인해 보겠습니다.
Darwin Kernel v22.3.0
을 사용 중임을 알 수 있습니다.
Darwin은 BSD Unix 기반의 커널이라고 합니다. 자세한 내용은 다음을 참조해주세요.
macOS vs. Linux: 5 Key Differences You Should Know
본 미션에서 수행하셨던 것처럼, macOS에서 진정한 Linux를 사용하려면 VM(Virtual Machine)을 사용해야 합니다. 주요 프로그램은 소개된 바와 같이 다음이 있습니다.
개인적으로는 맥 전용 소프트웨어인 Parallels를 강력 추천합니다!
정보보안 업계에 있던 사람이다보니 VM을 쓸 일이 많았는데, 아무래도 오래전부터 맥 전용 가상환경을 지원하다보니 설정에 있어서 자동화된 부분이 많더라구요.
특히 최신 버전의 윈도우와 다양한 종류의 리눅스를 별도의 이미지 파일 없이 원클릭으로 설치 및 실행이 가능하다는 것이 엄청난 장점..!
설치 후엔 비밀번호만 설정하면 메인 화면을 보실 수 있습니다.
sshd 서비스는 기본적으로 구동중이며, net-tools, node.js, vim editor 등 활용할 개발 환경만 간단히 설치해주겠습니다. 보통 apt
명령을 활용합니다.
sudo apt install net-tools
ifconfig
service sshd status # sshd가 구동중임을 확인할 수 있습니다.
sudo apt install nodejs
sudo apt install vim
하지만 Node.js의 경우 기본적으로 v12
가 설치되었습니다. 리포지터리가 기본적으로 이전 버전만 지원하나 보네요. 저는 로컬 개발환경과 똑같이 하기 위해 다음을 참고해 재설치했습니다.
Linux : Ubuntu 22.04 : Node.js and npm 설치 방법, 예제, 명령어
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs # 재설치
저는 v20
을 설치하기 위해 위와 같이 수정했습니다.