하나의 디스크에 여러가지 버전의 Ubuntu 설치하기

ROS를 사용하여 개발을 하다보니, ROS의 버전에 따라 Ubuntu의 배포판이 달라져야 하는 경우가 생긴다. 예를 들자면, ROS2의 현재 최신 LTS버전은 Humble로 Ubuntu 22.04에서 설치가 되어야 하고, ROS1의 최종 LTS버전은 Noetic으로 Ubuntu 20.04에서 지원이 멈춰있다 (이제 더이상 배포판 업데이트 지원 불가).

따라서 이 두가지 경우를 모두 사용하기 위해선, 각각 따로 개발용 PC를 구비하던가 아니면 외장 SSD를 이용하는 방법이 있긴 하지만, 번거로운건 어쩔수 없다.

하나의 SSD에 GRUB 부트로더를 하나만 사용하고, 스왑 파티션도 공용으로 사용하고, 루트 파티션만 분리하여 설치하면 위와 같은 문제가 깔끔이 해결된다. 여전히 재부팅이 필요한 건 어쩔수 없지만..^^

기록 차원에서 설치 순서를 간단히 정리해본다. 윈도우와 듀얼부팅으로 사용할 때도 적용 가능. 물론 배포판의 버전이 달라도 상관없음.

먼저, 가장 최신 버전의 배포판을 설치한다. 이건 여느때와 마찬가지로 그냥 설치하면 됨.

설치할 때, 디스크의 파티션을 설정하는 부분이 있는데, 이때 다음과 같은 구조로 만들어준다.

/dev/sda1    /boot    EFI     2000MB
/dev/sda2    /        ext4    200000MB
/dev/sda3    None     ext4    200000MB
/dev/sda4    swap     swap    32768MB

앞쪽 디스크 이름은 각자의 개발 환경에 따라 다를테니, 유념하시면 되고, 기존과 다른 점은 /boot 파티션을 따로 분리한 것과 루트 (/) 파티션을 만들고 또 동일한 크기 혹은 원하는 크기로 또 하나의 파티션을 만들어 놓은 것이다.

이제 설치를 완료 (루트 파티션을 /dev/sda2로 선택)하고.. 부팅이 제대로 되는 것을 확인한 다음…

다음으로 추가로 설치할 배포판 설치를 진행한다. 이때는 바로 설치를 진행하지 말고, Try Ubuntu 등 일단 임시로 사용할 수 있는 모드로 진입.

여기에선 부트로더 설치를 하지 않고, 배포판 설치를 진행하야 하므로, 터미널을 열고

$ ubiquity -b

와 같이 실행하여 설치를 진행한다. 디스크 설정 시, 설치할 파티션을 위에서 만든 /dev/sda3로 선택한다. 설치가 완료되면, 그냥 재부팅.

재부팅하면, 기존에 설치한 최신 배포판으로 부팅이 될텐데, 완료되면 터미널을 열고,

$ sudo update-grub2

를 하면, 자동으로 방금 전에 설치한 추가 배포판의 커널을 인식하여 GRUB의 부트 엔트리에 등록해준다. 또 기본값으로는 GRUB가 후다닥 지나가버리게 설정되어 있으므로, /etc/default/grub 파일을 열어서 다음과 같이 수정해준다.

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

이제 끝!

Ubuntu에서 DDM 기능 대체하기

Dell 모니터 중 KVM 기능을 지원하는 제품의 경우, Windows나 macOS에서는 DDM (Dell Display Manager)라는 프로그램을 통해서 모니터를 키보드를 통해 제어할 수 있다.

이를 이용하면 유용한 점이, 모니터를 직접 조작하지 않고도, 입력 소스를 선택할 수 있어 두 대의 PC를 오가며 쉽게 작업할 수 있다는 점이다.

다만 아쉽게도 아직까지 Ubuntu에서 동작하는 DDM은 없는 상황이다. 하지만 구글링을 해보면 쉽게 이를 대체할 수 있는 방법이 나온다.

기본적으로 DDM의 역할은 모니터에 연결된 특정칩에 명령을 전달하는 것인데, 이 명령이 DDC/CI 기능을 이용한다. 아마 게임기나 셋탑박스를 연결할 때, 케이블을 꼽기만 해도 해당 입력소스로 자동으로 전환되는 것을 경험해보셨다면, 그 모니터가 DDC/CI 기능을 지원한다는 의미이다.

Ubuntu에도 이러한 기능을 수행하는 커맨드가 존재하는데, ddccontrol 이 그것이다.

설치는 다음과 같이

$ sudo apt install ddccontrol

설치하면 되고..

이제 실행을 해보면, 먼저 모니터를 인식하는지를 확인해보면…

$ ddccontrol -p
ddccontrol version 0.6.0
Copyright 2004-2005 Oleg I. Vdovikin (oleg@cs.msu.su)
Copyright 2004-2006 Nicolas Boichat (nicolas@boichat.ch)
This program comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of this program under the terms of the GNU General Public License.

Detected monitors :
 - Device: dev:/dev/i2c-6
   DDC/CI supported: Yes
   Monitor Name: VESA standard monitor
   Input type: Digital
  (Automatically selected)
Reading EDID and initializing DDC/CI at bus dev:/dev/i2c-6...
I/O warning : failed to load external entity "/usr/share/ddccontrol-db/monitor/DEL426A.xml"
Document not parsed successfully.
I/O warning : failed to load external entity "/usr/share/ddccontrol-db/monitor/DELlcd.xml"
Document not parsed successfully.

EDID readings:
	Plug and Play ID: DEL426A [VESA standard monitor]
	Input type: Analog

...
= VESA standard monitor
...
> Input settings
	> Input sources
		> id=inputsource, name=Input Source Select (Main), address=0x60, delay=-1ms, type=2
		  Possible values:
			> id=analog - name=Analog, value=1
			> id=digital - name=Digital, value=3
		  supported, value=3855, maximum=14
...

와 같이 연결된 모니터 정보가 인식된다.

이중, 중요한 것이, 연결되어 있는 디바이스 정보인데, 여기에선 /dev/i2c-6으로 되어 있다. 또, Input sources를 설정하는 레지스터 주소가 0x60으로 되어 있는 것을 알 수 있다.

이제 0x60에 특정한 값을 넣으면, 해당되는 입력 소스로 전환할 수 있다는 것인데… 이 특정한 값이 무엇인지를 파악해야 하는데, 역시 검색해보면 답이 바로 나온다.

  • Display Port : 0x0f (15)
  • USB-C : 0x1B (27)
  • HDMI : 0x11 (17)

이다.

즉 터미널에서 다음과 같이 입력하면, USB-C 입력소스로 즉시 전환된다.

$ ddccontrol -r 0x60 -w 27 dev:/dev/i2c-6

이제, 이 명령을 키보드 단축키로 지정하면 쉽게 사용 가능.

설정에서 키보드 > 키보드 단축키 설정 > 사용자 단축키 설정

이제, 위 단축키를 이용하면, 모니터의 입력소스를 조정하여 쉽게 전환이 가능하다.

Ubuntu를 Console/Text 모드로 부팅하기

로봇에 설치된 Ubuntu의 경우, 기존과 같이 Gnome으로 부팅하면 부팅시간도 오래 걸릴뿐 아니라, 기본 상태에서의 램 소모량도 크기 때문에 Console/Text 모드로 부팅하는 것이 유리하다.

이를 변경하기 위해선, 간단히 Terminal을 열고 다음과 같이 입력하고 재부팅한다.

$ sudo systemctl set-default multi-user.target

다시 Graphical Mode로 원상복구 하려면, Terminal에서 다음과 같이 입력하고 재부팅한다.

$ sudo systemctl set-default graphical.target

끝.

Set CPU governor policy always “Performance” on Ubuntu

$ sudo apt-get install cpufrequtils

/etc/default/cpufrequtils 파일 생성. 있으면 수정.

$ sudo nano /etc/default/cpufrequtils

GOVERNOR="performance"
MIN_SPEED="2000MHz"

MIN_SPEED는 각자의 CPU 성능에 따라 설정함.

ondemand 서비스를 비활성화

$ sudo systemctl disable ondemand

파일이 생성되면, cpufrequtils 서비스를 재실행

$ sudo systemctl restart cpufrequtils

이제 cpufreq-info를 통해 확인해보면…

$ cpufreq-info                                                                                                                                                         
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009                                                                                                                                          
Report errors and bugs to cpufreq@vger.kernel.org, please.                                                                                                                                              
analyzing CPU 0:                                                                                                                                                                                        
  driver: intel_pstate                                                                                                                                                                                  
  CPUs which run at the same hardware frequency: 0                                                                                                                                                      
  CPUs which need to have their frequency coordinated by software: 0                                                                                                                                    
  maximum transition latency: 4294.55 ms.                                                                                                                                                               
  hardware limits: 800 MHz - 5.10 GHz                                                                                                                                                                   
  available cpufreq governors: performance, powersave                                                                                                                                                   
  current policy: frequency should be within 3.00 GHz and 5.10 GHz.                                                                                                                                     
                  The governor "performance" may decide which speed to use                                                                                                                              
                  within this range.                                                                                                                                                                    
  current CPU frequency is 4.91 GHz.                                                                                                                                                                    
analyzing CPU 1:                                                                                                                                                                                        
  driver: intel_pstate                                                                                                                                                                                  
  CPUs which run at the same hardware frequency: 1                                                                                                                                                      
  CPUs which need to have their frequency coordinated by software: 1                                                                                                                                    
  maximum transition latency: 4294.55 ms.                                                                                                                                                               
  hardware limits: 800 MHz - 5.10 GHz                                                                                                                                                                   
  available cpufreq governors: performance, powersave                                                                                                                                                   
  current policy: frequency should be within 3.00 GHz and 5.10 GHz.                                                                                                                                     
                  The governor "performance" may decide which speed to use                                                                                                                              
                  within this range.                                                                                                                                                                    
  current CPU frequency is 4.73 GHz.           

위와 같이 performance 모드로 셋팅되어 있고, CPU frequency가 올라가 있음을 확인할 수 있음.

Set static IP on Jetson Nano/Jetpack

Install netplan

$ sudo apt install netplan.io

Add yaml to /etc/netplan/config.yaml

network:
   version: 2
   renderer: networkd
   ethernets:
     eth0:
       addresses:
         - 192.168.10.99/24
       gateway4: 192.168.10.1
       nameservers:
           addresses: [8.8.8.8, 8.8.4.4]

Save, and apply.

$ sudo netplan apply

That’s it.

ROS1에서 launch 파일을 부팅시에 자동으로 실행하기

개발을 완료하고, launch 파일을 부팅시에 자동으로 실행하도록 하려면 systemd 서비스를 사용해야 한다.

먼저 실행 스크립트를 작성한다(스크립트의 위치는 임의의 위치여도 상관없음)

~/test.sh

#!/bin/bash
source /home/byeongkyu/.bashrc
source /opt/ros/noetic/setup.bash
roslaunch roscpp_tutorials talker_listener.launch

다음으로 systemd 서비스 파일을 생성한다. 서비스 파일의 위치는 /etc/systemd/system 내에 위치한다.

/etc/systemd/system/bringup_ros.service

[Unit]
Description=Bringup ROS launch Test

[Service]
ExecStart=/home/byeongkyu/test.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

이제 systemd의 데몬을 재시작해주고,

$ sudo systemctl daemon-reload

생성한 서비스를 시작한다.

$ sudo systemctl start bringup_ros.service

서비스의 상태를 확인하면,

$ sudo systemctl status bringup_ros.service
● bringup_ros.service - Bringup ROS launch Test
Loaded: loaded (/etc/systemd/system/bringup_ros.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2020-10-20 13:55:10 KST; 14s ago
Main PID: 35949 (test.sh)
Tasks: 26 (limit: 18700)
Memory: 57.9M
CGroup: /system.slice/bringup_ros.service
├─35949 /bin/bash /home/byeongkyu/test.sh
├─35982 /usr/bin/python3 /opt/ros/noetic/bin/roslaunch roscpp_tutorials talker_listener.launch
├─35990 /usr/bin/python3 /opt/ros/noetic/bin/rosmaster --core -p 11311 -w 3 __log:=/root/.ros/log/6ea0106a-1290-11eb-804a-ffcb70481544/master.log
├─36000 /opt/ros/noetic/lib/rosout/rosout __name:=rosout __log:=/root/.ros/log/6ea0106a-1290-11eb-804a-ffcb70481544/rosout-1.log
├─36003 /opt/ros/noetic/lib/roscpp_tutorials/listener __name:=listener __log:=/root/.ros/log/6ea0106a-1290-11eb-804a-ffcb70481544/listener-2.log
└─36005 /opt/ros/noetic/lib/roscpp_tutorials/talker __name:=talker __log:=/root/.ros/log/6ea0106a-1290-11eb-804a-ffcb70481544/talker-3.log
Oct 20 13:55:23 byeongkyu-XPS-15-7590 test.sh[36003]: [ INFO] [1603169722.778710976]: I heard: [hello world 116]
Oct 20 13:55:23 byeongkyu-XPS-15-7590 test.sh[36003]: [ INFO] [1603169722.878691038]: I heard: [hello world 117]
Oct 20 13:55:23 byeongkyu-XPS-15-7590 test.sh[36003]: [ INFO] [1603169722.978902069]: I heard: [hello world 118]

정상적으로 실행되고 있음을 확인할 수 있다.

이제 부팅시에 시작하도록 하려면, 서비스를 enable 해주면 끝.

$ sudo systemctl enable bringup_ros.service

이제 부팅할 때, 서비스가 자동으로 실행됨.

Windows 10에서 Raid에서 AHCI 모드로 변경하기

Intel RST 모드를 사용하게 되면, Ubuntu 20.04 설치시에 다음과 같은 창이 나타나면서 더이상 설치가 진행이 되지 않는다.

그렇다고, 막바로 바이오스 설정에서 AHCI로 변경을 하게 되면, 그 유명한 블루스크린이 발동하면서 윈도우 부팅이 진행되지 않는다. 다음과 같은 절차로 진행하면 쉽게 AHCI 모드로 변경이 가능하다.

먼저 RST (Raid) 상태에서, 윈도우10을 부팅하고, 커맨드 창을 관리자 모드로 연다 (커맨드 창 아이콘에서 오른쪽 버튼을 눌러 관리자 모드로 열면 됨).

다음과 같이 입력하고 재부팅.

bcdedit /set {current} safeboot minimal

이때 PC의 바이오스 설정으로 들어가서 (F2 or Del 등 제조사마다 다름). IDE 모드를 Raid에서 AHCI로 변경한다.

이제 다시 윈도우10으로 부팅하면, 안전모드로 부팅이 되게 되고 다시 커맨드 창을 관리자 모드로 연 다음, 다음과 같이 다시 입력

bcdedit /deletevalue {current} safeboot

그런 다음 재부팅.

이제 정상적으로 부팅이 되는 것을 확인할 수 있다.

장치관리에서 IDE 부분을 확인해보면,

정상적으로 적용이 되어 있음을 볼 수 있다.

Ubuntu에서 한글 및 한자 입력하기

Ubuntu 20.04든 그 하위 버전이든 모두 적용됨.

fcitx 한글 입력기 설치

$ sudo apt install fcitx-hangul

설정 > 지역 및 언어 (Region & Language) > Manage Installed Languages 버튼을 눌러 언어 설정으로 이동.

키보드 입력 방법 시스템 (Keyboard input method system)에서 fcitx를 선택.

혹시 한글 관련 폰트나 그런 것들이 설치되어 있지 않은 경우, Install/Remove Languages 버튼을 눌러, Korean 선택.

시스템을 재부팅하고 나면, 상단 트레이바에 fcitx가 실행되어 있음을 볼수 있음.

아이콘을 눌러, Configure Current Input Method 선택.

하단의 + 버튼을 눌러 Add input method 창을 띄운 뒤, Only Show Current Language를 체크 해제하고 Hangul을 입력해 한글 입력기 추가.

다음으로 하단 키보드 모양을 클릭하여, 기본 키보드 레이아웃을 Korean – Korean (101/104 compatible)으로 선택.

다음으로 Global Config 탭으로 이동. Trigger Input Method의 왼쪽 버튼을 클릭한 후, 한영키 입력.

다시, Input Method로 이동, Hangul을 더블클릭하면,

Word Commit 활성화, 한자모드 토글키의 왼쪽 버튼을 클릭, 한자키를 입력.

이제 한영키로 한글 입력 활성화, 한글 입력 후 한자키를 누르면 한자 입력 창 나옴.

Installation Docker on Ubuntu 18.04

Install the packages for dependencies.

$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Add Docker’s official GPG key

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

Add repository for installation

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Install

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Verify the installation

$ sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Add user to docker group for execute without sudo command

$ sudo usermod -aG docker `whoami`

Reboot!

$ groups
<user-name> adm tty dialout cdrom sudo dip plugdev lpadmin sambashare docker

Now, you can run docker without sudo command

$ docker run hello-world

Ubuntu에서 HEIC 이미지를 jpg로 변환

HEIC 이미지는 아이폰에서 고효율로 설정하여 사진을 찍게되면 생성되는 파일입니다. 내보내기를 할때 호환성 모드로 하면 자동으로 png나 jpg로 변환되긴 하는데, 파일을 직접 전송해서 사용하는 경우 HEIC 확장자의 이미지로 보내지게 됩니다.

Ubuntu에서는 아직 HEIC 이미지를 지원하지 않아서, 이를 보기 위해선 jpg로 변환해서 봐야 합니다. 변경할 수 있는 툴은 다음과 같이 설치가 가능합니다.

$ sudo apt install libheif-examples

다음으로 HEIC 이미지가 있는 디렉토리로 이용하여

$ heif-convert IMG_6326.HEIC IMG_6326.HEIC.jpg

와 같이 변경할 수 있습니다.

변경해야 할 이미지가 여러장이라면, 간단한 쉘 스크립트를 사용하면 됩니다.

$ find *.HEIC | xargs -n1 -I {} /bin/bash -c 'heif-convert {} {}.jpg'

이렇게 하면 현재 디렉토리 내에 있는 HEIC 파일을 전부 읽어들여, jpg 이미지로 변경할 수 있습니다.

끝!.

Dell XPS 15 7590 (2020) Ubuntu 설치 관련

최근 Dell XPS 15 7590을 업무용으로 사용하게 되었는데, 기존 외장 USB 드라이브에 Ubuntu를 설치하고 사용하는데 약간의 차이가 생겨, 이에 대한 기록 차원에서 정리.

가장 큰 차이는 더이상 델의 최신 버전 노트북에선 Legacy External Boot가 지원되지 않는다고 합니다. 대략 찾아보니 보안 관련, 32bit에 대한 지원 종료 (64bit만 사용) 등의 이유로 그렇게 된 듯 합니다. 따라서 BIOS 화면에서도 이에 관한 옵션이 사라져 있습니다. 델 상담원이랑 채팅을 통해 상담했는데 그렇다고 하네요.

이에 따라 Grub를 이용해서 부팅하던 USB 설치 스틱도 써먹을 수가 없었는데, 이는 Ubuntu에 내장된 Startup Disk Creator 어플리케이션을 사용하여 쉽게 새로운 설치 스틱을 만들수 있습니다.

이와 같은 상황으로 기존 BIOS에서 Secure Boot 옵션을 껐던 적이 있었는데, 이젠 그것은 그냥 켜두시면 됩니다. (보안에 좋답니다. ㅎㅎㅎ)

NVIDIA 드라이버를 정상적으로 사용하시려면 여전히 Secure Boot 옵션은 꺼둬야 합니다. 살짝 해맸네요..

Ubuntu 설치디스크로 부팅하시고 설치는 그냥 진행 하시되, 파티션 설정 부분에서 기존 /boot로 설정했던 파티션을 EFI 파티션으로 변경해야 합니다. 부트로더 설치할 디스크는 여전히 사용할 외장 USB 드라이브를 선택하시면 되고요. 그렇게 되면 파티션 설정은

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *        65535   3932099   3866565   1.9G ef EFI (FAT-12/16/32)
/dev/sda2         3932100 456385739 452453640 215.8G 83 Linux
/dev/sda3       456385740 488366819  31981080  15.3G 82 Linux swap / Solaris

와 같이 될겁니다.

이후 설치가 완료되고, 재부팅을 한 다음 로고가 나올때 F12키를 연타해보면, UEFI 리스트에 외장 USB 드라이브의 이름이 나오고, 이를 선택하면 잠시 검은색 화면이 나오고 재부팅되는데….

다시 F12키로 부팅리스트를 보면 ubuntu라는 UEFI가 추가로 생성됨을 볼수 있습니다. 이제 이것을 선택하면 정상적으로 부팅됩니다.

이제 사용하면 끝.!

덧:

  • 화면 밝기가 조정이 안됩니다. 하지만 이는 버그인듯하여 쉽게 수정이 될듯 합니다.
  • 기존 말썽을 부리던 Killer WiFi 카드의 드라이버가 그냥 잡힙니다. 하지만 성능은 여전히 구립니다.
  • 이전에 사용하던 Dell XPS 15 9570에서 고질적으로 발생하던 스크린 Flickering 현상은 새로운 모델에선 나타나지 않습니다.

Ubuntu 커스텀 설치 이미지 만들기 (Make the custom ISO image of Ubuntu)

설명

cubic 설치

$ sudo add-apt-repository ppa:cubic-wizard/release
$ sudo apt install cubic

설치 이미지 다운로드 (주의! Live 이미지는 자동설치 지원 안됨.)

$ wget http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.4-server-arm64.iso

cubic 실행 (실행시 root 권한이 필요하므로 계정 암호 입력하여 진행)

작업에 사용할 디렉토리 생성하고 선택, 다음으로 진행

다운로드한 설치 이미지를 선택, 그러면, 다음과 같이 정보들이 자동으로 입력됨. Original ISO… 부분은 절대 수정하면 안되고, Custom ISO… 부분은 작업 디렉토리를 제외한 나머지 부분은 수정 가능.

다음으로 진행.

자동으로 파일 및 디렉토리를 복사한 후, 작업을 위한 chroot 환경의 터미널이 뜸.

이제 이 터미널 내에서 원하는 작업을 해주면 됨. 프로그램 설치는 apt를 이용해서 설치. 스크립트나 기타 등등의 작업도 가능.

작업이 완료되었으면, Next를 눌러 다음으로 진행

여기에선 설치하고 싶지 않은 패키지들을 선택 가능. 필요없다고 생각하는 것들을 선택하면 됨.


3번째 탭으로 이동. 설치 자동화 스크립트 파일을 하나 추가한다. seed 파일의 문법은 https://help.ubuntu.com/lts/installation-guide/amd64/apbs04.html을 참고한다. 파일을 추가하기 위해서 하단의 + 버튼을 누르고 오른쪽 편집창에 스크립트를 입력한다. 이번 과정에서 사용한 seed 파일은 다음과 같다.

### Automatic Installation
d-i auto-install/enable boolean true
d-i debconf/priority select critical


### Localization
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales multiselect en_US.UTF-8
# Keyboard
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select us


### Network
d-i netcfg/choose_interface select auto
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/use_autoconfig boolean false
d-i netcfg/disable_dhcp boolean true
#d-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Configure network manually

# Static network configuration.
d-i netcfg/get_ipaddress string 192.168.1.11
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 192.168.1.1
d-i netcfg/confirm_static boolean true

d-i netcfg/get_hostname string ubuntu
d-i netcfg/get_domain string


### Mirror settings
d-i mirror/country string manual
d-i mirror/http/hostname string archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string


### Account setup
d-i passwd/root-login boolean false
d-i passwd/make-user boolean true

d-i passwd/user-fullname string ubuntu
d-i passwd/username string ubuntu
d-i passwd/user-password password ubuntu
d-i passwd/user-password-again password ubuntu
d-i user-setup/allow-password-weak boolean true


### Clock and time zone setup
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Seoul
d-i clock-setup/ntp boolean true


### Partitioning
d-i partman-auto/init_automatically_partition select biggest_free
d-i partman-auto/method string regular
d-i partman-swapfile/size string 4096

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Update
d-i pkgsel/update-policy select none

### Bootloader
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev  string default


# Verbose output and no boot splash screen.
d-i debian-installer/quiet	boolean false
d-i debian-installer/splash	boolean false
d-i finish-install/reboot_in_progress note

이상하게, 몇개의 특정 스크립트 이외에 다른 스크립트들은 거의 반영이 안된다. 완전 자동화 설치는 아니고, 부분부분은 사용자가 개입을 해줘야한다. 버그인듯한데… 좀더 살펴봐야 할듯.

다음으로 이 seed 파일을 사용하기 위해, 부트 메뉴 등을 설정해야 한다. 네번째 탭인 ISO Boot Configuration으로 이동, grub.cfg 파일에 다음과 같은 엔트리 하나 추가.

menuentry "Automatic Install Ubuntu Server" {
	set gfxpayload=keep
	linux	/install/vmlinuz  boot=casper file=/cdrom/preseed/auto-cli.seed auto=true priority=critical locale=en_US netcfg/disable_autoconfig=true automatic-ubiquity noprompt noshell quiet ---
	initrd	/install/initrd.gz
}

다음으로 isolinux 설정. 역시 엔트리를 하나 추가하고, 기본 선택을 자동설치로 변경. (isolinux/txt.cfg 파일 수정)

default auto-install
label auto-install
  menu label ^Automatic Install Ubuntu Server
  kernel /install/vmlinuz
  append  boot=casper file=/cdrom/preseed/ubuntu-server.seed vga=788 initrd=/install/initrd.gz auto=true locale=en_US priority=critical netcfg/disable_autoconfig=true automatic-ubiquity noprompt noshell quiet ---

수정이 완료 되어 있으면, Generate 버튼을 눌러 다음으로 진행.


이제 사용자의 ISO 파일을 생성함. 종료하고 작업 디렉토리로 가보면, 사용자 설치 이미지가 생성되어 있는 것을 볼수 있음.

이걸 가지고 USB등 설치 이미지를 만들어 설치하면 끝!.

참고링크

Ubuntu와 Windows 멀티부팅 시 시스템 시간 변경 문제 해결

Ubuntu와 Windows를 듀얼부팅으로 사용하는 경우, Ubuntu를 사용한 다음 윈도우로 부팅하면 현재 시각이 다른 값으로 설정되어 있다. 자동으로 조정 기능을 껐다가 키면 다시 정상 시각으로 설정되지만 매번 그러기엔 아주 귀찮다.

Ubuntu에서 시각을 UTC를 기준으로 삼아 사용해서 생기는 문제인데, 이를 사용하지 않고 로컬타임으로 사용하게끔 하면 문제는 해결된다.

16.04 이후 버전부터는 터미널에서 다음과 같이 입력한다.

$ sudo timedatectl set-local-rtc 1

이렇게 되면, 이제 서로 다른 운영체제로 부팅하더라도 시스템의 시간은 변경되지 않는다.

Fix the freezing when lid close for XPS9570 on Ubuntu 18.04

해결 방법을 찾아보면 9570 뿐만이 아니라, 외장 GPU를 사용하는 대부분의 델 랩탑에 해당되는 내용인듯. Ubuntu를 사용하다가 노트북을 닫거나, Sleep 모드로 전환 후 다시 노트북을 깨우려고 하면 멈춰버리는 현상이 발생함. 어쩔수 없이 강제 재부팅을 해야 되서 엄청 불편한데, 구글링 후 해결 방법을 찾아봄.

$ sudo vi /etc/default/grub

다음과 같이 수정함.

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="mem_sleep_default=deep"

저장하고, 다음의 명령어로 업데이트 완료 후 재부팅.

$ sudo update-grub

잠재우기 모드를 아예 강제로 deep 모드로 해버리는 것 같은데, 이렇게 되면 suspend 모드로 전환하거나 다시 복귀할때 시간이 좀 걸림. 아주 완전한 해결책은 아니지만, 그래도 멈추진 않으니 이대로 사용하는 수 밖에. .^^

Disable TouchPad while Typing on Ubuntu 16.04

Ubuntu 18.04에선 기본으로 제공하는 기능인데, 16.04에선 해당 옵션 선택 기능이 없음. 터미널 사용 중이거나 프로그래밍 중 터치패드가 작동되서 여기저기 튀는 현상때문에 골치가 아픈데… 다음과 같이 설정하면 기능 적용됨.

$ sudo vi /usr/share/X11/xorg.conf.d/51-synaptics-quirks.conf

파일 내에 다음과 같은 내용을 추가.

Section "InputClass"
Identifier "SynPS/2 Synaptics TouchPad"
      MatchProduct "SynPS/2 Synaptics TouchPad"
      MatchIsTouchpad "on"
      MatchOS "Linux"
      MatchDevicePath "/dev/input/event*"
      Option "Ignore" "on"
EndSection

재부팅하면 해결.

Solve “permission denied” when using libusb on Ubuntu

libusb를 이용한 디바이스를 Ubuntu에 연결하고, 관련 프로그램을 실행시 “Permission denied” 혹은 알수없는 오류를 발생하는 경우가 있다. 보통 sudo 명령을 이용하여 실행하면 잘 해결되는 경우인데, 매번 sudo를 붙여서 실행하는 것이 번거롭다. 이때는 udev 룰을 추가하면 해결된다. (제조사에서 제공하는 경우도 있다.)

사용자가 udev 룰을 추가하려면 해당 디바이스의 Vender ID, Product ID를 알아내야 한다. 이는 디바이스를 연결하고, 터미널에서 다음과 같이 입력한 다음 확인이 가능하다.

$ dmesg

이때 나오는 메시지 중 idVendor, idProduct에 나오는 값을 기억한다.

/etc/udev/rules.d 에 다음과 같이 파일을 작성한다.

$ cd /etc/udev/rules.d
$ vi 99-<user_device>.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="<Vendor ID>", ATTRS{idProduct}=="<Product ID>", MODE="0666"

저장한 다음, 디바이스를 뽑았다가 다시 꼽으면 해결된다.

Install specific version when using apt

When you need specific version of package, you can install the version you want using apt.

To show the list versions of package,

 $ sudo apt-cache policy <package-name>

To install specific version,

$ sudo apt install <package-name>=<version-you-want>;

Example:

$ sudo apt-cache policy librealsense2
librealsense2:
  Installed: (none)
  Candidate: 2.16.4-0~realsense0.127
  Version table:
     2.16.4-0~realsense0.127 500
        500 http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial/main amd64 Packages
     2.16.3-0~realsense0.115 500
        500 http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial/main amd64 Packages
     2.16.3-0~realsense0.103 500
        500 http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial/main amd64 Packages
     2.16.3-0~realsense0.97 500
        500 http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial/main amd64 Packages
...

$ sudo apt install librealsense2=2.11.1-0~realsense0.70

To prevent upgrade,

$ sudo apt-mark hold <package-name>

Ignore installed package when using pip

If you have an error when you install python package using pip like this,

Cannot uninstall '~~~'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

You can solve this problem by adding this option:

--ignore-installed

For example,

$ sudo pip install <package-name-to-install> --ignore-installed <package-name-get-error>