Create TOC

2019년 12월 26일

Raspbian/docker + mariadb

Raspbian에서 mariadb를 docker로 올리는 방법을 기술한다.

docker-compose.yml

/docker/mariadb/config에 설정을 저장하는 것으로 설정 파일을 구성한다. 이 경로는 원하는 곳으로 바꾸면 된다.

root의 초기 비밀 번호는 ROOT_ACCESS_PASSWORD 로 설정했다.

db 관리를 위해 adminer도 같이 설치한다. mariadb가 구동되는 ip를 x.x.x.x 라고 가정했다.

version: "3"

services:
    mariadb:
        container_name: mariadb
        image: linuxserver/mariadb
        ports:
            - '3306:3306/tcp'
        environment:
            - TZ=Asia/Seoul
            - PUID=1001
            - PGID=1001
            - MYSQL_ROOT_PASSWORD=ROOT_ACCESS_PASSWORD
        volumes:
            - '//docker/mariadb/config/:/config/'
        restart: unless-stopped

    adminer:
        container_name: adminer
        image: adminer
        ports:
            - '8080:8080/tcp'
        environment:
            - TZ=Asia/Seoul
            - ADMINER_DEFAULT_SERVER=x.x.x.x
            - ADMINER_PLUGINS=tables-filter tinymce
        restart: unless-stopped

실행

docker-compose 명령으로 실행한다.

$ sudo docker-compose up -d

실행이 잘 되면 바로 root의 비밀번호를 변경한다.

$ sudo docker exec -it mariadb mysqladmin -u root -p password '새비밀번호'
Enter password:

이제 http://x.x.x.x:8080 으로 접속하면 웹으로 db를 관리할 수 있다.

2019년 12월 16일

Raspbian/사용하던 서비스를 docker로 이전

기존에 사용하던 서비스를 docker로 옮기는 과정을 기술한다.

docker로 옮길 서비스는 아래와 같다.

  • certbot
  • pihole + dnscrypt
  • tvheadend
  • nginx
  • homebridge

docker 환경 구성

docker 설치

get-docker.sh 를 이용해 설치한다.

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

docker 그룹에 계정을 추가하면 sudo 없이 docker를 실행할 수 있다.

$ usermod -aG docker pi
$ sudo mkdir /docker
$ chown pi /docker

docker-compose 설치

$ sudo apt-get install docker-compose

certbot

설정 옮김

$ mkdir /docker/certbot
$ sudo cp -R /etc/letsencrypt /docker/certbot/config

docker-compose.yml

아래와 같은 /docker/certbot/docker-compose.yml 파일을 만든다.

version: "3"

services:
    certbot:
        container_name: certbot
        image: tobi312/rpi-certbot
        ports:
            - "80:80/tcp"
            - "443:443/tcp"
        entrypoint: certbot renew
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'

테스트

$ cd /docker/certbot
$ docker-compose up

문제 없다면 /docker/certbot/docker-compose.yml 파일에서 entrypoint 를 아래와 같이 변경한다.

entrypoint: certbot -q renew

cron

2일 간격으로 인증서 갱신을 위해 certbot을 실행하도록 /etc/cron.d/certbot 파일을 만든다.

0 0 */2 * * root test -x /usr/bin/docker-compose && perl -e 'sleep int(rand(43200))' && docker-compose -f /docker/certbot/docker-compose.yml up

pihole

dnscrypt-proxy-2 대신 cloudflared 를 사용하게 변경했다.

설정 옮김

$ mkdir -p /docker/pihole/
$ sudo cp -R /etc/dnsmasq.d /docker/pihole/config
$ sudo cp -R /etc/pihole /docker/pihole/config

설정 수정

/docker/pihole/config/dnsmasq.d/01-pihole.conf 파일에서 server 를 아래와 같이 수정한다.

server=10.0.0.2#54

/docker/pihole/config/pihole/setupVars.conf 파일에서 PIHOLE_DNS 를 아래와 같이 수정한다.

PIHOLE_DNS_1='10.0.0.2#54'PIHOLE_DNS_2=''

docker-compose.yml

아래와 같이 /docker/pihole/docker-compose.yml 파일을 만든다.

version: "3"

services:
    cloudflared:
        image: visibilityspots/cloudflared
        environment:
            - TZ=Asia/Seoul
        networks:
            pihole_net:
                ipv4_address: 10.0.0.2
        restart: unless-stopped

    app:
        image: pihole/pihole:latest
        ports:
            - '53:53/tcp'
            - '53:53/udp'
            - '8888:80/udp'
        environment:
            - TZ=Asia/Seoul
            - DNS1=10.0.0.2#54
            - DNS2=
            - DNSSEC=true
            - IPv6=false
            - PUID=1000
            - PGID=1000

        volumes:
            - '/docker/pihole/config/pihole/:/etc/pihole/'
            - '/docker/pihole/config/dnsmasq.d/:/etc/dnsmasq.d/'
        networks:
            pihole_net:
                ipv4_address: 10.0.0.3
        dns:
            - 127.0.0.1
            - 1.1.1.1
        restart: unless-stopped

networks:
    pihole_net:
        driver: bridge
        ipam:
            config:
                - subnet: 10.0.0.0/29

테스트

아래와 같이 기존 서비스를 중지하고 docker로 pihole 을 실행한다.

$ sudo systemctl stop dnscrypt-proxy.service
$ sudo pihole disable
$ cd /docker/pihole
$ docker-compose up -d

nslookup 으로 dns query가 잘 되는지 확인한다. 문제가 있다면 docker-compose -f /docker/pihole/docker-compose.yml logs app 명령으로 로그를 확인해 본다.

문제가 없는 것이 확인되면 설치되어 있던 dnscrypt-proxy-2와 pihole는 삭제한다.

기타

pihole-FTL 사용법

pihole-FTL은 아래와 같이 container에서 명령을 실행해서 사용할 수 있다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app bash -c 'echo ">stats" | nc -w 1 127.0.0.1 4711'

lighttpd 중지

안쓰는 웹서버는 아래 명령으로 중지해놓는다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app service lighttpd stop

tvheadend

설정 옮김

$ mkdir /docker/tvheadend
$ mkdir /docker/tvheadend/rec
$ sudo -s
# cd /home/hts/.hts
# tar cvfj /docker/tvheadend/tvh.tar.bz2 tvheadend
# exit
$ cd /docker/tvheadend
$ sudo tar xvfj tvh.tar.bz2
$ sudo mv tvheadend config
$ sudo rm tvh.tar.bz2

docker-compose.yml

아래와 같이 /docker/tvheaded/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/tvheadend
        ports:
            - "9981:9981/tcp"
            - "9982:9982/tcp"
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        devices:
            - "/dev/dvb:/dev/dvb"
        volumes:
            - '/docker/tvheadend/config:/config'
            - '/docker/tvheadend/rec:/recordings'
        restart: unless-stopped

테스트

$ cd /docker/tvheadend
$ docker-compose up -d

문제

encoding 이슈

nginx

설정 옮김

기존 설치된 nginx 설정 구조와 docker image의 구조가 달라서 우선 docker image를 설치하고 설정을 수정한다.

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/nginx
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'
            - '/docker/nginx/config:/config'
            - '/media/www:/mediw/www'
        restart: unless-stopped

설정 수정

우선 container를 실행한다.

$ cd /docker/nginx
$ docker-compose up -d

ssl

/etc/nginx/ssl 폴더가 있다면 /docker/nginx/config/nginx/ssl 로 복사

nginx

linuxserver/nginx 이미지를 그대로 사용하면 nginx에 많은 모듈이 동작하게 된다.

원하는 모듈만 동작하게 하기 위해 /docker/nginx/config/nginx/nginx.conf 파일에서 기존 /etc/nginx/modules/*.conf 대신 /config/nginx/modules/*.conf 를 사용하도록 수정한다.

# include /etc/nginx/modules/*.conf;
include /config/nginx/modules/*.conf;

/docker/nginx/config/nginx/modules 폴더를 만들고 원하는 모듈의 *.conf만 복사한다.

사용가능한 모듈의 conf는 아래 명령으로 확인할 수 있다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app ls /etc/nginx/modules

복사는 아래와 같이 한다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app cp /etc/nginx/modules/http_echo.conf /config/nginx/modules

site-confs

/docker/nginx/config/nginx/site-confs/default 파일 내용을 비우고 /etc/nginx/site-enabled 파일을 가져온다.

가져온 site 설정에서 아래 내용을 수정한다.

  1. /etc/nginx/ssl 부분을 /config/nginx/ssl 로 변경
  2. log 경로를 /config/nginx/log 로 변경
  3. auth_basic_user_file 을 사용하고 있었다면 파일 경로를 /config/nginx 아래로 변경하고 기존에 사용하던 auth_basic_user_file/docker/nginx/config/nginx 의 정해둔 경로로 복사.

homebridge

설정 옮김

$ mkdir /docker/homebridge
$ cp -R ~/.homebridge /docker/homebridge/config

/docker/homebridge/config/startup.sh 파일을 만들고 설치할 package를 등록한다.

#!/bin/sh

if [ ! -f /homebridge/.install_done ]; then
    npm i miio
    npm i homebridge-websocket
    npm i homebridge-mi-fan
    npm i homebridge-mi-pm2_5
    npm i homebridge-http-temperature-humidity
    touch /homebridge/.install_done
fi;

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: oznu/homebridge:raspberry-pi
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
            - HOMEBRIDGE_INSECURE=1
            - HOMEBRIDGE_CONFig_UI=1
            - HOMEBRIDGE_CONFig_UI_PORT=18080
        volumes:
            - '/docker/homebridge/config:/homebridge'
        restart: unless-stopped

테스트

기존에 실행하던 homebridge를 중지하고 homebridge container를 실행한다.

$ cd /docker/homebridge
$ docker-compose up -d

로그를 확인해보고 web ui 접속도 해본다.

$ docker-compose -f /docker/homebridge/docker-compose.yml logs app

2019년 10월 11일

Windows 10/PowerShell로 Windows Update 실행

관리자 권한으로 실행된 PowerShell 에서 WindowsUpdate를 실행하는 방법을 기술한다.

설치

nuget을 이용해 PSWindowsUpdate 모듈을 설치한다.

PS C:\WINDOWS\system32> Get-PackageProvider -Name nuget -Force
PS C:\WINDOWS\system32> Install-Module PSWindowsUpdate -Confirm:$false -Force

실행

PS C:\WINDOWS\system32> Get-WindowsUpdate -Install -AcceptAll -IgnoreReboot

2019년 9월 3일

Windows 10/명령창에서 UWP 앱 실행하기

명령창에서 UWP 앱을 실행하려면 UWP앱의 PackageFamilyNameApplication ID를 알아내어 아래와 같이 실행하면 된다.

explorer.exe shell:appsFolder\PackageFamilyName!Application ID

PackageFamilyName

Win+R 로 shell:AppsFolder 폴더를 표시한다.

원하는 UWP 앱의 바로 가기를 만든다.

바로 가기의 등록정보에서 대상값을 확인한다. 대상 값이 PackageFamilyName!Application ID 형식이지만 잘려서 다 볼수도 없고 해당 문자열을 선택해서 복사할 수도 없다.

PowerShell에서 아래 명령으로 UWP 목록을 저장한다.

get-appxpackage > uwp_list.txt

uwp_list.txt 파일에서 대상에서 표시된 값으로 검색한다. 조금 아래를 보면 PackageFamillyName을 얻을 수 있다.

Application ID

InstallLocation에 적혀있는 경로로 이동해서 AppxManifest.xml파일을 열고 Application Id를 찾으면 Application Id를 얻을 수 있다.

실행

얻은 값을 조합해서 실행해본다.

explorer.exe shell:appsFolder\Microsoft.WindowsTerminal_8wekyb3d8bbwe!App

2019년 7월 17일

ipTime + Pi hole 환경에서 DDNS 접속 문제

ipTime 공유기와 Pi hole을 사용하는 환경에서 DDNS를 사용할 경우 외부에서는 DDNS로 접속이 잘 되지만 내부에서는 안되는 경우가 있다.

이 경우 PiHole을 구동하는 장비의 /etc/hosts 파일을 수정한다. DDNS는 a.b.com이고 DDNS로 연결할 내부 장비의 IP가 192.168.1.10 인 경우라면 아래와 같은 내용을 추가한다.

192.168.1.10  a.b.com

설정이 끝나면 dns을 다시 시작한다.

$ sudo pihole restartdns

2019년 6월 30일

mosh 설정

mosh는 ssh 를 개선한 원격 터미널이다. UDP 프로토콜 (60000 ~ 61000) 을 사용하며 입/출력 연결을 따로 하기 때문에 ctrl-c 같은 키에 대한 반응성이 좋다.

최초 연결은 ssh 를 사용하며 연결 후 mosh-server 를 실행시키는 구조이다(따라서 접속했을 때만 해당 계정 권한으로 mosh-server 가 실행된다).

설치

Debian Linux

$ sudo apt install mosh

ufw

ufw를 사용하면 방하벽 규칙에 mosh가 사용하는 포트를 추가해줘야 한다.
$ sudo ufw allow mosh

포트를 전부 열기 부담되면 아래와 같이 적당히 열여주면 된다.

$ sudo ufw allow 60000:60010/udp

OS/X

$ brew install mosh

사용 방법

foo 계정으로 bar.com 에 접속하는 방법은 아래와 같다.

$ mosh foo@bar.com

ssh 설정을 변경하는 경우 아래와 같이 옵션을 주거나 미리 ~/.ssh/config 설정을 하면 된다.

$ mosh --ssh="ssh -p xxxx" foo@bar.com

호환성을 위한 추가 설정

vim 설정

mosh로 접속시 vim화면이 깨져보일 수 있다. 이때 vimrc 에 아래 설정을 추가한다.

set notermguicolors

2019년 6월 27일

Rasbian/Stretch에서 Buster로 판올림하기

Raspbian을 Stretch에서 Buster로 판올림한다.

source list 수정

/etc/apt/sourcelist.list 파일과 /etc/apt/sourcelist.d/ 디렉토리의 모든 파일에서 stretchbuster 로 변경한다.

패키지 목록 갱신

아래 명령으로 패키지 목록을 갱신 한다.

$ sudo apt update

이때 GPG 오류가 발생할 수 있다.

W: GPG Error http://deb.debian.org/debian buster-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7638D0442B90D010 NO_PUBKEY 04EE7237B7D453EC
E: The repository 'http://deb.debian.org/debian buster-backports InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

우선 keyring package를 설치하고 다시 시도 해본다

$ sudo apt install debian-keyring raspbian-archive-keyring
$ sudo apt update

여전히 오류가 발생한다면 오류 메시지 중 NO_PUBKEY 뒤 문자열을 가지고 key를 찾아 등록한다.

$ gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
$ gpg -a --export 7638D0442B90D010 | sudo apt-key add -
$ gpg --keyserver pgpkeys.mit.edu --recv-key 04EE7237B7D453EC
$ gpg -a --export 04EE7237B7D453EC | sudo apt-key add -

업그레이드

$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo apt autoremove

버전 확인은 /etc/debianversion_ 파일 내용을 확인하면 된다.

$ cat /etc/debian_version
10.0

2019년 6월 26일

web proxy server를 경유해서 ssh 접속하기

아래와 같이 web proxy server를 경유해서 ssh server에 접속하는 방법을 적는다.

PC -> Web Proxy Server ----------> nginx(testserver:8888) -> ssh server(testserver:22)

서버 설정

패키지 설치

$ sudo apt install nginx-light libnginx-mod-stream
$ sudo mkdir /etc/nginx/stream-enabled

nginx 설정

/etc/nginx/nginx.conf에 아래와 같은 내용을 추가한다.

stream {
        include /etc/nginx/stream-enabled/*;
}

/etc/nginx/stream-enabled/test.conf 파일을 만든다.

upstream ssh {
        server 127.0.0.1:22;
}

server {
        listen 8888;
        proxy_pass ssh;
}

설정이 바르게 되었는지 확인한다.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx를 다시 시작한다.

$ sudo systemctl restart nginx.service

접속 방법

linux

$ ssh -p 8888 foo@testserver -o "ProxyCommand=nc -X connect -x proxyserver:proxyport %h %p"

~/.ssh/config을 만들어 두는 것이 더 편하다.

Host myfoo
        Hostname testserver
        User foo
        Port 8888
        ProxyCommand    nc -X connect -x proxyserver:proxyport %h %p
$ ssh myfoo

Windows

PuTTY 의 proxy 설정을 이용한다.

2019년 6월 18일

Debian/IpTime NAS 2와 autofs

IpTime NAS2의 smb 공유를 autofs 를 이용해 자동으로 mount/unmount 한다.

패키지 설치

$ apt install autofs cifs-utils smbclient

autofs 설정

mount 경로 생성

$ sudo mkdir -p /mnt/cifs

cifs.autofs

아래와 같은 내용으로 /etc/auto.master.d/cifs.autofs파일을 생성한다.

/mnt/cifs /etc/auto.smb --timeout=300

auto.smb 수정

/etc/auto.smb파일을 수정해서 optsvers=2.0을 추가한다.

opts="-fstype=cifs,vers=2.0"

인증 파일 생성

접속할 서버 이름으로 인증 파일을 생성한다.

$ sudo mkdir -p /etc/creds
$ sudo touch /etc/creds/192.168.0.100
$ sudo chmod 600 /etc/creds/192.168.0.100

인증 파일의 내용은 아래와 같다.

username=사용자이름
password=비밀번호

autofs 재시작

설정 적용을 하기 위해 autofs.service를 다시 시작한다.

$ sudo systemctl restart autofs.service

테스트

설정이 완료되면 /mnt/cifs/192.168.0.100에 접근하면 공유 목록이 디렉토리로 표시되고, cd 명령으로 해당 공유에 접근할 수 있다. --timeout 설정에 의해 300초가 지나도록 /mnt/cifs를 사용하지 않으면 자동으로 unmount 한다.

마운트가 잘 되지 않는 경우 아래와 같이 디버그 모드로 테스트 해볼 수 있다.

$ sudo systemctl stop autofs.service
$ sudo automount -d -v -f

Debian/사용 중인 linux를 VirtualBox로 옮기기

사용 중인 Debian linux를 VirtualBox로 옮기는 방법을 기록한다.

VirtualBox로 옮길 Debian linux의 mount 구조는 아래와 같다.

mount point device
/ /dev/sda1
/home /dev/sdb1
swap /dev/sdb2

디스크를 VDI로 복사

sda

드라이브 통채로 복사하기 위해서, 용량을 확인하고 그 크기만큼 VDI로 만든다.

$ sudo -s
# fdisk -l /dev/sda | grep bytes | head -1
Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
# dd if=/dev/sda | VBoxManage convertdd stdin debian.vdi 128035676160 --format=VDI

sdb

rsync를 이용해서 백업한다. 우선 적당한 크기로(100GB) 이미지를 만들고 ext4로 포맷한 후 rsync로 데이터를 복사한다.

$ dd if=/dev/zero of=home.img bs=1M count=102400
$ sudo -s
# /sbin/mkfs.ext4 home.img
# mkdir /mnt/tmp
# mount -o loop home.img /mnt/tmp/
# rsync -av /home/* /mnt/tmp
# umount /mnt/tmp/

이미지를 VDI로 변환한다.

$ VBoxManage convertdd home.img home.vdi --format=VDI

VirtualBox 설정

가상머신 생성

원하는 사양으로 가상머신을 만든다.

속성
Name Debian
cpu 2 core
ram 4GB
SATA0 debian.vdi
SATA1 home.vdi

공유 폴더 설정

공유 폴더를 설정해두면 host <-> 가상 머신 사이에 파일 교환이 쉬워진다.

host share name option
/Users/foo/Downloads Downloads 자동 마운트 off, 항상 사용 on

headless 설정

headless로 가상머신을 사용할 경우 RDP나 ssh 연결 설정을 해야 한다.

RDP

VirtualBox 자체 RDP 기능을 사용할 수 있다.

$ VBoxManage modifyvm Debian --vrde on --vrdeport 13389

설정이 제대로 되었는지 확인한다.

$ VBoxManage showvminfo Debian | grep VRDE
VRDE:            enabled (Address 0.0.0.0, Ports 13389, MultiConn: off, ReuseSingleConn: off, Authentication type: null)
VRDE property: TCP/Ports  = "13389"

RDP로 접속할 때는 127.0.0.1의 13389 포트에 접속하면 된다.

ssh

localhost(127.0.0.1)의 4022 포트를 Debian VM의 22에 port forwarding 설정을 한다.

$ VBoxManage modifyvm Debian --natpf1 "ssh,tcp,,4022,,22"

설정이 제대로 되었는지 확인한다.

$ VBoxManage showvminfo Debian | grep Rule
NIC 1 Rule(0):   name = ssh, protocol = tcp, host ip = , host port = 4022, guest ip = , guest port = 22

접속 방법은 아래와 같다(id는 foo라고 가정한다).

$ ssh -p 4022 foo@127.0.0.1

headless 부팅

$ VBoxHeadless --startvm Debian
Oracle VM VirtualBox Headless Interface 5.2.30
(C) 2008-2019 Oracle Corporation
All rights reserved.

VRDE server is listening on port 13389

fzf를 사용한다면 아래와 같이 fvbox 함수를 정의해 사용할 수도 있다.

fvbox()
{
 local vm
 read -r vm <<< $(VBoxManage list vms | awk -F \" '{print $2}' | sort | fzf --layout=reverse-list --preview="VBoxManage showvminfo {} --machinereadable | grep \"^name=\\|^UUID=\\|^VMState=\\|^vrde=\\\|^vrdeports=\\|^Forwarding(\\|^SharedFolder\\|^description=\\|^ostype=\"" --preview-window=right:70%:wrap)

 if [ "$vm" = "" ]; then
  return;
 fi
 local running
 read -r running <<< $(VBoxManage showvminfo "$vm" --machinereadable | grep '^VMState='| awk -F = '{print $2}')
 if [ "$running" = "\"running\"" ]; then
  VBoxManage controlvm "$vm" savestate
 else
  nohup VBoxHeadless --startvm "$vm" > /dev/null 2>&1 &
 fi
}

가상머신 부팅 후 Linux 환경 수정

부팅시 "gave up looking for suspend/resume device" 오류

/etc/initramfs-tools/conf.d/resume 파일에서 RESUME 값이 잘못된 경우 발생한다. 아래와 같이 수정한다.

RESUME=/dev/sda1

수정이 끝나면 ramdisk 다시 만든다.

$ sudo update-initramfs -u

fstab 수정

/etc/fstab 에서 /homeswap 내용을 삭제하고, 아래와 갈이 /home 에 대한 내용을 추가한다.

/dev/sdb    /home   ext4    defaults    0   1

swap

적당한 크기의 swapfile을 만든다. 여기서는 메모리 크기와 동일하게 4GB로 만든다.

$ sudo -s
# dd if=/dev/zero of=/swapfile bs=1024 count=4194304
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

/etc/fstab 에 아래 내용을 추가한다.

/swapfile   swap    swap    defaults    0   0

hibernation

swap 정책을 변경한다.

sysctl -w vm.swappiness=1 

부팅 때 적용되도록 /etc/sysctl.d/swap.conf 파일을 수정한다.

vm.swappiness=1

uswsusp 를 설치한다.

$ sudo apt install uswsusp
$ sudo dpkg-reconfigure -pmedium uswsusp

"Continue without a valid swap space?" 질문에는 를, "Swap space to resume from:" 질문에는 swapfile을 선택한다.

hibernation 서비스 수정 하기 위해 복사한다.

$ sudo cp /lib/systemd/system/systemd-hibernate.service /etc/systemd/system/

/etc/systemd/system/systemd-hibernate.service 맨 마지막 줄을 아래와 같이 수정한다.

ExecStart=/bin/sh -c 's2disk && run-parts --regex .\* -a post /lib/systemd/system-sleep'

수정 사항을 적용한다.

$ sudo systemctl daemon-reload

ramdisk 다시 만든다.

$ sudo update-initramfs -u

아래와 같이 잘 동작하는지 확인한다.

$ sudo systemctl start systemd-hibernate.service

VirtualBox package 설치

VirtualBox guest 패키지를 설치한다.

$ sudo apt install virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11

x11 설정

/etc/X11/xorg.conf 에서 기존에 사용하던 Monitor, Device 그리고 Screen Section은 다 삭제한다.

Section "ServerFlags"
    # Ctrl + Alt + Backspace
    Option  "DontZap"   "true"
EndSection

공유폴더

아래와 같은 명령으로 mount 되는지 확인한다.

$ sudo mount -t vboxsf -o uid=$UID,gid=$(id -g) Downloads /mnt/Downloads

uid, gid를 확인한다.

$ echo $UID $GID
1000 1000

/etc/fstab에 아래 내용을 추가한다.

# vbox
Downloads       /mnt/Downloads        vboxsf  defaults,uid=1000,gid=1000      0       0

재부팅

모든 설정이 끝나면 재부팅 후 모든 기능이 잘 동작하는지 확인해본다.

2019년 3월 13일

Raspbian/certbot 업그레이드

How to stop using TLS-SNI–01 with Certbot을 적용하려면 certbot 버전이 0.28 이상이어야 한다. 그러나 raspbian에 포함된 버전은 0.10 이다. 아래와 같은 방법으로 certbot을 업그레이드 한다.

우선 /etc/apt/sources.list.d/debian-stretch-backports.liststretch-backports 를 추가한다.

deb http://deb.debian.org/debian stretch-backports main

업데이트 할 때 key 오류가 난다.

$ sudo apt-get update

...
W: GPG error: http://ftp.debian.org jessie-backports InRelease:
   The following signatures couldn't be verified because the public
   key is not available: NO_PUBKEY 8B48AD6246925553 NO_PUBKEY
   7638D0442B90D010

아래 명령으로 key를 가져온다.

$ sudo gpg --keyserver pgp.mit.edu --recv-keys 8B48AD6246925553 7638D0442B90D010

결과 메시지에서 가져온 key 정보를 확인한다.

gpg: key 8B48AD6246925553: 28 signatures not checked due to missing keys
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 8B48AD6246925553: public key "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1

가져온 키를 추가한다. 이때는 sudo 대신 root shell 에서 작업한다.

$ sudo -s
# gpg --armor --export 8B48AD6246925553 | apt-key add -

패키지 목록을 갱신하고 certbot을 업그레이드 한다.

$ sudo apt-get update
$ apt-get install certbot -t stretch-backports

2019년 1월 21일

Powershell로 드라이브 추출하기

E:를 추출하고 싶으면 아래와 같이 실행하면 된다.

(New-Object -COM Shell.Application).NameSpace(17).ParseName('E:').InvokeVerb('Eject')