Create TOC

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

재부팅

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