설치 환경

  • Intel i7-7700K, DDR4 32G, ASUS Prime Z270-A, Nvidia GTX1080Ti, 960Evo, 4TB HDD

배포판, 데스크톱 환경, 에디션 결정

Arch / Manjaro -- 자유도 극강, 무조건 최신 버전! / 꼬이면 답 없음
Ubuntu / Debian -- 편리, 문제해결도 편리 / 공식 저장소 패키지는 좀 된 버전

GNOME2 MATE -- 가볍다 / 옛날 거다
LXDE, XFCE -- 가볍다 / 기본 상태는 안 예쁘다
Ubuntu Unity -- 버려졌다

Server edition -- 가볍다 / X11, DE 직접 설치해야 한다 -- 망하기 딱 좋다
Desktop edition -- 뭐가 이것저것 많다, Ubuntu는 쓸데없는 Avahi 네트워크 공유 도구가 기본 활성화인 등

이 중, Ubuntu MATE 16.04.3 64-bit Desktop edition을 골랐다. 이유는 데스크탑 환경이 가벼워서.

OS 설치

Debian / Ubuntu, 심지어 Manjaro도 설치는 어렵지 않다. 설치 이미지를 Rufus 같은 툴로 USB에 굽고 (멀티부팅하려면 YUMI가 좋았었다)
UEFI 설정 잡은 후 부팅해서 하라는 대로 마우스 클릭하면 끝.

파티션 결정하기

  • UEFI 기준으로 EFI (FAT32), boot (EXT4), root(/) (EXT4, btrfs), swap 파티션이 필요하다.
  • 홈은 (/home) 따로 떼어내면 좋고

근본 없는 적정 크기

  • EFI <256M; grub 또는 Windows 부트로더 정도, 사실 Clover 같은 것 깔지 않으면 100M도 사치이다
  • boot >512M; 재시작, 청소 없이 커널 업데이트가 여러 번 이어지면 부트 파티션이 가득찬다...
  • swap (마음대로) 요새는 없어도 된다 하지만, SSD 낭비이지만 물리 RAM과 같은 크기로 잡아줬다. RAM 용량이 그리 많지는 않아서...

btrfs vs. EXT4

  • HDD에서 btrfs는 재앙인 것 같다. 특히 스냅샷을 적극 활용한다면.
  • 그렇지만 SSD에서는 이제는 안정된 최신 파일 시스템인 btrfs를 써야 하지 않나.
  • 하지만 나만 쓰는 환경이 아니니 EXT4로...

백업 문제

  • btrfs + snapper를 통한 스냅샷 이용 백업본 관리는 저번에 HDD에 했을 때 끔찍하게 실패했었다. 뭘 잘못했을까?

TODO Ubuntu 16.04.3 LTS Skylake / Kabylake 호환성 문제 회피

  • Ubuntu Live USB조차 부팅이 안 되는 상황
  • grub에서 부팅 명령 편집 화면으로 들어가서 ''nomodeset pci=nomsi pcie_aspm=off'' 옵션을 주어서 부팅시켰다
  • 추후 ''/etc/default/grub'' 옵션 설정하여 플래그 고정해 둠. 혹시 커널 업데이트하면 옵션 없어도 괜찮은 것 아닐까

첫 부팅

  • 우선 ''sudo apt update; sudo apt upgrade'' 한 번 더.

드라이버 설치

Nvidia 공식 드라이버 설치를 위해 저장소를 추가해서 nvidia-387 (설치 당시 최신) 패키지를 설치했다. ''intel-microcode''도 설치했다.

GRUB 설정

''/etc/default/grub'' 파일을 열어서 ''OPTION''에다 ''nomodeset pci=nomsi pcie_aspm=off acpi_enforce_resources=lax panic=60'' 문구를 추가했다.

  • ''nomodeset'': 부팅 시 메시지 보기 위해 quiet splash 대체
  • ''pci=nomsi pcie_aspm=off acpi_enforce_resources=lax'': 카비레이크 호환성 문제 회피, 마지막 항목은 온도 센서 인식 위해
  • ''panic=60'': 프로그램의 리소스 과다 소모, CPU 과열 등으로 인해 커널 패닉 발생 시, 60초 후 재시작 이후 ''sudo update-grub'' 해서 새로운 설정 적용.

swappiness 설정 조정

여유 메모리 용량 비율이 어느 값 이하일 때 스왑 메모리 공간을 사용할 지 지정하는 값이다. 기본 swappiness가 10이면 좋겠지만, 가끔 또는 예전 OS에서는 60으로 잡혀있다. 이 대신 10, 아니 1로 잡아본다.

  • ''/etc/sysctl.conf'' 파일을 열고, 마지막 줄에 ''vm.swappiness = 1''이라고 적어 준다.

SSH 접속 포트 추가하기

원래는 iptables 통해 해야 하지만, 정 귀찮으면 보안을 포기하고 ''/etc/ssh/sshd_config''에 추가 포트를 지정해줄 수 있다.
이후 ''sudo systemctl reload sshd'' 해 준다.

고정 IP 설정

데스크탑 환경을 설치했으니 GUI 상에서 설정해도 되지만, ''/etc/network/interfaces'' 파일에 직접 설정해 본다. 예전엔 이더넷 장치 이름이 항상 eth0이었는데, 요새는 ''enp3s0''이니 무슨 이상한 이름으로 잡힌다. 유의할 것.

보안 업데이트 자동화

모든 업데이트를 자동화하면 툴끼리 버전이 안 맞아서 손이 많이 갈 수 있다. 보안 업데이트 정도만 자동화하는 걸로.

  • ''sudo update-alternatives --config unattended-upgrade''한 뒤 ''/etc/apt/apt.conf.d/'' 경로의 파일을 입맛에 맞게 조정해 줄 수 있다.

계정 기본 환경 파일

  • ''/etc/profile.d/'' ''profile'' 이름이 익숙한데, 로그인 시 전역 레벨에서 호출되는 스크립트 모음이다.
  • ''/etc/skel/'' ''adduser'' 명령으로 계정을 만들면서 홈 디렉토리도 만들게 하면, 이 경로의 파일로 내용을 채워준다.

로그인 메시지 변경

''/etc/update-motd.d/'' 디렉토리에 가면, 로그인 시 보이는 메시지를 만들어주는 스크립트가 있다. 지겨운 우분투 홈페이지 URL 주소나 새 소식 홍보를 여기서 삭제할 수 있다.

Postfix ''Satellite'' 모드로 설정하기

같은 서브넷 상에 메일 서버가 있는 경우, 해당 메일로 관리 메시지를 전송하려면 복잡한 메일 서버 설정 없이 ''satellite'' 모드로 설정해 주면 보내려는 메일을 곧장 릴레이해 준다. 스팸 메일 차단을 위해 릴레이는 외부 전송이 안 되니 유의.

Avahi 데몬 죽이기

괜히 데스크톱 버전으로 설치해서 로컬 네트워크 주위의 컴퓨터의 공유 자원을 검색하는 Avahi 서비스가 작동한다.

sudo service avahi stop
sudo systemctl disable avahi-daemon.service
sudo systemctl disable avahi-daemon.socket
꺼지는 것 맞겠지?

툴 설치

EDA 툴

Synopsys 툴

  • 함께 제공되는 설치 프로그램을 어디다가 잘 풀어둔 다음에
  • 설치하려는 툴의 패키지가 들어있는 경로를 ''installer'' 실행 후 입력, 또는 ''batch_installer''에 매개 변수로 주어 실행
  • 레드햇 리눅스 환경에 맞춰져 있어서, 그냥 실행하면 오류가 발생한다.

    • ''libxss1 libsm6 libice6 libxft2 libjpeg62 libtiff5 libmng2 libpng12-0 csh'' 패키지를 설치한 후 아래 명령을 수행해준다.

      sudo ln -s /usr/lib/x86_64-linux-gnu/libtiff.so.5 /usr/lib/x86_64-linux-gnu/libtiff.so.3
      sudo ln -s /usr/lib/x86_64-linux-gnu/libmng.so.2 /usr/lib/x86_64-linux-gnu/libmng.so.1
      sudo update-alternatives –install /bin/sh sh /bin/bash 20

    • 세 번째 줄을 실행해 주면 실행 스크립트 돌릴 때 셸 문법 호환성 오류가 발생하지 않는다

Cadence 툴

  • 설치를 수행하기 위해, ''libxtst6:i386 libxext6:i386 libxi6:i386 ksh'' 패키지가 필요하다.
  • 또한, 루트 계정으로 실행하는 경우 루트 계정에 ''export XAUTHRITY=~/.Xauthority'' 명령을 주어서 설치 프로그램 GUI가 잘 뜨게 한다.

개발 도구: Bazel

  • Google TensorFlow를 사용중인 CPU에 맞게 빌드하려고..
  • Java JDK 설치 후 (''openjdk-9-jdk''), Bazel 저장소 추가하고 설치해 준다.

Nvidia CUDA: 각종 딥러닝 패키지에서 이용

  • Nvidia 주가 상승의 일등공신이라 할 수 있다.
  • cuDNN은 Nvidia 계정을 파서 직접 다운받아야 한다.
    • cuDNN 버전, CUDA 버전, 운영체제 버전, 설치 방식(데비안 패키지, 직접 설치)에 따라 구별되어 있다.
  • 전체 다운로드 대신 저장소 추가를 단행한 뒤, 다음이 중요하다.
  • 그냥 ''cuda''를 설치하면, 의존 패키지에 GPU 드라이버가 있어서 설치한 드라이버는 삭제되고 이전 버전이 설치되는 경우가 있다.
    • 대신 ''cuda-toolkit-8''과 같이 버전 지정해서 설치해 주면 OK.

Intel MKL

인텔 CPU도 있고 하니 빠른 수학 연산을 위해 설치해 본다. 나중에 TensorFlow 빌드할 때 쓴다

  • 데비안 저장소가 있는지는 모르겠고, 인텔 홈페이지에서 계정 만든 후 다운로드 가능하다.

Anaconda3

Ubuntu에 준비되는 기본 환경 대신 사용하려는 툴에 따른 (TensorFlow, PyCaffe, PyTorch 등등) 환경을 만들기 위해 ''virtualenv''를 쓸 수도 있지만, 보다 편리한 Anaconda를 사용해 본다. 이 동네 사람들은 뱀을 참 좋아한다.

  • Anaconda 홈페이지에서 다운로드하여 설치해 준다.
    • 공용 경로에 설치했기 때문에, source해야 할 경로를 ''/etc/profile.d/''에 설정해 주어 모든 사용자에게 적용되도록 한다.

Jupyter + JupyterHub

요새 인터넷에 보면 통계, 빅데이터, 그리고 머신러닝 코드를 보여주는데 Jupyter (또는 IPython, ...) 노트북을 사용하는 것을 자주 볼 수 있다.

  • Anaconda root 환경을 활성화한 후 ''conda install jupyter'' 해 주면 Jupyter Notebook은 잘 설치된다.

Jupyter만 설치하면 각 사용자가 직접 Jupyter Notebook 서버를 띄우고, 포트를 안 겹치게 잡아주고, HTTPS 연결을 이용하려면 또 이것저것 해 주고 해야 하는 문제가 있다. JupyterHub(+SudoSpawner)는 사용자별로 Jupyter Notebook 서버를 띄워주고 관리해 주는 역할을 한다.

  • 설치 자체는 역시나 Anaconda root 환경에서 ''conda install jupyterhub'' 하면 된다.
  • 문제는 기본 설정, 사용자 환경을 만들어주는 방법 결정 (SudoSpawner로 시스템 계정을 그대로 이용, ...), 웹 서버와 연동, HTTPS 설정이다. 요건 생략.

X2Go

Nvidia 드라이버와의 문제로 GPU 가속이 안 되는 점, X11을 대신할 Wayland(가 뭐지?)를 지원하지 않는 점 등등 아쉬운 점이 많으나, VNC, RDP 아니면 제일 나은 가상 데스크탑 접속 환경인 것 같다.

  • 공식 저장소를 추가한 뒤, ''x2goserver'', ''x2goserver-xsession'' 패키지를 설치해 준다.
  • 내 PC에서 클라이언트 프로그램을 설치해 접속하면 된다.
    • 소리 기능은 끄는 게 반응 속도 면에서 좋은 것 같다. 내가 설정을 잘못했던가.

TensorFlow (소스 빌드)

의미는 크게 없지만 더 빠른 성능을 위해 직접 빌드해 본다.

  • 공식 Git 저장소에서 ''clone'', ''checkout v1.3.1'' (당시 최신) 하고나서
  • Anaconda 환경을 하나 파 준다.
    • 파이썬 패키지 ''numpy scipy matplotlib pandas pillow wheel six protobuf markdown html5lib bleach werkzeug'' 중 취향에 따라 뺄 건 빼고 설치해 준다.
  • v1.3.1과 Bazel>=0.6.0은 호환되지 않는다. Bazel 0.5.4를 받아와서 컴파일할 계정에만 설치해 둔다. PATH 설정이 필요하니 유의.
  • ''./configure'' 해서 아까 설치한 Intel MKL 사용하고, CUDA 사용하고.
    • cuDNN을 여러 버전 설치한 경우, ''sudo update-alternatives --config libcudnn'' 명령으로 현재 TF 버전에 맞는 cuDNN을 선택한다.
    • CUDA 설정 끝에 CUDA compute 버전을 물어보는데, 내가 사용하는 GPU에 맞는 것으로 고르면 컴파일 시간이 줄고 연산 성능도 좋다.
  • ''bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package''하면 한 30분 간 열심히 빌드해 준다.
  • ''bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg'' -> ''pip install /tmp/tensorflow_pkg/<패키지 파일 이름>''
  • ''tensorflow'' 디렉토리에서 나가서, 한 번 잘 되나 테스트해 보라.

커널 패닉 기록, 반응성 향상을 위해

  • ''memlockd'' 패키지는 SSH 동작에 필요한 중요 파일을 메모리에 상주시켜준다고 한다. CPU 또는 디스크에 높은 부하를 주어 시스템이 크게 느려졌을 때 SSH 로그인 성공 가능성을 높여준다.
  • ''linux-crashdump'' 커널 패닉 또는 프로그램 크래시 발생 시, 로그를 ''/var/crash''에 남겨 준다. 디스크에 못 쓰고 죽는 극한 상황에서는 무용지물. Debian에서는 이름이 다른 것 같다.

Let's Encrypt SSL 인증서 & Certbot

비록 3개월마다 (자동) 갱신해야 하지만, 사고 시 보상금 하나 없지만, 믿-음직한 무료 SSL 인증서이다. Certbot 도구를 통해 발급·갱신이 가능하다.

  • 웹서버 무관 공용 Webroot 방식 또는 웹서버별 플러그인 방식 (Apache, Nginx 등 지원) 선택이 가능하다.
  • Nginx 플러그인은 현재 사이트 설정 파일이 한 개인 경우에만 올바로 동작하는 것 같다. 언제 개선될런지.

설치했지만 언급 않은 패키지

  • 기본 유틸리티
    intel-microcode ssh byobu csh ksh zsh fish curl vim-nox emacs unar rdiff-backup python-software-properties postfix figlet lftp chromium-browser jekyll doxygen evince zathura feh markdown fonts-nanum x2goserver x2goserver-xsession
  • 시스템 상태 감시
    iotop htop iftop dstat smartmontools lm-sensors linux-crashdump munin munin-node stress memlockd
  • 개발 도구
    build-essential git subversion bazel cmake gdb cscope ccache colorgcc colormake colordiff
  • 컴파일러
    libgfortran-4.9-dev openjdk-8-jdk
  • 라이브러리
    libboost-all-dev libatlas-dev libatlas-base-dev libopenblas-dev liblapack-dev protobuf-compiler libprotobuf-dev
  • 딥러닝 툴 드라이버/라이브러리
    nvidia-387 cuda-toolkit-8 cuda-toolkit-9 libcupti-dev libgflags-dev libgoogle-glog-dev libleveldb-dev liblmdb-dev libsnappy-dev
  • 웹 서버/메일 릴레이
    postfix nginx-full nodejs-dev npm w3m-el python-certbot-nginx
  • LaTeX 패키지 + 그래프/차트
    texlive-xetex texlive-lang-cjk ko.tex-base ko.tex-extra texlive-publishers texlive-fonts-extra libcgraph6 graphviz graphviz-dev
  • 그리고, 한글 폰트

+ Recent posts