July 21st 2019
이번 주 Stream에 관해 공부하려 계획했지만, stream을 찾아보니 서버와 클라이언트 통신, 네트워크에 대한 지식이 더 있었으면 좋겠다고 생각했고, 네트워크를 찾아보니 Linux 기본기를 배우고 오라고 했습니다. 그래서 Linux에 대한 기본기를 같이 공부하기로 했습니다. Fundamental이 중요하니까요.
저는 프론트엔드 위주로 공부하기 때문에, 아무래도 프론트엔드 외의 주제는 시간 투자가 조금 적지만 한 걸음 한 걸음이 무서운 법이기 때문에 천천히 가도 멈추지는 않을 것입니다. :)
Aug 25th 2020
1970년 말, 마이크로프로세서가 나오고 일반 사람들도 개인 컴퓨터를 소유할 수 있게 되었습니다. 그 이전에는 대기업이나, 정부 기관에서만 컴퓨터를 사용할 수 있었어요. 이러한 변화로 개인의 영향력, 창조력이 더 커질 수 있었습니다.
하지만, 곧 거대 기업이 세상의 컴퓨터에 대한 제어권을 가지게 되었습니다. 이에, 사람들은 개인이 자신의 컴퓨터를 손수 제어하고자 소프트웨어를 만들었고 이것이 바로 리눅스입니다.
리눅스를 언급할 때 자유를 말하는데, 우리는 여기서 의미하는 자유에 대해 생각해 불 수 있습니다. 이 자유란 자신의 컴퓨터로 무엇을 할 지 결정할 수 있는 힘과 비밀이 전혀 없는 컴퓨터 그 자체입니다. 리눅스에는 비밀이 없습니다.
Contents
Get into the Shell
Linux Filesystem
이번 포스팅을 정리하며 Linux를 다루기 위해 필요한 Linux shell과 command line environment에 대해 알아보려 해요. 브라우저의 콘솔에서 자바스크립트를 사용할 수 있는 것, 또는 interpreter 이용해 파이썬을 사용하는 것을 command line interface의 예로 들 수 있습니다.
Command line interface도 일반적으로 비슷한 방식으로 작동합니다. 우리가 interface에 command를 입력하면 시스템은 명령어에 따라 작동 한 후 결과를 보여줍니다.
Command line interface의 시작은 20세기 중반이며, 사람들이 컴퓨터와 소통하기 위해 사용한 한 방법(Computer terminal)이었습니다. 오늘날 터미널은 보통 소프트웨어를 의미합니다. 하지만, 초기에 터미널이란 컴퓨터와 소통하기 위한 하드웨어를 의미했습니다.
터미널이 있기 전, 사람들은 데이터를 펀치 카드를 이용해 컴퓨터에 한 번에 입력했습니다. 이후, 터미널을 이용해 사람이 커맨드를 직접 컴퓨터에 입력하고, 그 결과를 즉각 확인할 수 있게 되었습니다. 이것은 User Interface의 매우 큰 도약이며, 여러 이유로 현재에도 터미널을 사용하고 있습니다.
Graphic User Interface와 비교하면 장단점이 있지만, 일반적으로 표현할 수 있는 부분이 더 넓습니다. 터미널을 이용하면 network bandwitdth 효율이 높으며, 원격으로도 파일의 수정이 가능합니다. 다량의 파일을 timeStampe에 따라 분류하거나 이름을 수정하는 작업을 할 때 GUI로는 쉽지 않을 거에요. 프로그램적이지 않기 때문이죠. 하지만, Linux Shell과 같은 CLI를 이용하면 여러 작업을 실행하는 스크립트를 짤 수 있습니다.
이렇게 여러 스크립트를 작성하고, 작성한 스크립트들을 구성해서 프로그램을 만들 수 있는 점이 Command Line의 멋진 점인거 같습니다.
유저나 쉘 스크립트를 통해 입력된 쉘 명령어는 컴파일 되는 것인 아니고 interpret 됩니다. 컴파일러가 명령어를 기계가 읽을 수 있도록 변환하는 반면, Shell은 입력된 명령어를 시스템 상에서 찾습니다. Shell이 커널에 명령어를 전달하는 것 외에도 주요 기본 기능으로 설정 파일을 기반으로 한 유저의 작업 환경을 제공합니다.
Virtual Machine(VM)은 컴퓨터를 시뮬레이터 하는 컴퓨터 프로그램입니다. VM 소프트웨어를 설치한 후 guest operating system을 만들기 위해 VM에 Linux를 설치할 것입니다. 참고로, 실제 컴퓨터에 설치된 Operating System(OS)은 host OS라고 합니다.
프로그래머가 Virtual Machine을 사용하는 몇 가지 이유가 있다고 합니다.
VM을 사용하면, 매일 작업하는 환경에서 영향을 받지 않는 독립된 환경을 구축할 수 있습니다. 프로그래머는 guest OS에 프로그램을 설치하고 다른 환경에 영향을 받지 않는 개별적인 설정을 할 수 있습니다.
VM은 또한 환경을 시뮬레이터 할 때도 사용할 수 있습니다. 대부분의 개발자는 Window나 Mac OS를 사용하는데, 가끔은 Linux와 같은 다른 환경에 배포해야 하는 경우도 있습니다. 이럴 때, Linux VM을 사용하면 현재의 host OS에서도 코드를 실행해 볼 수 있습니다.
Install Vagrant Link
위의 과정을 마치면 커맨드창에 아래와 같은 promt를 볼 수 있고, 이제 Shell 명령어를 입력할 수 있습니다. ls 명령어를 입력해 잘 작동하지는 확인을 해 보아요.
vagrant@vagrant-ubuntu-trusty-64:~$
우리는 터미널을 GUI와 같은 컴퓨터의 또다른 인터페이스로 생각할 수 있습니다. GUI와는 다르게 터미널은 텍스트 기반의 인터페이스를 가집니다. 하지만 이것이 터미널이 GUI에 비해 덜 유용하다는 것을 뜻하지는 않습니다. 대부분의 데스크탑 프로그램의 인터페이스가 GUI에 기반해 만들어졌지만, 의외로 많은 프로그램들이 GUI가 꼭 필요하지는 않습니다. 터미널을 이용해 할 수 있는 몇가지 작업들을 살펴보면 아래와 같습니다.
터미널은 키보드로 입력을 하면 window로 텍스트를 출력하는 프로그램입니다. 엄밀히 이것은 터미널 애뮬레이터입니다. 왜냐하면 이것은 이전의 하드웨어 터미널을 흉내내어 키보드의 input을 받아 화면에 텍스트를 출력하기 때문입니다. 하지만, 터미널 자체는 input으로 어떠한 행동을 할지는 모르고, 단순히 Shell이나 다른 Command Line Program을 사용하기 위한 인터페이스에 지나지 않습니다. 때문에 어떠한 행동을 취할지에 대한 다른 프로그램의 도움을 받아야 합니다.
지금의 경우 이 프로그램이 Shell 입니다. 터미널에 키보드로 어떠한 값을 입력하면 터미널은 입력된 값을 별도의 프로그램에 전달합니다. Shell은 이 값을 명령어로 인식하고 실행한 후 결과를 터미널에 전달해 우리가 스크린에서 그 결과를 볼 수 있도록 합니다.
터미널을 Shell 없이도 사용할 수 있으며, 대신 다른 여러 종류의 프로그램 중 하나를 선택에 실행할 수 있습니다. 기본값은 Shell이지만 Linux 시스템의 default 프로그램은 Bash입니다. TCSH, KSH 등 다른 종류의 프로그램 또한 존재합니다. 추가로, 우리는 터미널이 아닌 파일에 직접 shell 명령어를 입력하고 컴퓨터가 이 파일의 shell 프로그램을 실행하도록 할 수도 있는데 이러한 방식을 shell scripting이라고 힙니다.
웹 서비스를 개발해 리눅스 환경에서 배포를 하거나, 시스템 및 서버 관련 작업을 할 때 파일시스템에 대한 이해가 필요합니다. 그래서, 쉘을 이용해 파일과 디렉토리 관련해 간단하게 알아보도록 할게요.
리눅스 파일시스템에는 파일과 다렉토리가 있습니다. 익숙한 개념이지요. 파일과 디렉토리 명으로 어떠한 글자도 사용할 수 있지만 슬래시는 사용할 수 없습니다. 그리고, 특수 문자를 사용하려면 이름 전체를 따옴표로 감싸던가, 특수 문자 전에 백슬래시를 추가해 주어야 합니다. 이러한 방식을 quoting, escaping 이라고 합니다.
리눅스에서도 디스크 파티션이 나누어 진 경우가 많습니다. 하지만, 윈도우와 다르게 리눅스에서의 root는 하나만 존재합니다. 바꿔말하면, 어느 디렉토리에 파일이 존재하던지, root부터 full path로 접근하면 찾을 수 있습니다. 윈도우와 또다른 차이점은 리눅스에서는 디렉토리를 구분할 때 포워드 슬래시를 사용하지만 리눅스에서는 백슬래시를 사용합니다.
키워드 하드링크, 소프트 링크
Full path로 파일에 접근하는 방식을 절대경로(absolute path)라고 합니다. 절대경로는 이해하기 쉽지만 네스팅이 많은 경로는 불편할 수 있습니다. 이 경우, 현재 워킹 디렉토리 기준으로 표기하는 상대 경로를 사용할 수 있습니다.