2021-01-08-TIL
2021-01-08-TIL
리눅스의 역사
타넨바움 교수가 미닉스를 개발해서 배포했는데, 리누스 토르발즈가 변경 요청을 했지만 받아들이지 않아서 포기하고 혼자서 만들게 되었다.
조금 더 찾아보면, 교육용 OS였던 MINIX는 수정과 재배포에 라이선스 제약이 있었고 16비트 설계라 당시 보급되던 32비트 386 PC에 잘 맞지 않았다. 토르발즈는 1991년 8월 25일 comp.os.minix 뉴스그룹에 취미로 만드는 무료 OS라며 Linux를 처음 알렸고, 1992년부터 GPL로 배포하기 시작했다. 같은 해 타넨바움이 Linux의 모놀리식 커널 설계를 비판하면서 두 사람 사이의 유명한 논쟁이 벌어졌다.
유닉스와의 관계로 보면, Linux는 유닉스의 코드를 가져온 것이 아니라 유닉스처럼 동작하도록(POSIX 호환을 목표로) 새로 작성한 커널이다. 여기에 GNU 프로젝트의 셸, 컴파일러, 유틸리티를 합쳐 하나의 OS 배포판이 된다.
쉘 스크립트
셸 스크립트는 터미널에서 치던 명령을 파일에 모아 한 번에 실행하는 프로그램이다. 첫 줄의 #!/bin/bash 같은 셔뱅(shebang)으로 어떤 인터프리터가 실행할지 정하고, 변수, 조건문(if [ ... ]), 반복문(for, while), 함수를 쓸 수 있다. 셸에는 sh(Bourne shell), 그 확장인 bash, bash와 호환되면서 자동완성과 플러그인이 풍부한 zsh, C 문법을 닮은 csh/tcsh 등이 있다. 로그 정리, 백업, 배포처럼 반복되는 작업을 자동화할 때 주로 쓴다.
- https://twpower.github.io/131-simple-shell-script-syntax
애자일
애자일은 큰 계획을 처음에 확정하기보다 짧은 주기로 동작하는 결과물을 만들고 피드백을 반영하며 방향을 고쳐 가는 개발 방식이다. 애자일 선언문은 프로세스와 도구보다 개인과 상호작용을, 포괄적인 문서보다 작동하는 소프트웨어를, 계약 협상보다 고객과의 협력을, 계획을 따르기보다 변화에 대응하기를 더 가치 있게 여긴다고 밝힌다.
- https://brunch.co.kr/@insuk/5
컴파일 과정
C 프로그램이 실행 파일이 되기까지는 네 단계를 거친다. GCC 문서도 컴파일이 전처리, 컴파일, 어셈블, 링크의 최대 네 단계로 이루어진다고 설명한다.
- 전처리:
#include,#define같은 지시문을 처리해 헤더를 붙이고 매크로를 펼친다(gcc -E). - 컴파일: 전처리된 소스를 어셈블리 코드로 바꾼다(
gcc -S). - 어셈블: 어셈블리를 기계어 목적 파일(
.o)로 바꾼다(gcc -c). - 링크: 여러 목적 파일과 라이브러리를 묶어 실행 파일을 만든다.
- https://gracefulprograming.tistory.com/16
TCP/IP: 포트 포워딩
hostIP port guestIP port
127.0.0.1 10022 10.0.2.15 22
VirtualBox 같은 가상 머신을 NAT 모드로 띄우면 게스트는 호스트 뒤의 사설 네트워크에 놓이고, VirtualBox 매뉴얼에 따르면 첫 번째 NAT 카드는 10.0.2.0 사설 네트워크에 연결되고, 내장 DHCP 서버가 게스트에 보통 10.0.2.15를 준다. 외부에서 게스트로 바로 접속할 수 없으므로 포트 포워딩 규칙을 둔다. 위 설정은 호스트의 127.0.0.1:10022로 들어온 TCP 연결을 게스트의 22번 포트(SSH)로 넘긴다는 뜻이다. 그래서 호스트에서 ssh -p 10022 user@127.0.0.1로 게스트에 접속할 수 있다.
SSH 비밀번호 없이 로그인
공개키 인증을 쓰면 비밀번호 없이 로그인할 수 있다. ssh-keygen으로 개인키와 공개키 쌍을 만들고, 공개키를 서버의 ~/.ssh/authorized_keys에 추가한다(ssh-copy-id가 이 작업을 해 준다). 접속할 때 서버는 클라이언트가 그 공개키에 대응하는 개인키를 가지고 있는지 확인한다. 개인키는 절대 서버로 보내지 않으므로 외부에 노출되지 않게 권한(chmod 600)을 관리해야 한다.
- https://opentutorials.org/module/432/3742
표준입력/표준출력/표준오류
프로세스는 시작할 때 세 개의 표준 스트림을 받는다. 표준 입력(stdin, 0번), 표준 출력(stdout, 1번), 표준 오류(stderr, 2번)다. 정상 결과와 오류 메시지를 다른 스트림으로 나눠 두었기 때문에, 결과만 파일로 저장하고 오류는 화면에 보는 식의 분리가 가능하다.
- https://ttend.tistory.com/732
- https://shoark7.github.io/programming/knowledge/what-is-standard-stream
리다이렉션
리다이렉션은 표준 스트림이 가리키는 대상을 파일로 바꾸는 기능이다. >는 표준 출력을 파일에 덮어쓰고, >>는 이어 쓰고, <는 파일을 표준 입력으로 읽는다. 앞에 파일 디스크립터 번호를 붙여 2> err.log처럼 표준 오류만 보낼 수 있고, 2>&1은 표준 오류를 표준 출력과 같은 곳으로 보낸다.
파이프
파이프(|)는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력으로 연결한다. cat access.log | grep ERROR | wc -l처럼 작은 도구를 이어 붙여 하나의 처리 흐름을 만든다. 한 가지 일을 잘하는 작은 프로그램을 조합한다는 유닉스 철학이 이 기능 위에서 성립한다.
File Descriptor
파일 디스크립터는 프로세스가 연 파일을 가리키는 음이 아닌 정수다. 커널은 프로세스마다 열린 파일 테이블을 두고, open()이 돌려준 번호로 read(), write(), close()를 호출한다. 일반 파일뿐 아니라 파이프, 소켓, 터미널도 같은 방식으로 다루기 때문에 리다이렉션과 파이프가 모두 이 번호를 바꿔 끼우는 일로 구현된다.
- https://en.wikipedia.org/wiki/File_descriptor
Linux VFS
VFS(Virtual File System)는 커널 안에서 ext4, XFS, NFS 같은 서로 다른 파일 시스템 위에 공통 인터페이스를 제공하는 추상화 계층이다. 리눅스 커널 문서는 VFS를 사용자 공간 프로그램에 파일 시스템 인터페이스를 제공하는 커널 소프트웨어 계층으로 설명한다. 덕분에 프로그램은 어떤 파일 시스템인지 몰라도 같은 open(), read() 시스템 콜을 쓴다.
- https://www.kdata.or.kr/info/info_04_view.html?field=&keyword=&type=techreport&page=134&dbnum=128495&mode=detail&type=techreport
학습 과제
리눅스 역사와 유닉스와 차이를 학습하고 정리한다. *
여러 가지 쉘 종류에 대해 학습하고 정리한다. *
본인만의 쉘 환경을 설정하고 정리해도 좋다.
셀 스크립트에 활용한 다양한 사례에 대해서 조사하고 정리한다. *
각자 컴퓨터 개발 환경에서 리눅스와 비슷한 터미널 환경을 설정하기 위한 방법을 학습하고 정리한다. *
아래 gist는 gist 저장소를 clone해서 이미지를 추가하고 push하는 방법을 정리한 것으로, 정리한 내용에 그림을 붙일 때 참고할 수 있다.
- https://gist.github.com/mroderick/1afdd71aa69f6b29601d335751a1a9be
댓글
아직 댓글이 없습니다