Create TOC

레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시

2022년 4월 18일

Debian/HDMI 로 TV 연결했지만 화면이 나오지 않을 때

HDMI 로 TV를 연결했는데 TV가 연결되지 않고 /var/log/kern.log에서 아래와 같은 오류로그가 보인다.

[drm:dc_link_detect_helper [amdgpu]] *ERROR* No EDID read.

TV 제조사에 따라 다르지만 EDID를 제대로 알려주지 않은 경우 문제가 발생한다. 아래와 같은 순서로 문제를 해결할 수 있다.

  1. https://github.com/akatrevorjay/edid-generator/를 이용해서 EDID binary를 만든다(TV 해상도에 맞는 bin 파일이 있으면 파일을 받는다(이후 1920x1080.bin).
  2. bin 파일을 /usr/lib/firmware/edid/에 복사해 넣는다.
  3. initramfs를 다시 만든다.
    $ sudo update-initramfs -k all -c
  4. xrandr명령으로 포트 이름을 확인한다.
    $ xrandr
    Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
    eDP connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
       1920x1080     60.04*+
       1680x1050     60.04  
       1280x1024     60.04  
       1440x900      60.04  
       1280x800      60.04  
       1280x720      60.04  
       1024x768      60.04  
       800x600       60.04  
       640x480       60.04  
    HDMI-A-0 disconnected (normal left inverted right x axis y axis)
  5. /etc/grub/default 파일에서 GRUB_CMDLINE_LINUX_DEFAULT에 아래 값을 추가한다.
    drm.edid_firmware=HDMI-A-1:edid/1920x1080.bin
    만일 부팅할때 부터 HDMI에 출력하고 싶다면 아래 값을 추가한다.
    video=HDMI-A-1:e
  6. update-grub를 실행한다.
    $ sudo update-grub
  7. 재부팅한다.
부팅 후 HDMI로 TV와 연결하면 화면이 나오는 것을 확인할 수 있다.

2021년 3월 9일

KDE/qdbus로 단축키에 해당하는 기능 실행하기

KDE에서 fusuma를 이용해 trackpad 제스쳐를 설정할때 xdotool을 사용해 KDE 단축키를 누른 것과 같은 효과를 낼 수 있다. 다만 이때 가상머신등을 사용하는 경우 단축키를 가상머신에서 받아들이기 때문에 원하는 단축키 실행이 되지 않을 수 있다. 이때는 xdotool 대신 qdbus을 이용해 KDE 단축키에 해당하는 기능을 바로 실행하면 문제가 해결된다.

단축키를 가지는 component 목록 얻기

$ qdbus org.kde.kglobalaccel

모든 단축기 정보 얻기

$ qdbus --literal org.kde.kglobalaccel /component/plasmashell allShortcutInfos | bat -l json 

실행

$ qdbus org.kde.kglobalaccel /component/plasmashell invokeShortcut activate\ widget\ 200

자주 쓰는 단축키

시작 메뉴

$ qdbus org.kde.kglobalaccel /component/plasmashell invokeShortcut activate\ widget\ 200

Expose All

$ qdbus org.kde.kglobalaccel /component/kwin invokeShortcut ExposeAll

Expose

$ qdbus org.kde.kglobalaccel /component/kwin invokeShortcut Expose

Latte Dock 첫번째 항목 활성

$ qdbus org.kde.kglobalaccel /component/lattedock invokeShortcut activate\ entry\ 1

2021년 2월 11일

Wine/Total Commander

Wine에 Total Commander를 설치해서 사용할 때 Linux 시스템과 연동하는 몇가지 방법을 기술한다.

설정 파일 인코딩 수정

Total commander 설치 위치의 *.bar와 *.ini파일의 인코딩을 UTF-16BE with BOM

Linux 프로그램 실행

적당한 경로에 linuxcaller.sh파일을 만든다(/home/user1/.local/bin/linuxcaller.sh로 생성했다고 가정한다).

#!/bin/sh

if [ $# -lt 2 ]; then
        exit 0
fi
cmd=$1
filename=`wine winepath -u "$2"`
shift
shift
"$cmd" "$filename" $*

아래와 같이 버튼바에 등록해서 사용한다.

확장자 기본 프로그램 연결

적당한 경로에 tc_open.sh파일을 만든다(/home/user1/.local/bin/tc_open.sh로 생성했다고 가정한다).

#!/bin/sh
if [ $# -eq 0 ]; then
        exit 0
fi

/usr/bin/xdg-open "`wine winepath -u "$1"`"

Total Commander에서 파일 - 내부 확장자 연결 메뉴를 선택하고 *.*를 추가하고 아래와 같이 등록한다.

현재 경로를 konsole에서 열기

적당한 경로에 tc_konsole.sh파일을 만든다(/home/user1/.local/bin/tc_konsole.sh로 생성했다고 가정한다).

#!/bin/sh
if [ $# -lt 1 ]; then
        exit 0
fi
workdir=`wine winepath -u "$1"`
shift
konsole --workdir "$workdir" $*

버튼바에 버튼을 추가하고 아래와 같이 설정한다.

Reference

2020년 11월 29일

KDE/일출, 일몰에 따라 자동으로 테마 변경하기

KDE에는 일출, 일몰에 따라 자동으로 테마를 변경하는 설정이 없어서 따로 스크립트를 만들어서 변경한다.

일몰, 일출 시간을 얻기 위해서 python3-astral 패키지를 설치한다.

$ sudo apt install python3-astral

아래 python 스크립트를 ~/.local/bin/lookandfeel_change.py 으로 저장한다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim:set expandtab fenc=utf-8 ff=unix:

import os
import logging
import datetime
import subprocess
import argparse
from astral import Astral  # type:ignore


logging.basicConfig(format='[%(asctime)s]{%(name)s}(%(levelname)s) %(message)s', level=logging.INFO)
logger = logging.getLogger(os.path.basename(__file__))
KST = datetime.timezone(datetime.timedelta(hours=9))

DARK_THEME = 'org.kde.breezedark.desktop'
LIGHT_THEME = 'org.kde.breeze.desktop'


def kreadconfig(group: str, key: str) -> str:
    p = subprocess.run(['/usr/bin/kreadconfig5', '--group', group, '--key', key],
                       capture_output=True)
    return p.stdout.decode('utf-8').strip()


def kwriteconfig(group: str, key: str, value: str):
    p = subprocess.run(['/usr/bin/kwriteconfig5', '--group', group, '--key', key, value],
                       capture_output=True)
    logger.debug(p.stdout.decode('utf-8').strip())
    logger.debug(p.stderr.decode('utf-8').strip())


def apply_theme(theme: str):
    p = subprocess.run(['/usr/bin/lookandfeeltool', '-a', theme], capture_output=True)
    logger.debug(p.stdout.decode('utf-8').strip())
    logger.debug(p.stderr.decode('utf-8').strip())
    kwriteconfig('KDE', 'LookAndFeelPackage', theme)


def main():
    ast = Astral()
    city = ast['Seoul']
    now = datetime.datetime.now(tz=KST)
    today = city.sun(date=now, local=True)
    logger.debug(f'{today["sunrise"]} <= {now} < {today["sunset"]}')

    new_theme = DARK_THEME
    if (today['sunrise'] <= now < today['sunset']):
        new_theme = LIGHT_THEME

    cur_theme = kreadconfig('KDE', 'LookAndFeelPackage')

    if cur_theme != new_theme:
        apply_theme(new_theme)
        logger.debug(f'apply {new_theme}')
    else:
        logger.debug(f'already applied {cur_theme}')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='일출/일몰시간을 기준으로 Plasma 테마를 변경')

    parser.add_argument('--debug', '-d', action='store_true')

    options = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)

    main()

저장 후 실행 속성을 준다.

$ chmod +x ~/.local/bin/lookandfeel_change.py

이대로 cron에 등록하면 제대로 동작하지 않는다. cron으로 실행하는 경우 login 했을 때와 환경 변수 구성이 다르기 때문이다. 아래 script를 ~/.local/bin/lookandfeel_change.sh으로 저장한다.

#!/bin/bash

export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/계정id/bus
export DESKTOP_SESSION=plasma
export DISPLAY=:0
export PATH=/home/계정명/.local/bin:/usr/local/bin/:/usr/local/bin:/usr/bin:/bin:/usr/games
export SHELL=/bin/bash
export XDG_CURRENT_DESKTOP=KDE
export XDG_RUNTIME_DIR=/run/user/계정id
export XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

/home/계정명/.local/bin/lookandfeel_change.py

계정id는 id 명령으로 확인할 수 있다. Debian 계열인 경우 첫번째로 추가한 사용자 id는 보통 1000 이다.

$ id

저장 후 실행 속성을 준다.

$ chmod +x ~/.local/bin/lookandfeel_change.sh

이제 10분마다 실행할 수 있게 crontab에 등록한다.

*/10 * * * * /home/계정명/.local/bin/lookandfeel_change.sh

2020년 11월 8일

Debian/VirtualBox의 VRDE 설정

VNC 비밀 번호 설정

Debian에서 VirtualBox 패키지만 설치한 경우 원격디스플레이를 VNC를 사용할 수 있다. 단, 이때 VNC 비밀번호를 설정해줘야 한다.

$ VBoxManage modifyvm "가상머신 이름" --vrdeproperty VNCPassword=비밀번호

가상머신 이름은 아래와 같이 찾을 수 있다.

$ VBoxManage list vms

RDP 사용

우선 virtualbox-ext-pack을 설치한다.

$ sudo apt install virtualbox-ext-pack

VNC 대신 RDP를 사용하고 싶은 가상머신에 대해서 아래와 같이 설정한다.

$ VBoxManage modifyvm "가상머신 이름" --vrdeextpack "Oracle VM VirtualBox Extension Pack"

기본값으로 되돌리고 싶으면 아래와 같이 입력한다

$ VBoxManage modifyvm "가상머신 이름" --vrdeextpack default

2020년 8월 29일

Raspberry Pi4/몇 가지 팁

wifi/bluetooth 끄기

/boot/config.txt에 dtoverlay=disable-wifi, dtoverlay=disable-bt를 추가한다.

[all]
dtoverlay=disable-wifi
dtoverlay=disable-bt

IPv6 끄기

sysctl 설정을 추가한다.

$ sudo vi /etc/sysctl.d/local.conf
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1

pigpiod 오류

IPv6를 끄면 pigpiod.service가 동작하지 않는다.V73에서는 수정되었다고 한다. /lib/systemd/system/pigpiod.service에서 pigpiod 에 -n 127.0.0.1 옵션을 추가해준다.

[Service]
ExecStart=/usr/bin/pigpiod -l -n 127.0.0.1

dhcp 서비스가 오류나면서 ip를 잃어버릴 때

docker를 사용하는 경우 아래와 같이 docker에서 사용하는 interface를 제외시킨다.

$ sudo vi /etc/dhcpcd.conf
denyinterfaces veth*

오류 발생시 고정 ip를 사용하도록 설정을 추가한다.

$ sudo vi /etc/dhcpcd.conf

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
profile static_eth0
static ip_address=192.168.0.x/24
static routers=192.168.0.100
static domain_name_servers=1.1.1.1

# fallback to static profile on eth0
interface eth0
fallback static_eth0

2020년 3월 4일

Andriod/자동 프록시 설정시 Goolge Play Store나 YouTube가 동작하지 않는 문제 수정

Andriod 기기에서 자동 프록시 (pac)를 설정하면 Google Play Store나 YouTube가 동작하지 않는다. 이때는 설정 - 앱 및 알림 - 배터리 최적화 (Optimize battery) 대상에서 ProxyHandler를 빼면 된다(최적화 하지 않음).

2019년 9월 3일

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

명령창에서 UWP 앱을 실행하려면 UWP앱의 PackageFamilyName과 Application 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월 27일

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

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

source list 수정

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

패키지 목록 갱신

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

$ 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파일을 수정해서 opts에 vers=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 에서 /home 과 swap 내용을 삭제하고, 아래와 갈이 /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 정책을 변경한다.

$ sudo 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년 1월 21일

Powershell로 드라이브 추출하기

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


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

2018년 6월 7일

Windows Update에서 특정 항목을 숨기기

Windows 10의 Windows Update에서는 특정 업데이트를 숨기는 기능을 제공하지 않는다. 이 때는 KB3073930을 사용하면 된다.
  1. 설치된 업데이트 삭제
  2. KB3073930 툴 실행
  3. Hide Updates를 선택해서 원하는 업데이트를 숨김 표시

2018년 1월 9일

Debian/bash에서 zsh로 이전하기

bash에서 zsh로 이전하면서 작업한 내용을 적는다. zsh 플러그인 관리는 antigen을 사용한다.

zsh 설치

$ sudo apt-get zsh zsh-antigen

설정 파일 작성

~/.zshrc


# path 지정
export PATH=$HOME/.local/bin:$PATH

# antigen 설정. antigen 설정은 ~/.antigenrc에 따로 적는다.
source /usr/share/zsh-antigen/antigen.zsh
antigen init $HOME/.antigenrc

# ssh 접속시에만 prompt에 hostname이 표시되도록 설정
prompt_context() {
        if [[ -n $SSH_CONNECTION ]]; then
                prompt_segment black default "%(!.%{%F{yellow}%}.)$USER@`hostname`"
        else
                prompt_segment black default "%(!.%{%F{yellow}%}.)$USER"
        fi
}

# 기존에 사용하던 ~/.bash_aliases를 그대로 사용한다.
if [ -f $HOME/.bash_aliases ]; then
    source $HOME/.bash_aliases
fi

~/.antigenrc

antigen 관련 설정은 ~/.antigenrc로 분리한다.


antigen use oh-my-zsh

antigen bundle debian
antigen bundle git
antigen bundle pip
antigen bundle python
antigen bundle sudo
antigen bundle systemd
antigen bundle tmux
antigen bundle command-not-found

antigen bundle zdharma/fast-syntax-highlighting
antigen bundle djui/alias-tips
antigen bundle chrissicool/zsh-256color
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle gko/ssh-connect

# 아래 테마는 D2Coding 같은 powerline 심볼을 지원하는 글꼴을 사용한 터미널에서 봐야 안깨진다.
antigen theme agnoster

antigen apply

기본 쉘 변경

$ chsh -s /bin/zsh

2017년 9월 21일

userChrome.css 로 탭 모양 변경하기

Firefox의 userChrome.css를 사용해서 탭 모양을 아래와 같이 변경한다.

  • 탭 최소 너비를 32px로 고정. 스크롤 없이 많은 탭을 표시할 수 있음
  • 읽지 않은 탭은 굵은 이탤릭 글자로 표시
  • unload 된 탭은 이탤릭 + 밑줄 표시. 탭 자체도 반투명하게 처리

방법은 아래와 같다.

  1. 주소 표시줄에서 about:support 입력
  2. 프로필 폴더의 폴더 열기 버튼 클릭
  3. 프로필 폴더가 열리면 chrome 폴더 생성
  4. chrome 폴더 안에 userChrome.css 파일 생성
    @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
    
    .tabbrowser-tab {
        min-width: 32px !important;
    }
    
    .tab-content {
        overflow:hidden !important;
    }
    
    .tabbrowser-tab:not([pinned]):not([fadein]) {
        visibility: collapse !important;
    }
    
    .tabbrowser-tab[unread]:not([selected="true"]) {
        font-weight: bold !important;
        font-style: italic !important;
    }
    
    .tabbrowser-tab[unread]:not([selected="true"]) .tab-text {
        opacity: 0.75 !important;
    }
    
    .tabbrowser-tab[pending] {
        opacity: 0.6 !important;
        font-style: italic !important;
    }
    
    .tabbrowser-tab[pending] .tab-text{
        text-decoration: underline dashed !important;
    }
  5. Firefox 재시작

2017년 3월 30일

OSX/Homebrew 업그레이드

Homebrew 업그레이드는 brew upgrade로 간단히 할 수 있다. 하지만 macvim이나 vim 패키지는 lua가 기본 포함되어 있지 않아서 따로 업그레이드를 해줘야 한다. 이걸 한번에 처리하게 스크립트를 작성했다.

#!/bin/sh

brew update

macvim=`brew outdated | grep macvim | wc -l`
vim=`brew outdated | grep vim | grep -v macvim | wc -l`

if [ $macvim -ne 0 ]; then
 brew upgrade macvim --with-lua
fi

if [ $vim -ne 0 ]; then
 brew upgrade vim --with-lua
fi

others=`brew outdated | wc -l`
if [ $others -ne 0 ]; then
 brew upgrade
fi

brew cleanup

2016년 12월 19일

Raspbian/L2TP 서버 설정

iOS VPN 정책이 바뀌면서 ipTime의 VPN 기능을 사용할 수 없게 되었다. iOS에서 VPN을 사용할 수 있도록 Raspberry Pi에 L2TP 서버 설정을 한다.

패키지 설치

$ sudo apt-get install openswan xl2tpd ppp lsof rng-tools

네트워크 설정

포트 포워딩

공유기에서 UDP 500, 4500 포트를 Raspberry PI로 포트포워딩 한다.

Raspbian 설정

우선 아래 명령들을 실행한다.

$ sudo -s
# iptables --table nat --append POSTROUTING --jump MASQUERADE
# echo "net.ipv4.ip_forward = 1" |  tee -a /etc/sysctl.conf
# echo "net.ipv4.conf.all.accept_redirects = 0" |  tee -a /etc/sysctl.conf
# echo "net.ipv4.conf.all.send_redirects = 0" |  tee -a /etc/sysctl.conf
# for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
# exit

설정이 잘 되어있는지 확인한다.

$ sudo sysctl -p

부팅시에도 설정이 동작하도록 /etc/rc.local 파일에 아래 내용을 추가한다.

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables --table nat --append POSTROUTING --jump MASQUERADE

L2TP 설정

openswan 설정

예제 설정을 복사한다.

$ sudo cp /etc/ipsec.d/examples/l2tp-psk.conf  /etc/ipsec.d/l2tp-psk.conf

/etc/ipsec.conf파일을 열어서 맨 마지막에 아래 줄을 추가한다.

include /etc/ipsec.d/l2tp-psk.conf

그리고 protostack 값을 찾아서 아래와 같이 바꾼다.

protostack=netkey

/etc/ipsec.d/l2tp-psk.conf 파일을 열어서 아래 값들을 바꾼다.

conn L2TP-PSK-noNAT
 dpddelay=30
 dpdtimeout=120
 left=
 leftprotoport=17/%any
 forceencaps=yes

conn passthrough-for-non-l2tp
 left=
 leftnexthop=<공유기 내부 IP 주소>

/var/lib/openswan/ipsec.secrets.inc 파일을 편집에서 서버 접속시 사용할 비밀문자열을 지정한다.

192.168.1.112  %any:   PSK "복잡한문자열"

설정에 문제가 없는지 확한다.


$ sudo ipsec verify

xl2tpd 설정

/etc/xl2tpd/xl2tpd.conf파일을 열어 아래 값들을 바꾼다.

[global]
ipsec saref = yes

[lns default]
ip range = <할당하고 싶은 ip 대역. 192.168.0.201-192.168.0.250>
length bit = yes
require chap = yes
refuse pap = yes
name = <적당한이름. MyVPN>
pppoptfile = /etc/ppp/options.l2tpd.lns

아래와 같은 내용으로 /etc/ppp/options.l2tpd.lns파일을 만든다.

ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
lock
idle 1800
mtu 1200
mru 1200
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
nodefaultroute
connect-delay 5000

/etc/ppp/chap-secrets 파일을 열어서 접속할 때 사용할 id, 비밀번호를 설정한다.

# Secrets for authentication using CHAP
# client    server  secret          IP addresses

아이디 l2tpd   비밀번호   *

서비스 설정

$ sudo update-rc.d -f ipsec remove
$ sudo update-rc.d ipsec defaults

서비스 재시작

$ sudo /etc/init.d/xl2tpd restart
$ sudo /etc/init.d/ipsec restart

2016년 11월 28일

nginx에 let's encrypt 인증서 적용

/etc/nginx/sites-available에 원하는 이름의 설정 파일을 만들고 아래와 같이 설정한다.

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 server_name 서버명;
 root /var/www/html;

 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
 add_header X-Frame-Options DENY;
 ssl on;
 ssl_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/서버명/privkey.pem;

 #OCSP Stapling
 ssl_dhparam /etc/nginx/ssl/서버명.dhparam;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_trusted_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 resolver 8.8.8.8 8.8.4.4;

 ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128  -GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD  HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-  SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES25  6-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

 ssl_prefer_server_ciphers on;
 ssl_session_timeout 1d;
 ssl_session_cache shared:SSL:10m;

 # 이후 원하는 설정 추가
}

dhparam파일도 만든다.

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/서버명.dhparam 2048

서버 설정 파일을 활성화시킨다

$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

설정에 문제가 없는지 테스트 해본다.

$ sudo nginx -t