

(Oracle VM Virtual Box 스냅샷은 꼭 poweroff 후에 찍도록 하자.
그래야 시스템이 잘 안꼬인다....)
유닉스의 역사는 1960년대 중반부터 시작되었다.
당시 AT&T와 GE, MIT 공과대학은 미 국방성의 지원을 받아 한 운영체제 내에서 다수의 작업을 수행할 수 있는 멀틱스(Multics) 프로젝트를 수행했다.
이 프로젝트의 목표는 다중 사용자, 다중 프로세서, 다중 프로세스 기반의 프로그램을 만드는 것이었다.
해당 프로젝트는 미 국방성의 지원을 받은 만큼 보안 관련한 개념을 지원하도록 설계가 계획되어 있었다.
그러나 해당 프로젝트는 1969 즈음에 사실상 실패로 끝나게 되고, AT&T의 Ken Thompson은 사무실에 있던 PDP-7 컴퓨터에 Multics 프로젝트를 이용하여 간단한 게임인 Space Travel을 구현했다.
이후 Ken Thompson의 동료였던 Dennis Ritchie가 C언어를 기반으로 기존의 어셈블리어로 구현되었던 코드를 1973년에 C 코드로 재개발했다.
다양한 작업을 동시에 수행하려다가 실패한 Multics와 달리 한 가지 작업이라도 잘한다는 의미로 Unics로 명명된 유닉스는 이후 발음대로 UNIX로 정립되어 사용되기 시작했다.

BSD는 유닉스를 대학과 개발자 커뮤니티 중심으로 발전시킨 "유닉스의 뇌" 같은 존재이다.
1977년, 미국 캘리포니아 대학교 버클리(UC Berkeley)에서 시작되었다.
버클리의 대학원생들이 유닉스를 개선하고 실험적으로 확장하기 시작했다.
초기에는 단순한 "애드온 소프트웨어 패키지" 수준이었지만, 점차 운영체제 자체로 성장하게 되었다.
주도 인물은 Bill Joy이다.


유닉스는 타 OS에 비해 여러 가지 특징을 가지고 있다.
유닉스는 현존하는 운영체제 중 가장 이식성이 높은 운영체제이다.
SPARC, ALPHA, PowerPC 같은 시스템은 물론 x86과 ARM 계열의 시스템에서도 이식이 용이하다.
Linux 시스템 역시 서버에서 사용되는 CPU 뿐 아니라 임베디드 시스템 등에서도 널리 사용되고 있다.
2000년초부터 64bit CPU를 지원하고 Multi-Processing을 지원함으로써 병렬처리에 탁월한 성능을 발휘할 뿐만 아니라 다중 Clustering을 지원한다.
유닉스 시스템은 오랜 기간 발전해 오면서 그 안정성을 인정받아 왔을 뿐만 아니라 다양한 보안 위협으로부터 대응하기 위해 업계 표준의 다양한 보안 기능을 탑재하고 있다.
동시에 여러 사람이 동일 시스템에 접속하여 사용하는 것을 의미하며, 통상적으로 네트워크를 통해 접속한다.
한 시스템에서 동시에 여러가지 프로그램을 구동하는 것을 의미한다.
근래에는 당연하게 생각하는 부분일 수 있으나, 과거의 시스템은 한번에 하나의 작업만이 가능했었다.
예를 들어 MP3를 들으면서 오피스를 실행할 수 없었고, 특정 작업을 위해 기존의 업무를 종료해야만 했었다.
UNIX의 파일시스템은 계층적 구조로 개발되어 파일을 체계적으로 관리할 수 있다.
윈도우와 달리 루트(/) 파일시스템은 디스크 및 파티션의 개수와 무관하게 오직 한 개만 존재한다.
커널은 운영체제의 핵심이다. 커널은 파일시스템 관리, 하드 디스크에 데이터를 저장하는 것과 같은 장치 관리, CPU 제어, 메모리 및 프로세스 관리와 같은 역할을 포함하여 하드웨어를 관리하고 제어한다.

쉘은 UNIX/Linux에서 사용자와 Kernel 사이의 Interface를 담당하는 프로그램이다.
쉘은 사용자가 명령어를 내리면 이를 Kernel이 알아들을 수 있는 명령어로 해석해서 Kernel로 전달하는 해석기이다.


디렉토리는 파일을 가지고 있거나, 또 다른 디렉토리를 가지고 있는 그룹이며 이는 계층적으로 구성되어 있다. 디렉토리와 파일은 파일시스템에 의해 관리된다.
명령어의 구분자는 '공백' 띄어쓰기이다.
man ls : ls 명령어의 매뉴얼 페이지를 보여줌
ls --help : ls 명령어를 사용할 수 있는 옵션들과 간단한 설명을 보여줌
해당 명령어의 버전 정보를 출력
info ls : ls 명령어에 대한 info 문서가 표시됨
모든 명령어가 info 페이지를 갖는 것은 아님
ls -a: 모든 파일 출력
ls -l: long listing format 으로 출력
ls -A: . and .. 을 제외한 리스트 출력
ls -1: 라인당 한개파일만 출력
ls -S: 크기순으로 출력
ls -R: subdirectory 포함 모든내용 출력
ls -r: 역순정렬
ls -h: size 정보에 K,M, G 사용
ls -u: access time 표시
ls -s: 파일의 할당크기 표시
ls -w: 화면 표시 너비 변경
ls -i: 파일의 인덱스 넘버 표시
ls -Z: selinux 관련
ls --full-time: full-iso 스타일로 표시
ls --format=WORD: WORD 로 지정된 스타일로 표시
ls --time=WORD: atime, ctime 표시 옵션
ls -d: 디렉토리 엔트리 리스트 옵션
cd [디렉토리 경로]: 이동하려는 디렉토리로 이동
cd .: 현재 디렉토리
cd ..: 한 단계 상위 디렉토리로 이동
cd /: 최상위 디렉토리로 이동
cd $변수명: 변수에 저장된 경로로 이동
cd ~, cd &HOME, cd: 사용자 홈 디렉토리로 이동
cd ~계정명: 입력한 사용자의 홈 디렉토리로 이동
cd -: 이전 경로로 이동
pwd -L: 심볼릭 링크가 포함된 경로에도 환경변수에 등록된 pwd를 사용
pwd -P: 심볼릭 링크가 포함된 경로에는 실제 경로를 출력
touch -a: 현 시간으로 파일의 접근 시간, 변경 시간을 수정
touch -c: 기존 파일이 없으면 파일이 생성되지 않음
touch -d: 지정한 시간으로 접근 시간, 수정 시간이 수정되고
변경시간은 현재 시간으로 수정됨
touch -r: 지정한 파일의 접근 시간, 수정 시간으로 파일이 수정되고
변경 시간은 현재 시간으로 수정됨
touch -m: 현 시간으로 파일의 수정 시간, 변경 시간을 수정함
touch -t: 지정한 시간으로 접근 시간, 수정 시간을 수정되고
변경 시간은 현재 시간으로 수정됨
cp -r: 하위 디렉터리(하위에 있는 모든 파일포함)까지 모두 복사
cp -v: cp 명령어를 수행하면서 복사 진행 상태를 출력
cp -p: 파일 or 디렉터리를 복사할 때
복사 대상의 소유자(계정), 그룹, 권한등의 정보까지 복사
cp -i: 복사대상 파일이 이미 해당 위치에 있다면,
사용자한테 덮어 쓰기 여부를 묻고 복사
cp -f: 복사대상 파일이 이미 해당 위치에 있다면 파일을 지우고, 강제로 복사
mv -b: 이동 위치에 파일이 있을 경우 백업 파일 생성
mv -f: 파일이 이미 존재할 경우, 강제 덮어쓰기
mv -i: 파일이 이미 존재할 경우, 덮어쓸지 물어보는 옵션
mv -n: 파일이 이미 존재할 경우, 덮어쓰지 않음
mv --strip--trailing-slashes: /를 이동할 파일에서 제거하고 이동
mv -S: 백업 옵션 사용시 suffix를 등록
옵션을 사용하지 않으면 suffix로 '~'를 등록
mv -t: Source 디렉토리에 Destination 디렉토리가 전부 이동
mv -T: 옮길 대상을 일반 파일로 취급
mv -u: 이동할 파일이 이동시킬 파일보다 최신일 경우에만 파일을 이동
mv -v: 파일 이동 진행상태를 출력
rm -f: 존재하지 않는 파일, 인수들을 무시 및 삭제 여부를 묻지 않고 강제로 삭제
rm -i: 삭제 전에 미리 물어봄
rm -r, rm -R: 하위 디렉터리 및 해당 내용을 모두 재귀적으로 제거
rm -I: 3개 이상의 파일을 제거하기 전에
또는 재귀적으로 제거할 때 한 번 확인 메시지를 표시
-i보다 덜 침입적이지만 대부분의 실수에 대한 보호 기능을 제공
rm -d: 비어있는 디렉터리를 삭제
디렉터리 안에 파일이나 서브 디렉터리가 있을 경우 삭제되지 않음
rm -v: 무슨 일이 일어나고 있는지 삭제 과정을 출력
mkdir -m: 디렉토리를 만들면서 chmod 명령어와 동일하게 권한을 함께 설정
해당 옵션 없이 디렉토리를 만들 시 권한은 소유자만 755로 설정됨
mkdir -p: 디렉토리를 만들 때 존재하지 않는 상위 디렉토리도 함께 만듦
mkdir -v: 디렉토리를 만들고, 실행 결과 메시지를 출력
rmdir -p: 경로로 상위 디렉토리를 지정했다면 상위 디렉토리도 삭제
rmdir -v: 지워지는 디렉토리의 정보를 메시지로 출력
echo -n: 마지막 개행을 하지 않는 옵션
echo -e: 백슬래시 제어문자 사용옵션
echo -E: 백슬래시 제어문자 미사용 옵션
echo -a: 명령어가 실행될 때 경고음 "삑!!" 소리 냄
cat -A: 탭, 줄바꿈을 포함한 문자를 표시
cat -b: 비어있지 않은 라인에만 첫번째 열에 번호를 표시
cat -e: 줄바꿈을 포함한 문자를 표시
cat -E: 라인의 마지막과 비어있는 라인에도 '$' 기호를 표시
cat -n: 모든 라인에 앞 번호를 출력
cat -s: 두 번 이상 연속된 빈 라인을
cat -t: 탭을 포함한 문자를 표시
cat -T: 탭 문자를 ^I로 바꿔서 출력
cat -u: (ignored)
# alias: 지정된 명령어 확인
# alias shut='shutdown -h now': 명령어와 옵션 지정하여 사용하기
# alias 1='clear': 새로운 문자열에 기존 명령어 지정하기
# ls -l /etc/ | more: ls 명령어와 조합해서 사용하기
shutdown -k: 모든 사용자에게 종료 경고 메시지 만을 전송
shutdown -h: 시스템 shutdown후 시스템 종료
shutdown -r: 시스템 shutdown후 시스템 재시작
shutdown -f: 빠른 재부팅시 사용(fsck 수행을 하지 않음)
shutdown -c: 종료예약작업시 종료작업 취소 (Ctrl + c)
shutdown +m: 현재 시간으로부터 종료시점 시간지정(분)
shutdown hh:mm: 절대시간으로 종료시점 시간지정(시간:분)
shutdown now: 명령어를 수행하는 순간 종료
etc...
