반응형

OS: Ubuntu 16.04 (amd64)

Docker version: 17.09.1-ce


도커(Docker)가 활발하게 개발이 진행되고 버전이 자주 바뀌면서 엔진 부분의 기능이 너무 급격하게 바뀌는 것 때문에, 연구를 목적으로 예전의 특정한 버전을 사용해야만 할 때가 있다. 리눅스(예: 우분투)에서 패키지 관리자로 설치하면 비록 완전한 최신 버전은 아니지만 그렇다고 특정한 버전을 골라서 설치할 수도 없기 때문에, 도커 홈페이지에서 예전 버전의 바이너리 형태의 배포판을 찾아서 직접 실행하는 방식으로 사용해야 한다.


가장 먼저, 시스템에 이미 도커가 설치되어 있다면 리눅스(우분투)에서 기본 제공하는 도커 관련 패키지 모두 삭제한다.

$ sudo apt purge docker.io
$ sudo apt autoremove

(autoremove를 하면 docker.io 때문에 설치된 일부 dependency가 자동으로 제거됨)



아래 링크에 가서 원하는 도커 버전을 다운로드 받는다:
https://download.docker.com/linux/static/stable/x86_64/ 


터미널에서 다운로드 받은 위치에 가서 압축을 푼다.

$ tar xvzf docker-17.xx.x-ce.tgz



압축을 풀면 ./docker/ 폴더 아래에 바이너리 실행 파일들이 있음. 이것을 터미널에서 바로 실행 가능한 곳 어딘가에 복사한다. 보통은 PATH 환경변수에서 기본적으로 등록되어 있는 /usr/bin/ 또는 /usr/local/bin 이런 곳이 적당하다.

$ sudo cp docker/* /usr/bin/



터미널 하나를 새로 열고, 데몬을 미리 종료되지 않는 형태로 실행시켜 둔다.

터미널을 끄지 않고 내버려 두거나, 백그라운드에서 실행이 되도록 해 둔다.

$ sudo dockerd --experimental

또는

$ sudo dockerd --experimental &

(screen 같은 도구를 쓰는 것도 백그라운드에서 꺼지지 않게 하는 좋은 방법이 될 수 있다.)


이제 새 터미널에서, 도커 버전이 특정한 예전 버전으로 바뀌었는지 확인해 보고, 원래 하려던 docker 관련 작업(docker run, docker start, docker checkpoint 등)을 진행하면 된다.

$ docker -v



반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 16.04.4 (amd64)


우분투에서 XRDP 서비스를 켜 두고, 윈도우 노트북에서 원격 접속을 하다 보면, 가끔 알 수 없는 문제로 인해 XRDP 서비스가 다운되고 (즉, crash) 이후로는 서비스 재시작이 안 돼서 원격 데스크탑을 쓰지 못하는 경우가 가끔 있다.

보통은 서비스 재시작 ($ sudo service xrdp restart)을 통해 문제가 해결되어야 한다. 하지만 만약 서비스 재시작이 계속 안 된다면, 기존에 실행 중이던 XRDP 서비스가 예기치 않게 죽으면서 자신이 여전히 살아있는 것처럼 정보를 남겨 둬서 그럴 가능성이 높다.

즉, 이미 죽어버린 프로세스의 PID 정보가 살아있는 것처럼 관련 정보 파일이 남겨지면서 (아마 정상적으로 종료가 되었다면 그런 PID 정보 파일들을 삭제를 했을 텐데 crash 되면서 PID 정보를 삭제를 못한 것), 새로 시작되는 XRDP 프로세스는 이미 다른 XRDP 서비스가 실행 중인 것으로 간주, listen을 하지 않고 멈추는 것으로 예상된다.


문제를 해결하려면, XRDP 서비스들과 관련해서 파일로 남겨진 PID 정보를 삭제하고 서비스를 시작한다.


<해결 방법>

1. /var/run/xrdp 디렉토리에서 XRDP 관련 서비스들의 process ID를 확인한다.

$ cat /var/run/xrdp/xrdp-sesman.pid
$ cat /var/run/xrdp/xrdp.pid 


2. 위에서 출력된 숫자(프로세스 ID)를 사용하여 프로세스를 kill한다.

$ sudo kill -9 [PID]


3. /var/run/xrdp/ 디렉토리 내의 .pid 파일 2개를 모두 삭제한다.

$ sudo rm /var/run/xrdp/*.pid 


4. XRDP 서비스를 재시작한다.

$ sudo systemctl enable xrdp.service    <-- 이건 안 해도 되는 것 같기도 하다.

$ sudo service xrdp restart


위와 같이 작업한 후에 XRDP에서 설정한 포트 번호가 Listen 상태로 뜨면 정상 작동하는 것이다.
XRDP에서 포트 번호를 따로 변경해 주지 않았다면 기본적으로 listen하는 포트 번호는 3389이다.

$ netstat -nap | grep 3389

tcp        0      0 0.0.0.0:3389           0.0.0.0:*               LISTEN      18357/xrdp



반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 16.04

Shell: bash



배쉬(bash) 쉘에서 반복문, 즉 루프(loop)를 돌릴 때 여러가지 방법을 사용할 수 있다.



1. seq 사용


가장 간단한 방법이다. seq라는 프로세스가 순서대로 숫자를 출력해 주는 역할을 하는데, 그 결과를 문자열로 받아서 루프로 사용한다.


skylit@Linux:~$ seq 1 10
1
2
3
4
5
6
7
8
9
10


배쉬 쉘에서 seq를 바로 실행하면 위와 같이 나오고, 이것을 문자열로 사용해서 루프를 돌린다.


#!/bin/bash


SET=$(seq 0 9)

for i in $SET

do

    echo "Running loop seq "$i

    # some instructions

done


실행 결과:

Running loop seq 0
Running loop seq 1
Running loop seq 2
Running loop seq 3
Running loop seq 4
Running loop seq 5
Running loop seq 6
Running loop seq 7
Running loop seq 8
Running loop seq 9




2. 공백으로 구분된 문자열 사용


위의 seq를 그냥 수동으로 입력하는 방법이다. seq 쓰는 것과 아무 차이가 없고, 대신 사용자가 원하는 순서대로 숫자의 나열을 바꾸거나 뺄 수 있다.

루프 돌리는 수가 적고, 특정한 번호 순서를 직접 명시하고 싶을 때 유용하다.

#!/bin/bash


ORDER="5 6 7 8 9 4 3 2 1 0"

for i in $ORDER

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9
Running loop 4
Running loop 3
Running loop 2
Running loop 1
Running loop 0


물론 숫자 말고 다른 문자열도 가능하다.


#!/bin/bash


ORDER="apple orange watermelon"

for i in $ORDER

do

    echo $i

    # some instructions

done


실행 결과:

apple
orange
watermelon




3. bash의 루프 문법 사용


C/C++과 가장 유사한 형태라서 편하게 쓸 수 있다.

그리고 앞서 소개한 두 방법은 메모리에 문자열 변수를 할당하고 있어야 하는데 루프의 수가 매우 커지면 문자열의 길이도 그만큼 길어지기 때문에, 혹시나 너무 큰 루프 숫자로 인해 발생하는 메모리 문제를 방지하고 싶다면 이 방법이 유리하다.


#!/bin/bash


for ((i=0;i<=9;i++))

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 0
Running loop 1
Running loop 2
Running loop 3
Running loop 4
Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9







반응형
블로그 이미지

Bryan_

,
반응형
  • Client OS: Ubuntu 16.04
  • FreeRDP (xfreerdp) version: 2.0.0-dev2 (3c4385e)
  • Server OS: Windows 10 (version 1709, build 16299.309)



xfreerdp를 이용해서 리눅스에서 원격 윈도우 머신에 RDP (Remote Desktop Protocol) 연결을 해서 쓰고 있었는데, 2018년 들어서 윈도우10이 업데이트되고 나서는 아래와 같이 오류가 나면서 접속이 되지 않았다.



[19:43:47:999] [2320:2321] [INFO][com.freerdp.client.common.cmdline] - loading channelEx cliprdr
[19:43:47:033] [2320:2321] [ERROR][com.freerdp.core] - freerdp_set_last_error ERRCONNECT_PASSWORD_CERTAINLY_EXPIRED [0x0002000F]
[19:43:47:033] [2320:2321] [ERROR][com.freerdp.core.transport] - BIO_read returned an error: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error


확인해 보니, 윈도우 10에서 네트워크 수준 인증(Network Leval Authentication; NLA)을 사용하여 원격 접속을 허용하는 옵션과 연관된 듯 했다. 비슷한 문제를 겪는 사람들의 의견을 봤을 때, NLA 옵션을 끄니까 다시 되더라는 사람도 있었고, xfreerdp를 실행할 때 보안 옵션(/sec)으로 nla를 지정해 주었더니 되더라는 사람도 있었다.




*네트워크 수준 인증 (NLA) 끄는 방법:

  1. 시작버튼 누르고 "제어판"이라고 입력해서 제어판(윈도우10 설정 말고) 실행
  2. 시스템 선택
  3. 좌측에 "원격 설정" 선택
  4. 하단 부분에 "이 컴퓨터에 대한 원격 연결 허용" 아래에 있는 체크박스 해제 (네트워크 수준 인증을 사용하여 원격 데스크톱을 실행하는 컴퓨터에서만 연결 허용 (권장))



*xfreerdp에서 보안 옵션 지정하는 방법:

커맨드 라인에서 실행할 때 /sec 옵션을 추가해 준다.

  • 네트워크 수준 인증을 사용할 경우, /sec:nla
  • 그렇지 않을 경우, /sec:tls



나는 NLA 옵션을 끄고, xfreerdp를 실행할 때 /sec:tls 옵션을 추가했더니 문제 없이 접속이 잘 되었다.




<참고자료>

https://github.com/FreeRDP/FreeRDP/issues/4449#issuecomment-372979253



반응형
블로그 이미지

Bryan_

,
반응형

테스트 환경: Ubuntu 14.04, bash shell 사용



Bash 스크립트 파일에서 점점 awk를 써야 될 일이 많아지고, 그 awk 스크립트가 점점 더 복잡해지면서 한 줄에 주욱 이어서 썼더니 점점 가독성이 떨어지고 디버그하기 어렵게 되었다.


결론부터 말하자면, 그냥 가장 바깥에 있는 두 개의 single quote 문자 사이에는 마음대로 띄워써도 된다. ㅡㅡ;

개행 문자(newline), 탭 문자 마음대로 써도 상관이 없다.



그런데 내가 뭘 잘못했는지 command not found 에러가 났다.

뭐가 문제였을까?


확인해 보니,

awk [각종_옵션들] 

'                <---- awk 명령과 single quote 문자를 개행문자로 분리(...)

{

...

}

'


이런 식으로 썼던 거였다. 그러니까,


awk [각종_옵션들] '

{

...

}

'


코드의 시작을 나타내는 single quote 문자를 awk 명령줄과 같은 위치에 써야 하는데 그걸 엔터 쳐서 분리했더니, bash shell이 두 개의 서로 다른 명령으로 이해했던 것이었다. ㅜㅜ


아니면,

awk [각종_옵션들] \

'

{

...

}

'


이렇게 역슬래시로 다음 줄까지 명령 하나로 인식하도록 처리했어야 했다.


POSIX 명령의 기본 규칙을 잊지 말자. ㅠㅠ



반응형
블로그 이미지

Bryan_

,