2017년 8월 19일 토요일

MySQL 기본 명령어 - 사용자 및 권한 관리

MySQL을 설치하고 나서 뭘 하려고 하면 항상 인터넷에서 검색부터하는 게 지겨워서 이것도 정리해 놓는다. MySQL 콘솔에서 실행하는 몇 가지 자주 사용하는 명령어들이다.

root 권한으로 mysql 콘솔 실행

$ mysql -u root -p

database 조회

mysql> show databases;

database 선택

mysql> use database;

현재 등록된 사용자 조회

mysql> use mysql;
mysql> select user, host from user;

사용자 추가

mysql> create user userid@localhost identified by 'password';
mysql> create user 'userid'@'%' identified by 'password';
 %는 wildcard의 의미로서 any host로부터의 접속을 허용한다는 뜻이다.

사용자 삭제

mysql> drop user 'userid';

DB에 대한 사용자 권한 부여

 모든 권한 부여
mysql> grant all privileges on dbname.table to userid@host identified by 'password';
mysql> flush privileges; 
 특정 권한 부여
mysql> grant select, insert, update on dbname.table to userid@host identified by 'password';
mysql> flush privileges; 
dbname.table 대신에 dbname.*을 지정하면 db의 모든 테이블에 대한 권한 설정.

권한 삭제

mysql> revoke all on dbname.table from userid@host;
mysql> flush privileges; 

권한 조회

mysql> show grants for userid@host;

2017년 8월 16일 수요일

Raspberry Pi 간단 명령어 정리

Raspberry Pi를 사용하면서 자주 찾게되는 명령어들을 간단히 정리하려고 한다. 자주 사용하는 명령어라고 생각되는 명령어가 생길 때마다 종종 업데이트할 계획이다.

설치 패키지 관리

# 패키지 목록 업데이트
$ sudo apt-get update

# 설치된 패키지 업그레이드 수행
$ sudo apt-get upgrade

# 사용되지 않는 패키지 삭제
$ sudo apt-get autoremove

# 다운로드된 아카이브 파일 삭제
$ sudo apt-get clean

# 다운로드된 구버전 아카이브 파일 삭제
$ sudo apt-get autoclean

# 패키지 설치
$ sudo apt-get install pkg_name1 [pkg_name2 pkg_name3 ...]

# 패키지 삭제
$ sudo apt-get remove pkg_name1 [pkg_name2 pkg_name3 ...]

# 모든 패키지 목록 보기
$ apt list

# 설치된 패키지 목록 보기
$ apt list --installed

사용자 관리

# 사용자 추가
$ sudo adduser user_id

# 그룹에 사용자 추가
$ sudo adduser user_id group_name

# 계정이 속한 그룹 조회
$ groups user_id

# 사용자 삭제 (home directory도 같이 삭제)
$ sudo deluser --remove-home user_id

# 비밀번호 변경
$ passwd

2017년 8월 14일 월요일

Raspberry Pi WiFi 설정하기

 Raspberry Pi 3에는 무선랜이 기본 탑재라서 WiFi 설정을 해 보았다. 설정 중에 겪은 몇 가지 문제점과 설정 방법을 여기서 다뤄보려고 한다.

무선랜 장치 조회

 아래와 같이 iwconfig 명령을 실행해보면 기본 탑재된 무선랜 장치는 wlan0임을 알 수 있다.
pi@raspberrypi:/home $ iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11  ESSID:"shanpark"  
          Mode:Managed  Frequency:2.447 GHz  Access Point: 64:E5:99:A3:6F:2C   
          Bit Rate=72.2 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=68/70  Signal level=-42 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

eth0      no wireless extensions.

무선 네트워크 검색

 sudo iwlist wlan0 scan 명령을 실행하면 검색된 무선 네트워크 리스트가 여러 개 출력된다.
pi@raspberrypi:/home $ sudo iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 64:E5:99:A3:6F:2C
                    Channel:8
                    Frequency:2.447 GHz (Channel 8)
                    Quality=70/70  Signal level=-40 dBm  
                    Encryption key:on
                    ESSID:"wlanessid"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=0000000000000000
                    Extra: Last beacon: 30ms ago
                    IE: Unknown: 00087368616E7061726B
                    IE: Unknown: 010882848B960C121824
                    IE: Unknown: 030108
                    IE: Unknown: 2A0100
                    IE: Unknown: 32043048606C
                    IE: Unknown: 2D1A6E181EFFFF0000000000000000000000000000
                    IE: Unknown: 3D1608050000000000000000000000000
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: DD180050F2020101800003A4000027A40062322F00
                    ...
 출력된 여러 값들 중에 ESSID 값을 보면 자신이 연결할 무선 네트워크가 검색되는 지 확인할 수 있다. 여러 번 시도해보고 검색이 되지 않으면 연결이 안된다는 뜻이므로 검색이 되도록 무선 공유기를 확인해보거나 환경을 다시 한 번 체크할 필요가 있다.

 여기서 별 문제가 없더라도 검색이 안되는 문제의 원인으로 두 가지를 설명하고자 한다.

 첫 번째로 raspi-config를 실행해서 Localisation Options 메뉴에서 Wi-fi Country 설정을 하지 않도록 한다. 이것을 설정하지 않아도 아무 문제가 없는데 설정을 하면 무선 네트워크 검색이 되지 않는다. 하나도 검색이 안된다면 이 문제일 가능성이 있다. 만약 이 경우라면 /etc/wpa_supplicant/wpa_supplicant.conf 파일의 맨 첫 줄에 자신이 지정한 나라의 코드 값이 보일 것이다. 첫 줄을 삭제하고 리부팅 후 다시 검색을 시도해보면 검색 결과가 출력될 것이다.

 두 번째로 특정 무선 네트워크가 검색이 안된다면 그 무선 네트워크의 channel이 12 또는 13인지 확인해보자. R Pi의 펌웨어에 문제가 있어서 channel 12 또는 13으로 설정된 무선 네트워크는 검색이 되지 않는다. 자신의 무선 네트워크가 검색이 되지 않으면 channel 값이 1 ~ 11 인지 확인해보고 아니라면 1 ~ 11 사이의 값으로 설정하도록 한다.

무선 네트워크 설정

 검색된 무선 네트워크 설정을 위한 설정값을 wpa_passphrase 명령으로 만든다. 아래 명령에서 wlanessid는 ESSID값을, password는 무선 네트워크의 패스워드를 넣고 명령을 실행하면된다.
pi@raspberrypi:/home $ wpa_passphrase wlanessid password
network={
 ssid="wlanessid"
 #psk="password"
 psk=8b784be81fb45f16ff506fde4013f50c018f832dec02810541d490aae9ab0b7a
}

 명령을 실행하고나서 화면에 출력되는 값, 즉 network={....}을 /etc/wpa_supplicant/wpa_supplicant.conf 파일의 끝에 넣어주면 설정은 끝이다. 여기서 #psk=xxxx 라인은 주석이므로 제거해도 된다. 비밀번호가 직접 보이는 건 보안상 좋지 않으므로 반드시 제거하는 걸 추천한다.

 참고로 최종 설정된 /etc/wpa_supplicant/wpa_supplicant.conf 파일의 내용을 보면 일반적으로 아래와 같다.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
 ssid="wlanessid"
 psk=8b784be81fb45f16ff506fde4013f50c018f832dec02810541d490aae9ab0b7a
}

무선 네트워크 연결 확인

 대충 설정이 다 됐다면 속편하게 리부팅을 하고 터미널에서 ifconfig 명령을 실행해보자. 정상적으로 연결이 되었다면 wlan0 장치에 ip 주소가 설정되어있을 것이다.
pi@raspberrypi:/home $ ifconfig
eth0      ...

lo        ...

wlan0     Link encap:Ethernet  HWaddr b8:27:eb:ed:00:88  
          inet addr:192.168.0.33  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::dcce:1d4e:75e0:afb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9236 errors:0 dropped:0 overruns:0 frame:0
          TX packets:563 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:999226 (975.8 KiB)  TX bytes:44396 (43.3 KiB)

ip 주소가 할당되었다면 정상적으로 설정된 것이다. 이제 랜선을 뽑아도 된다.



2017년 8월 13일 일요일

Raspberry Pi에 Raspbian 설치하고 초기 설정하기

 시간이 지날수록 Raspbery Pi에 Raspbian을 설치하고 초기 설정을 위해서 각종 설정파일을 편집하는 등의 작업이 갈수록 간단해지고 있어서 사실 이 포스팅은 대단히 복잡한 과정을 설명하는 건 아니다. 그저 갈수록 기억력에 의존하기가 어려워지면서 검색의 귀찮음을 줄여보고자 글을 쓸 뿐...

 그래서 간단하게 작업 순서, 각종 URL, 명령어 위주로 간단하게 기록을 남겨보려고 한다.

0. 준비

당연히 Raspberry Pi(이하 R Pi) 한 대가 있어야 겠고, Raspbian을 설치할 SD 카드가 하나 있어야 한다. SD 카드는 LITE 버전이면 4GB 이상이면 되고 Desktop 버전을 설치할 계획이라면 8GB 이상이 좋겠다. 그리고 SD 카드에 Raspbian을 설치할 PC가 한 대 필요하다. 윈도우, 맥, 리눅스 뭐든 좋다. SD 카드를 인식시킬수만 있으면 된다. Raspbian을 설치하고 최초에 한 번은 부팅 후 설정을 해줘야 하기 때문에 HDMI 지원 모니터와 USB 키보드도 있어야 한다. PC에 연결된 걸 뽑아서 R Pi에 연결해서 써도 된다.

1. Raspbian 다운로드

라즈베리파이 홈페이지에 접속해서 DOWNLOAD 메뉴로 이동하면 Raspbian 링크가 있다. 링크로 들어가면 Desktop 버전과 LITE 버전이 따로 있으므로 원하는 버전으로 다운로드하도록 한다.

2. Raspbian 설치

 위의 다운로드 페이지를 몇 줄 읽어보면 Installation guide 링크가 있다. 페이지 URL과 내용은 가끔 바뀌므로 링크를 직접 걸어놓지는 않겠다. 다운로드 페이지를 읽어보면 항상 링크가 있으므로 링크를 타고 들어가도록 하자.

 링크를 눌러서 이동해보면 "Etcher"라는 프로그램으로 다운받은 Raspbian 이미지 파일을 SD카드에 Write함으로써 설치가 끝난다. 역시 페이지 안에 Etcher를 다운로드할 수 있는 링크가 있으므로 링크를 눌러 다운로드 페이지로 이동해서 다운로드하여 설치하도록 하자. Etcher는 윈도우, 맥, 리눅스용 버전이 모두 있으므로 자신의 PC에 맞는 버전을 다운로드하여 설치하도록 하자.

 준비된 PC에 SD카드를 연결하고 Etcher를 실행해보면 별다른 설명이 필요없을 만큼 간단하게 이미지 파일을 SD카드에 Write할 수 있으므로 여기서 추가 설명은 하지않겠다. 예전엔 이 부분이 상당히 복잡한 과정이었는데 Etcher덕분에 말 할 수 없이 간단해졌다.

3. Raspberry Pi 초기 설정

 2.번에서 설치한 SD 카드를 R Pi에 꽂고 HDMI 모니터를 R Pi에 연결하고 USB 키보드를 R Pi에 연결해 준 후 R Pi에 전원을 넣으면 바로 부팅이 되고 로그인 프롬프트가 보일 것이다. 사실 추가 설정을 안해도 이 상태로 사용가능한 리눅스 머신이다.

 최초에는 디폴트로 "pi" 라는 계정이 있다. 패스워드는 "raspberry"이므로 입력해서 로그인을 해보도록 한다.

 로그인을 했으면 이제 각종 환경 설정을 할 차례다. 그냥 raspi-config라는 프로그램을 실행하면 된다. 텍스트 모드이긴 하지만 충분히 설정하기 쉬운 인터페이스를 제공하므로 원하는 설정을 하도록 한다.
$ sudo raspi-config

 설정할 수 있는 옵션이 여러가지가 있지만 반드시 해야할 것으로 몇 가지 추천하자면 아래 옵션들은 설정해 주는 게 좋겠다.
  • 비밀번호 변경
    pi 계정의 디폴트 패스워드는 누구나 알고 있으므로 바꿔줄 것을 강력히 추천한다.
  • SSH Enable
    기본으로 Disable된 상태로 설치된다. 일반적으로 모니터, 키보드없이 사용할 계획이라면 반드시 Enable시켜야 한다. "Interfacing Options" 메뉴로 들어가면 SSH를 Enable 시킬 수 있는 메뉴가 보일 것이다. Enable 시키도록 하자.
  • Locale, Timezone 설정
    이건 반드시 필요하다고 할 수는 없겠지만 사용하다보면 분명 필요한 시점이 올 것이다. "Localisation Options" 메뉴로 들어가면 설정할 수 있는 메뉴들이 보일 것이다. 적절히 설정하도록 하자. 단, "Change Wi-Fi Country" 메뉴는 건드리지 말자. 버그가 있는 지 이 값을 건드리면 무선랜 스캔이 되지 않는다. 디폴트 그대로 써도 아무 문제가 없으니 건드리지 않도록 한다.
 이제 모니터, 키보드 없이 네트워크만 연결되어있으면 어디서나 터미널로 연결해서 작업이 가능하다. PC로 이동해서 터미널을 열고 SSH 연결을 시도해보자. 이후 추가 작업은 SSH 연결을 통해서 얼마든지 가능하다.

 다시봐도 정말 간단하다. 수년 전 R Pi에 처음 뭔가를 설치하고 설정하는 작업을 할 때와는 정말 비교할 수 없을 정도로 간단해졌다. 이제는 누구나 리눅스 머신 한 대 정도 운영하는 건 껌인 세상이다.


2017년 8월 12일 토요일

Raspberry Pi에서 USB 외장하드를 Root 파일 시스템으로 사용하기

 가지고 있던 아이맥을 SSD로 업그레이드하면서 원래 있던 3.5인치 하드디스크를 외장으로 Raspberry Pi(이하 R Pi)에 연결해서 써보려고 좀 알아보니 USB로 연결된 외장 하드가 Micro SD 카드보다 더 성능이 좋다고 한다. 게다가 Root 파일 시스템으로 외장 하드를 사용하는 게 더 나은 성능을 보인다는 얘기도 있고 해서 내가 가진 R Pi 장비에 적용해 보기로 했다.

준비 작업


 일단 현재 상태는 아래와 같다.
  1. Raspbian이 설치된 Micro SD로 부팅가능한 R Pi 3. (이전 모델도 문제는 없다.)
  2. 외장으로 사용할 3.5" 1 TB Hard Disk.
  3. 외부 전원을 사용하는 3.5" 외장 하드 케이스.
 간단히 설명을 해보면 현재 사용중이던 R Pi의 Root 파일 시스템을 현재 상태 그대로 외장 하드로 옮겨서 외장 하드를 Root 파일 시스템으로 사용하도록 설정 하는 것이다. 이렇게 얘기하면 복잡한 과정이 될 것 같지만 Brennen Bearnes라는 사람이 한 번에 모든 과정을 처리하는 스크립트를 만들어 놓았으니 걱정할 건 없다.

 여기서 주의할 것은 R Pi의 USB로부터 받는 전원이 약해서 외장 하드 케이스는 반드시 외부 전원을 따로 갖추고 있는 놈으로 사용해야 한다. (그렇지 않으면 정말 쓸데없는 고생을 하게 될 수도 있다.)

 그럼 먼저 R Pi의 남는 USB 포트에 외장 하드를 연결하고 전원을 연결하여 R Pi를 부팅하자. USB에 연결된 외장 하드는 다른 디스크 장치가 연결되어 있지 않다면 /dev/sda로 잡힐 것이다. 새로 연결한 디스크 안에 파티션이 몇 개 있다면 /dev/sda1, /dev/sda2로 전에 없던 장치들이 보일 것이므로 아래 명령으로 간단히 디스크 목록을 보고 새로 잡힌 장치가 무엇인지 알아내도록 한다.

 연결 전에는 없던 새로 잡힌 장치가 무엇인지 보면 된다. 리눅스를 어느정도 사용하는 사람이면 새로 잡힌 장치가 무엇인지 여러가지 방법을 알겠지만 대부분 이 정도로 충분하다. 아래 그림은 연결된 장치가 /dev/sda이고 그 안에 /dev/sda1 파티션이 한 개 있는 상태다. 일단은 연결된 장치가 /dev/sda라고 가정하고 계속하겠다.

스크립트 실행


 이제 준비는 끝났다. 터미널로 R Pi에 연결해서 아래 명령으로 GitHub를 통해서 배포하는 스크립트를 받아서 실행하면 된다. 만약 git가 설치되지 않은 상태라면 git 먼저 설치해야 한다. 아래 명령으로 설치한다.
$ sudo apt-get install git
 git가 설치되었으면 아래 명령으로 GitHub에서 스크립트를 받아 실행하도록 한다.
$ git clone https://github.com/adafruit/Adafruit-Pi-ExternalRoot-Helper.git
$ cd Adafruit-Pi-ExternalRoot-Helper
$ sudo ./adafruit-pi-externalroot-helper -d /dev/sda
 위의 마지막 명령으로 스크립트를 실행하면 아래와 같은 메시지들이 뜨면서 화면에 뜨면서 실행 과정을 볼 수 있다. 가끔 묻는 질문에 y를 누르고 진행 시키면 된다.

 스크립트가 출력하는 메시지들을 자세히 살펴보면 어떤 작업을 수행하는 지 대충 알 수 있다. 수행하는 작업을 간단히 정리해보면 아래와 같다.

  1. apt-get으로 disk, rsync, parted 를 설치한다. 작업을 수행하는 데 필요한 프로그램들이다.
  2. 외장 하드에 새로운 파티션을 하나 생성한다. 이전에 있던 데이터는 모두 사라지고 전체 디스크를 사용하는 파티션을 하나 생성(/dev/sda1)하므로 전에 있던 중요 데이터는 모두 백업해두어야 한다.
  3. 새로 생성한 파티션을 /mnt에 마운트하고 루트 파티션의 데이터를 모두 새로 생성한 파티션으로 복사한다.
  4. /etc/fstab 파일을 편집해서 새로 생성된 파티션이 항상 마운트되도록 설정한다.
  5. /boot/cmdline.txt 파일을 편집해서 새로 생성된 파티션이 Root 파티션이 되도록 설정한다.
 스크린에 출력된 마지막 메시지를 읽어보면 reboot를 하라고 되어있다. 자동으로 리부트를 하지는 않으므로 직접 리부팅하도록 한다.

 어떤 변화가 있었는지 자세히 알고 싶다면 /etc/fstab, /boot/cmdline.txt 파일을 열어서 직접 확인해보면 된다. 매우 간단하기도 하고 한 줄 밖에 안되는 수정사항이므로 열어보는 것이 이해하는데 도움이 된다. 

복원


 만약 어떤 문제가 있어서 다시 원래 상태로 돌아가고 싶다면  /etc/fstab, /boot/cmdline.txt을 복원하면 된다. /etc/fstab 파일의 경우 이전에 사용하던 SD 카드의 파티션을 스크립트가 주석처리해 두었으므로 이것을 해제하면 되고 /boot/cmdline.txt 파일의 경우는 이전 파일을 /boot/cmdline.txt.bak 파일로 백업해두었으므로 다시 교체하면 된다. 

마무리

 현재 상태에서 Root 파티션으로 외장 하드를 이용하고 있지만 부팅은 SD 카드를 이용해야 하기 때문에 SD 카드가 없어도 된다는 것은 아니다. 따라서 SD 카드에 있던 이전 Root 파티션은 나중에 있을지 모르는  복원 작업을 위해서 그대로 남겨두던가 아니면 새롭게 포맷해서 다시 마운트하여 사용할 수 있다. 

 SD 카드는 /dev/mmcblk0 장치로 잡혀있고 파티션은 /dev/mmcblk0p1, /dev/mmcblk0p2이다. /dev/mmcblk0p1 파티션은 boot 파티션이므로 건드리면 안되고 /dev/mmcblk0p2이 이전에 사용하던 Root 파티션이므로 이것을 포맷해서 사용할 수 있다. 만일을 대비해서 포맷하지 않고 그대로 마운트해서 사용해도 문제는 없다.

 포맷 및 마운트하는 명령은 아래와 같다. (umount 철자 주의)
# Format
$ sudo mkfs.ext4 /dev/mmcblk0p2

# Mount
$ sudo mount /dev/mmcblk0p2 /mnt

# Unmount
$ sudo umount /mnt

 어차피 SD 카드는 부팅에 필요하기 때문에 항상 꽂아놓고 사용할 것이므로 fstab을 편집해서 항상 mount가 되도록 해두는 게 좋다. 아래 한 줄을 /etc/fstab 파일의 마지막에 추가하여 항상 /sdcard에 마운트가 되도록 할 수 있다.

/dev/mmcblk0p2  /sdcard         ext4    defaults        0       0