'분류 전체보기'에 해당하는 글 576건

애플 실리콘의 M1 칩을 탑재한 맥북에어 / 맥미니 / 맥북프로

이중에서 맥북에어 와 맥미니 가 끌린다.

인텔버전의 맥미니/맥북프로를 쓰고 있기는 한데, 이번에 맥북에어를 살까 고민중이다.
국내 출시하면 검토해봐야 겠다.

작업용으로 맥미니를 쓰는데, 8기가 메모리가 부족한듯 해서 이번에는 16기가로 해볼까 생각중.
맥북에어는 헤비하게 쓰지는 않아서, 8기가로 될 듯 함.

언제쯤 출시하려나?

하나 걸리는 것은 주요 필수어플들이 잘 동작할지 알아봐야 겠다.

개발용 / 업무용 등.

sublime text / visual studio code
dropbox / evernote
chrome / firefox / whale / brave / vivaldi
kakao talk / slack / telegram

일단 이정도만 되면 큰 문제는 없을 듯 하다.

 

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 데스크탑을 사용하면서, 보통 계속 켜두고 쓴다.

그런데, 왜 그런지, 잠금화면이 마우스는 움직이는데, 키보드가 안 되는 듯 하다. 또한 상단 메뉴등이 클릭이 되지 않는다.

아예 멈춘것은 아닌데, 이상하다. 그래서 ssh 로 접속해보니, 정상적으로 동작하고 있었다.
lock screen 만 이상한 것이다.

이런경우 ssh 로 root 접속한 후 다음 명령을 입력한다. (또는 sudo 명령으로 )

# loginctl unlock-sessions

 

일단 해결은 했는데, 왜 그런 현상이 발생했는지는 모르겠다.

현상 중 하나가 잠금화면의 암호 입력부분이  마치 키보드의 특정키가 눌린 것처럼  여러개가 눌려져 입력되어 있다는 것이다.
(어디서 이상한 입력이 들어온다? - 해킹?)
위 원인으로 인한 다른 현상은 잠금화면이 되면, 모니터도 잠자기(?) 모드로 가는데, 모니터도 켜져 있다.

좀더 현상을 지켜봐야 겠다. (18.04 등으로 업그레이드를 해야할려나?)

 

[추가]
현상 재연을 확인했다. 키보드가 로지텍 무선 키보드인데, usb 리시버의 이상인지.
무선키보드 전원 껐다 다시 키면 , 특정문자가 여러개 입력이 되버린다.

켜져있는 상태에서 드라이버 문제인지, 키보드 자체문제인지, 혹은 usb 리시버, 혹은 메인보드 이상 현상으로 인한 문제일 듯 하다.

우선 재부팅 등으로 조치해보고, 추후 키보드 교체 등을 해볼 예정.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

맥os 의 기본메일앱을 사용하고 있다. imap 으로 연결해서 사용중인데, 몇몇 메일이 올때 한글 파일명이 ????? 등으로 깨져서 보일때가 있다.

utf-8 / euc-kr 등 인코딩 문제인데, utf-8 으로 기본 세팅이 되어 있지 않은 듯 싶다.

관리자로 권한
sudo -s

defaults write com.apple.mail NSPreferredMailCharset "UTF-8"

명령을 해주고, 메일앱을 CMD+Q 로 완전종료했다가 다시 실행해주면 정상적으로 보일 것이다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

공유기 등 내부망에 있어서 외부 접속이 어려운 환경에서 접속할 수 있게 할 수 있다.

터널링을 통해 가능하다. ssh 로 접속해 있을 수 있는 호스팅 환경이 있으면 된다.

apt install autossh

설치는 쉽다.

systemd / upstart 방식에 따라 자동 실행 설정이 조금 다르다.

# systemd 방식 (최근 배포판)

# vi /etc/systemd/system/autossh.service
[Unit]
Description=AutoSSH service for a reverse tunnel 
After=network-online.target

[Service]
ExecStart=/usr/bin/autossh -M 0 -q -N \
-i /root/.ssh/id_rsa \
-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" your-externel-server \
-R 5991:127.0.0.1:5901 \
-R 5922:127.0.0.1:22 \
-R 5989:192.168.11.19:5900

[Install]
WantedBy=multi-user.target

위 설정처럼 하면 된다. 자신의 맞는 환경에 따라 수정해서 사용하면 된다.
내부 서비스(5901 , 22) 로 접속가능하고, 또는 동일네트워크 다른 서버로도 접속가능하다.

위 파일 생성 후 다음 명령으로 실행해준다.

systemctl enable autossh
systemctl start autossh

 

# upstart 방식 (예전 방식)

# vi /etc/init/autossh.conf 
description "autossh daemon for ssh tunnel"

start on net-device-up IFACE=eth0
stop on runlevel [01S6]

#setuid autossh

respawn
respawn limit 5 60

script
export AUTOSSH_FIRST_POLL=30
export AUTOSSH_GATETIME=0
export AUTOSSH_POLL=60
/usr/bin/autossh -M 0 -q -N \
-i /root/.ssh/id_rsa \
-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" your-externel-server \
-R 5991:127.0.0.1:5901 \
-R 5922:127.0.0.1:22 \
-R 5989:192.168.11.19:5900
end script

설정 방식만 조금 다를 뿐 사용법은 동일하다.

 

그럼, 제 3의 위치에서 터널링으로 뚫어 놓은 내부서버에 접속해본다.
당연히 바로 접속 할 수는 없다.

다음의 ssh 명령으로  {로컬PC} => 외부 서버 => 내부망(터널링)  으로 접속한다.

ssh your-externel-server -L 5991:127.0.0.1:5991 -L 5922:127.0.0.1:5922 

위 설정은 로컬PC 의 포트로 터널링한 내부망의 서비스 포트와 연결하는 것이다.

ssh root@localhost -p 5922

내부에서 다음 처럼 접속하면 된다. (위 예시는 내부망의 22번 ssh 포트로 접속하는 명령)

조금 복잡해 보일 수 있지만, 흐름을 이해하면 크게 어렵지는 않다.

내부망에 포트포워딩으로 접근할 수 없는 경우, 보안접속이 필요한 서비스 등에 사용할 수 있다.
기본적으로 ssh 를 이용한 것이라 vpn 처럼 보안접속이 필요한 경우등에 유용할 듯 싶다.

 

[추가]

systemd 방식 설정 후 재부팅했는데, autossh 가 실행이 안되는 경우

다음과 같은 에러가 날때 (systemctl status autossh 로 확인)

ssh exited prematurely with status 255; autossh exiting

구글링 해보니, After=network-online.target 대신에

After=network.target
After=NetworkManager-wait-online.service

등등 여러개로 바꿔가며 해봐도 안된다. 네트워크가 정상 접속되는 시점이 차이가 있는 듯 하다.

 

# vi /etc/systemd/system/autossh.service 에 다음 항목을 추가해준다.

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'

 

위 처럼 네트워크가 동작하는지 체크 후에 실행하도록 한다. ( 완료 후 systemctl daemon-reload 로 설정을 재로딩 해준다)


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

맥os 를 쓰다보면, 한글의 자소가 분리되는 현상을 경험하게 된다.

윈도우 / 리눅스 / 맥os 등을 같이 쓰다보면, 프로그램 처리시 조치해줘야 할 부분이 있다.

php 에서는 다음 방법으로 조치해준다.

패키지는 php-intl 를 설치해줘야 한다.

코드 처리는 다음처럼 해준다.

if (!\Normalizer::isNormalized($file_location)) { // mac type - utf8
  $file_location = \Normalizer::normalize($file_location);
}

요점은 맥os 방식을 윈도우/리눅스 방식으로 바꿔준다 라고 이해하면 된다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 로그인이 안된다.

.xsession-error 파일을 확인해 본다.(계정 폴더에 있다.)

/etc/X11/Xsession.d/99x11-common_start: line 5: /sbin/upstart: No such file or directory

다음과 같은 에러가 보인다.

우분투는 부팅 스크립트 방식을 바꿔왔다. 

system-v 방식 : /etc/init.d , rcX.d 형태의 관리

upstart 방식 : /etc/init/ 안에 부팅 관련 스크립트 관리  ( service OOO restart 형태 관리 )

systemd 방식 : 가장 최근 방식 ( systemctl restart OOO )

 

설치된 운영체제는 18.04 버전인데, systemd 을 쓰기에 upstart 는 쓰지 않는다.
(16.04 => 18.04 로 업그레이드해서 남아있었던듯 하다)

해결 방법은 upstart 를 제거해준다.

apt purge upstart

다시 GUI 로그인 해보면 될 것이다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

오래된 우분투 버전을 사용하고 있다. (12.04)

서버 자체가 오래되었고, 돌아가고 있는 어플도 레거시라 업그레이드 하기가 애매하다.

그런데 서버를 옮기고 나서 다음과 같은 메시지가 나온다.

[ 2676.415781] mei 0000:00:16.0: unexpected reset.
[ 2706.390158] mei 0000:00:16.0: unexpected reset.
[ 2736.364548] mei 0000:00:16.0: unexpected reset.
[ 2766.338924] mei 0000:00:16.0: unexpected reset.
[ 2796.313317] mei 0000:00:16.0: unexpected reset.
[ 2826.287704] mei 0000:00:16.0: unexpected reset.
[ 2856.262086] mei 0000:00:16.0: unexpected reset.
[ 2886.236475] mei 0000:00:16.0: unexpected reset.

원래부터 나오던 메시지였는지도 불확실 하다.

다음과 같은 장치인데,

# lspci -v |grep -i mei
00:16.0 Communication controller: Intel Corporation 7 Series/C210 Series Chipset Family MEI Controller #1 (rev 04)
	Kernel modules: mei

MEI 는 Management Engine Interface  라고 한다.

관리 엔진? 인터페이스 장치인듯 싶다. 뭐 하여간 잘 모르겠다.
(참고 : https://www.intel.co.kr/content/www/kr/ko/support/articles/000008927/software/chipset-software.html )

 

 

저 메시지가 계속 생겨서 없애고자 한다.

일단 modprobe 로 제거

# modprobe -r mei

# dmesg
mei 0000:00:16.0: PCI INT A disabled

위와 같이 나오고 중지된다.

부팅시 나오지 않게 한다. ( /etc/modprobe.d/blacklist.conf 에 다음 추가 )

blacklist mei

좀더 상태를 살펴보고 이상이 없는지 체크해보고 치명적인 이상이 있으면 추가(없으면 패스)


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

vuejs 를 사용시 vue-router 를 사용하여, 경로를 지정할 수 있다.
그러면 about / price / 등 필요한 페이지를 분리할 수 있어 작업하기 편하다.
그런데, SPA 웹페이지이기 때문에 index.html 내에서 처리가 된다.

즉, 해당 경로로 직접 들어가면 404 페이지가 표시된다.
그렇다면 404 페이지를 모두 index.html 으로 보내면 된다. ( 참조 : https://router.vuejs.org/kr/guide/essentials/history-mode.html )

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

아파치 apache 설정시 다음과 같은 에러가 발생할 수 있다.

RewriteBase: only valid in per-directory config files
Action 'configtest' failed.
The Apache error log may have more information.

그런경우는 해당 설정이 <Directory > </Directory> 설정내에 넣어준다.

<Directory {{vue앱-디렉토리패스}}>

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

</Directory>

이런식으로 넣어준다. vue 앱과 서버측 (node / go / php 등) 어플과 조합을 해서 사용가능하다.

php 같은 경우 laravel 등의 프레임웍(modern php)을 써도 되고, 그냥 날코딩(legacy php)으로 만들어서 조합해도 상관없다.

{{vue-app-path}}/api/[php app file].php

형태로 php 어플을 실행해도 된다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

모니터 연결이 안된 서버에 vnc 접속시 해상도가 1024x768 등 낮게 설정이 된다.

가상의 모니터로 접속할 수 있게 설정해준다.

더미 모니터 패키지를 설치한다.

apt install xserver-xorg-video-dummy

xorg 설정을 해준다. ( /usr/share/X11/xorg.conf.d/xorg.conf )

Section "Device"
    Identifier "DummyDevice"
    Driver "dummy"
    VideoRam 256000
EndSection

Section "Screen"
    Identifier "DummyScreen"
    Device "DummyDevice"
    Monitor "DummyMonitor"
    DefaultDepth 24
    SubSection "Display"
        Depth 24
        Modes "1920x1080_60.0"
    EndSubSection
EndSection

Section "Monitor"
    Identifier "DummyMonitor"
    HorizSync 30-70
    VertRefresh 50-75
    ModeLine "1920x1080" 148.50 1920 2448 2492 2640 1080 1084 1089 1125 +Hsync +Vsync
EndSection

재부팅하면 원하는 해상도로 접속이 된다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

몽고db 데이터를 이전하기 위해 mongodump / mongorestore 로 백업 / 복구 하였다.

그런데, 원래 그런지, 어떤 설정이 있는 것인지 인덱스 가 생성되지 않았다.
> ( 기본은 인덱스가 재 생성 되는 듯 한데, --noIndexRestore 을 주면 인덱스 미생성 )

dump / restore 중에 뭔가 이상이 있는 것인가?  또는 --gzip / --archive 옵션으로 하면 생성이 안되는 것일까?

정확한 이유는 체크해봐야 할 듯 하다.

암튼 그래서 createIndex 로 생성하려하는데, 다음과 같은 에러가 발생하였다.

2020-04-18T06:14:45.987+0000 I  NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
command terminated with exit code 137

몽고db - POD 에 접속을 못하는 듯 하다. 좀더 체크해보니 인덱스 생성도중에 mongod POD 가 중지 Down 되어 버린다.

해당 이슈에 대한 검색으로는 특별한 원인을 찾지 못했다. 몽고db 리플리카 셋은 kubernetes(microk8s) 로 세팅하였다.

예상되는 부분은  restore 과정중에 뭔가 데이터가 깨진것이 아닌가 예상이 된다.
그래서 pvc 를 삭제하면, 리플리카 셋이 자동으로 재생성(초기화) 되면서 pod 가 재실행되도록 하였다.

위 조치로 해결이 되었다. (일단 예상은 맞는 듯 하다)

그런데, 근본적인 작업이었던  백업 / 복구 방식이 문제였을까? ( mongodump => mongorestore )

그냥 데이터 디렉토리를 그대로 복사하는 방법으로 해야할까? 좀더 테스트를 해봐야 겠다.

[추가]

좀더 체크해보니, mongorestore 메시지에 이상이 있었다. (몽고db - pod 가 이상이 있어서 인덱스 생성 실패 케이스)

[정상]

2020-04-20T00:16:08.550+0900	restoring indexes for collection test.product from metadata
2020-04-20T00:19:35.655+0900	finished restoring test.product (5522171 documents, 0 failures)
2020-04-20T00:19:35.655+0900	restoring users from archive '/restore/restore/restore-archive.gz'
2020-04-20T00:19:35.881+0900	5522171 document(s) restored successfully. 0 document(s) failed to restore.

[이상있는 경우]
2020-04-18T07:11:49.926+0900	restoring indexes for collection test.product from metadata
2020-04-18T07:12:44.169+0900	finished restoring test.product (5522171 documents, 0 failures)
2020-04-18T07:12:44.170+0900	Failed: test.product: error creating indexes for test.product: createIndex error: connection(mongod-2.mongodb-service:27017[-11]) incomplete read of message header: EOF
2020-04-18T07:12:44.170+0900	5522171 document(s) restored successfully. 0 document(s) failed to restore.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

도커는 주로 우분투(리눅스)에서 사용하고 있다. 그래야 제대로된 성능이 나오기 때문이다.

그런데, 개발/테스트 등을 위해 맥os 에서 사용하고자 한다.

설치는 쉽다. https://www.docker.com/products/docker-desktop 에서 다운로드 후 설치하면 된다.

도커를 실행하면, 로그인은 꼭 필수는 아니다.(본인의 도커 이미지등을 docker hub에 등록하고자 하면 필요)
그냥 로컬에서 실행/테스트 할때는 굳이 필요없다.

대시보드 - 괜찮네

끝.

도커를 연습해 보고자 한다면, https://docs.docker.com/get-started/ 를 참조한다.

 

도커 데스크탑 이 쿠버네티스도 지원하는 듯 하다. 설정을 해봤다. 쓸만한 지는 체크해봐야겠다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 18.04 를 직접 설치하는 경우는 별 문제는 없을 듯 하다.

그런데, 16.04 버전에서 do-release-upgrade 로 업그레이드 한 경우 이상현상이 발생했다.

# nslookup daum.net
Server:		127.0.0.53
Address:	127.0.0.53#53

** server can't find daum.net: SERVFAIL

위 처럼 도메인 질의 검색이 안된다.

현상은 16.04 에서는 resolvconf 패키지가 관리를 하는데, 18.04 에서는 systemd-resolve 가 관리하도록 바뀐 듯 하다.
(서버 버전과 데스크탑 버전의 차이도 있을 듯 하다.)

systemd-resolved 는 다음의 위치에서 관리한다.

# cat /etc/systemd/resolved.conf 

...
...

[Resolve]
#DNS=
DNS=210.220.163.82
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

이게 올바른 해결책인지는 불확실하다. ( 위 처럼 - 자신의 DNS 를 입력해준다 - IDC 쪽에서 권장하는 것으로 등록)

# systemctl restart systemd-resolved.service
# systemd-resolve --status
Global
         DNS Servers: 210.220.163.82
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

재 실행해 주면 정상 동작한다.

 

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투를 18.04 를 본격적(?)으로 사용하고자 한다.(곧 20.04 가 나오지만, 충분히 안정적인 것을 선호한다)

기존 usb 장치(외장 디스크등)를 연결해제할때 보통 umount 하고 그냥 해제했던 것 같다.

[117729.890464] usb 3-4: USB disconnect, device number 4
[117729.892984] sd 6:0:0:0: [sde] Synchronizing SCSI cache
[117730.175652] sd 6:0:0:0: [sde] Synchronize Cache(10) failed: Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK

 

그런데, 위 처럼 - usb disconnect 메시지 뒤에 좀 꺼림직한 에러가 보인다.

그래서 혹시나 해서 몇가지 방법을 해봤다.

위 처럼 "안전하게 드라이브 제거(S)" 로 제거했다.( 윈도우 등도 보통 이렇게 한다 )

메시지를 보니.

[118750.327348] sd 6:0:0:0: [sde] Synchronizing SCSI cache
[118750.596130] sd 6:0:0:0: [sde] Synchronize Cache(10) failed: Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
[118750.660631] usb 3-4: USB disconnect, device number 7

 

메시지는 동일하게 나온다. 차이점은 USB disconnect 가 에러 다음에 나온다.

위 방법이 맞는 듯 하긴 하다. (에러 메시지가 원래 나오는 것인지는 모르겠다)
그외 eject 등도 해봐도 동일.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 18.04 이 기본 gdm 을 사용하는데, 외부 접속(vnc)시 이상현상이 있어 lightdm 으로 바꿨다.

그런데, 바꾸고 나서, 부팅시 자동로그인이 동작을 하지 않는다.

다음의 설정을 확인한다.

/etc/lightdm/lightdm.conf

[SeatDefaults]
autologin-user=USERID
autologin-user-timeout=0
user-session=ubuntu

맨 위의 한 줄만 있을 것이다. (2~3 줄을 추가해준다)

추가후 재부팅해보니 정상동작한다.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 18.04 를 설치하고, 설정을 클릭하면 계속 로그인 화면으로 간다.

다음과 같은 에러메시지가 보인다.

[  427.780983] nouveau 0000:01:00.0: gr: FECS falcon already acquired by gr!
[  427.780986] nouveau 0000:01:00.0: gr: init failed, -16
[  427.933496] nouveau 0000:01:00.0: gr: FECS falcon already acquired by gr!
[  427.933528] nouveau 0000:01:00.0: gr: init failed, -16
[  427.958113] nouveau 0000:01:00.0: gr: FECS falcon already acquired by gr!
[  427.958145] nouveau 0000:01:00.0: gr: init failed, -16
[  427.982312] rfkill: input handler enabled

 

해당 메시지는 기본 그래픽 드라이버가 이상이 있는 듯 하다.

nvidia gtx 1050 을 쓰는데, 소프트웨어 업데이트 > 추가 드라이버  에서  독점 드라이버로 바꿔준다.

바꿔주고 재부팅 해주면, 정상적으로 설정 으로 간다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투에서 윈도우의 공유폴더를 연결해 사용하고 있다.
그동안 별 이슈 없이 사용했던것 같다.

그런데, 윈도우 업데이트 후에 다음과 같은 에러가 발생하면서 연결이 안된다.

mount error(127): Key has expired

mount 할때 guest 계정으로 연결하는데, 윈도우 업데이트 후에 해당 계정설정이 바뀐 듯 하다.

위 그림은 조치한 후에 화면이다.   활성계정 부분이 "예" 로 되어 있어야 하는데, "아니오" 로 되어 있었다.

net user guest /active:yes

로 활성화 해준다.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

간단한 golang 어플을 도커 이미지를 사용해서 배포하려 한다.(배포는 kubernetes 를 사용한다)

docker hub 등 온라인 방식으로 해도 되지만, microk8s 의 registry 서비스를 이용한다.
방법은 그리 어렵지 않다.  https://microk8s.io/docs/registry-built-in 를 참조 한다.

일종의 registry 서비스를 로컬에 가동하여 도커 이미지를 등록 하는 것이다.

1. 이미지 빌드

$ sudo docker build . -t localhost:32000/prod-api:registry

Sending build context to Docker daemon  4.608kB
Step 1/6 : FROM golang:latest
latest: Pulling from library/golang
dc65f448a2e2: Pull complete 
346ffb2b67d7: Pull complete 
dea4ecac934f: Pull complete 
8ac92ddf84b3: Pull complete 
7ca605383307: Pull complete 
f47e6cebc512: Pull complete 
530350156010: Pull complete 
Digest: sha256:fe6b1742d48c4d6d360c6fac1e289e8529aaab924fa0e49a330868be50c0f2f4
Status: Downloaded newer image for golang:latest
 ---> 297e5bf50f50
Step 2/6 : RUN mkdir /app
 ---> Running in 2a6795d86353
Removing intermediate container 2a6795d86353
 ---> 541dbb10344e
Step 3/6 : ADD . /app/
 ---> c60e6e741cb4
Step 4/6 : WORKDIR /app
 ---> Running in 5de0b590c65d
Removing intermediate container 5de0b590c65d
 ---> 24c7788d1b8e
Step 5/6 : RUN go build -o main .
 ---> Running in 5e44a7f53909
Removing intermediate container 5e44a7f53909
 ---> 56462a496eac
Step 6/6 : CMD ["/app/main"]
 ---> Running in bdde4584ff89
Removing intermediate container bdde4584ff89
 ---> dbba71be4f83
Successfully built dbba71be4f83
Successfully tagged localhost:32000/prod-api:registry

등록체크 

$ sudo docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
localhost:32000/prod-api   registry            dbba71be4f83        5 minutes ago       810MB

 

2. 이미지 registry 등록

$ sudo docker push localhost:32000/prod-api

The push refers to repository [localhost:32000/prod-api]
44006ff06569: Pushed 
203febf79d4f: Pushed 
2ec821486852: Pushed 
cae11887bc90: Pushed 
729c3ac48990: Pushed 
8378cd889737: Pushed 
5c813a85f7f0: Pushed 
bdca38f94ff0: Pushed 
faac394a1ad3: Pushed 
ce8168f12337: Pushed 
registry: digest: sha256:7c8fe99287f680f23e611c4113834c5c8343aa102a49a3584a65888205604609 size: 2420

 

3. kubernetes 로 배포

배포코드는 https://github.com/yusufkaratoprak/kubernetes-gosample 를 참조

$ vi config/deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prod-api-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prod-api
  template:
    metadata:
      name: prod-api
      labels:
        app: prod-api
    spec:
      containers:
      - name: prod-api-dep
        image: localhost:32000/prod-api:registry
        ports:
        - containerPort: 8090

$ vi config/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: prod-api-service
spec:
  selector:
    app: prod-api
  ports:
    - name: http
      protocol: TCP
      port: 8070
      targetPort: 8090
  externalIPs:
    - 192.168.0.111

배포/가동 : kubectl apply -f config/

$ curl 192.168.0.111:8070  으로 체크

추후 LoadBalance 로 설정 - golang 파드는  replicas 로 여러대로 동작

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

쿠버네티스를 세팅하면서 최종 하려는 목적은  mongodb + golang API 앱 이다.

몽고디비 replica set + golang 도 pod 를 5개 이상 띄워서 REST API 를 서비스하려는 것이다.

현재는 쿠버네티스 로컬에 microk8s 로 간단하게 세팅해서 구성중이다.
다른 언어로 해도 되는데, go 로 굳이 하려는 이유는 딱히 없지만, 이유를 찾아보자면
go 가 클라우드 친화적(?)이라고 느껴서 이다. (쿠버네티스 도 아마 go 로 많이 작성되어 있는 것으로 알고 있다)

작성하려는 것은 대단한 앱은 아니지만, 개발환경을 구성해야 한다. 간단히 정리해본다

1. golang 설치 - 우분투(kubernetes) / MacOS (개발환경)
https://golang.org/doc/install 를 참조하면 된다.
특이한점은 GOPATH 라는 특이한 규칙(?)이 있다.
gopath 를 설정하고 ( work / workspace 등 - 본인이 편한대로 ) , 소스 src , bin 등의 규칙이 있다.
개인 소스를 src/github.com/{깃헙아이디}/프로젝트명  형태로 작업한다.
src/github.com/1day1/hello 같은식

git run github.com/1day1/hello 

형태로 실행할 수 있다.

2. vscode 설치 - MacOS (생략)
https://code.visualstudio.com/download

3. vscode 에서 확장/플러그인 extension 설치 (go 로 검색)
https://code.visualstudio.com/docs/languages/go

4. 추후 vscode 에서 필요한 설정 ( 아마도 sftp 연결 / git 세팅 등이 될 듯 하다)

keyboard shortcut 설정

  • reveal in Side bar : cmd + shift + R 
  •  

go 확장 - gopath 설정 ( setting.json )

  • "go.gopath": "/Users/onedayone/go-apps"

 

[필요하면 계속 추가]

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

지난번 kubernetes 에서 mongodb replica set 세팅 하는 방법을 정리했다. ( https://blog.1day1.org/598 )

그런데, 이제 mongo db 내부에서 replica set 을 설정한다.

(kube => pod 접속)
$ kubectl exec -ti mongod-0 -c mongod-container bash
   or
$ kubectl exec -ti mongod-0 -- bash

(pod 내에서 mongo console 실행)
# mongo

처음에는 다음처럼 나온다.

rs.status()
{
	"ok" : 0,
	"errmsg" : "no replset config has been received",
	"code" : 94,
	"codeName" : "NotYetInitialized"
}

리플리카 셋을 설정한다.

config = {_id: "MainRepSet", version: 1, members: [
       { _id: 0, host : "mongod-0.mongodb-service:27017" },
       { _id: 1, host : "mongod-1.mongodb-service:27017" },
       { _id: 2, host : "mongod-2.mongodb-service:27017" },
       { _id: 3, host : "mongod-3.mongodb-service:27017" }
 ]}
 rs.initiate(config)

초기 설정 후 관리계정을 만들어 준다.

use admin
db.createUser({user:"admin",pwd:passwordPrompt(),roles:[{role:"root",db:"admin"}]})

(사용은)
db.getSiblingDB('admin').auth("admin", passwordPrompt())

(수정)
db.updateUser("admin", {pwd:passwordPrompt()})

정상 세팅은 다음 처럼 나온다.

더보기

MainRepSet:PRIMARY> rs.status()
{
"set" : "MainRepSet",
"date" : ISODate("2020-02-20T08:39:06.434Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 3,
"writeMajorityCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-02-20T08:39:02.691Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-02-20T08:39:02.691Z"),
"appliedOpTime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-02-20T08:39:02.691Z"),
"lastDurableWallTime" : ISODate("2020-02-20T08:39:02.691Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1582187912, 3),
"lastStableCheckpointTimestamp" : Timestamp(1582187912, 3),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-02-20T08:38:32.108Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1582187901, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 3,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2020-02-20T08:38:32.690Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-02-20T08:38:33.290Z")
},
"members" : [
{
"_id" : 0,
"name" : "mongod-0.mongodb-service:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 805,
"optime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-02-20T08:39:02Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1582187912, 1),
"electionDate" : ISODate("2020-02-20T08:38:32Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "mongod-1.mongodb-service:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 44,
"optime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-02-20T08:39:02Z"),
"optimeDurableDate" : ISODate("2020-02-20T08:39:02Z"),
"lastHeartbeat" : ISODate("2020-02-20T08:39:06.193Z"),
"lastHeartbeatRecv" : ISODate("2020-02-20T08:39:05.256Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongod-0.mongodb-service:27017",
"syncSourceHost" : "mongod-0.mongodb-service:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "mongod-2.mongodb-service:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 44,
"optime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-02-20T08:39:02Z"),
"optimeDurableDate" : ISODate("2020-02-20T08:39:02Z"),
"lastHeartbeat" : ISODate("2020-02-20T08:39:06.187Z"),
"lastHeartbeatRecv" : ISODate("2020-02-20T08:39:05.581Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongod-0.mongodb-service:27017",
"syncSourceHost" : "mongod-0.mongodb-service:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "mongod-3.mongodb-service:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 44,
"optime" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1582187942, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-02-20T08:39:02Z"),
"optimeDurableDate" : ISODate("2020-02-20T08:39:02Z"),
"lastHeartbeat" : ISODate("2020-02-20T08:39:06.201Z"),
"lastHeartbeatRecv" : ISODate("2020-02-20T08:39:05.256Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongod-0.mongodb-service:27017",
"syncSourceHost" : "mongod-0.mongodb-service:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1582187942, 1),
"signature" : {
"hash" : BinData(0,"pHhOTNJaI3y8hvPOpgcOs9zJ7I8="),
"keyId" : NumberLong("6795445338166525955")
}
},
"operationTime" : Timestamp(1582187942, 1)
}


이후에 primary 에서 데이터를 등록하면 secondary 에 반영된다.

kubernetes 에서  delete / apply 등으로 새로 세팅하거나 했을때 기존 설정이 정상 동작 하지 않는 경우.
Primary 가 없거나 하는 경우.

Our replica set config is invalid or we are not a member of it

설정을 재등록(?) 해준다. 

conf = rs.conf()
rs.reconfig(conf, {force:true})

 

[추가] 몇몇 주요 명령

1. replica set 추가

rs.add("mongod-3.mongodb-service:27017")

2. sync 상태 보기

PRIMARY> rs.printSlaveReplicationInfo()

source: mongod-1.mongodb-service:27017
	syncedTo: Fri Feb 28 2020 02:56:26 GMT+0000 (UTC)
	0 secs (0 hrs) behind the primary 
source: mongod-2.mongodb-service:27017
	syncedTo: Fri Feb 28 2020 02:56:26 GMT+0000 (UTC)
	0 secs (0 hrs) behind the primary 
source: mongod-3.mongodb-service:27017
	syncedTo: Fri Feb 28 2020 02:56:26 GMT+0000 (UTC)
	0 secs (0 hrs) behind the primary 

3. 특정노드 에러메시지 (해결책 - 찾는 중)

PRIMARY> rs.status()
..
"stateStr" : "(not reachable/healthy)",
..
"lastHeartbeatMessage" : "Our replica set configuration is invalid or does not include us",
..

PRIMARY> rs.printSlaveReplicationInfo()
...
...
source: mongod-0.mongodb-service:27017
	syncedTo: Thu Jan 01 1970 00:00:00 GMT+0000 (UTC)
	1584736418 secs (440204.56 hrs) behind the primary 

원인이 뭘까? 특별히 비정상 종료 같은 것은 없던 것 같은데. config 서버를 따로 두지 않는 문제일까?

  해결책 1) 해당 pvc / pod 를 삭제한다 => 쿠버네티스 가 알아서 재가동 하면서 정상 처리 된다. (옳은 방법인지는 의문)

kubectl delete pvc mongodb-persistent-storage-claim-mongod-0
kubectl delete pod/mongod-0

 

 

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

몽고디비를 서비스에 도입해보려고 테스트 중이다.

여러가지 설치 방법이 있지만, 쿠버네티스 를 활용해서 하려한다.

1. microk8s 를 설치한다.
https://microk8s.io/docs/ 설치방법은 너무 쉽다.
몇몇 서비스를 활성화 시킨다.

microk8s.enable dns storage ingress registry

 

microk8s.kubectl 은 링크걸어두면 편하다.

sudo ln -s microk8s.kubectl /snap/bin/kubectl

or

sudo snap alias microk8s.kubectl kubectl

 

2. 몽고디비 replica set 설정을 사용한다.
https://maruftuhin.com/blog/mongodb-replica-set-on-kubernetes/ 의 설정을 참조

$ openssl rand -base64 741 > ./replica-set-key.txt
$ kubectl create secret generic shared-bootstrap-data \
  --from-file=internal-auth-mongodb-keyfile=./replica-set-key.txt

3. 설정을 사용해 몽고디비를 가동한다.

kubectl apply -f replica-sets/mongodb-rc.yaml

다음과 같은 명령으로 상황을 모니터링 하면 좋다.

kubectl get all -o wide
kubectl get pvc -o wide
kubectl get nodes -o wide

정상적으로 실행되지 않고, pending 으로 시간이 걸린다면, 삭제했다가 다시 실행해본다.

(전체 삭제)
kubectl delete -f replica-sets/mongodb-rc.yaml

(pvc 삭제)
kubectl delete pvc mongodb-persistent-storage-claim-mongod-0

 

정상적이라면 다음처럼 나온다.

kubectl get pods -o wide

NAME       READY   STATUS    RESTARTS   AGE     IP            NODE            
mongod-0   1/1     Running   0          6m45s   10.1.32.109   192.168.77.20   
mongod-1   1/1     Running   0          6m43s   10.1.70.10    kube-mk8s       
mongod-2   1/1     Running   0          6m42s   10.1.32.110   192.168.77.20   
mongod-3   1/1     Running   0          6m41s   10.1.70.11    kube-mk8s       

 

4. mongo 접속하여 replica set 설정한다. (세부 설정은 별도로 정리 예정)

(kube => pod 접속)
kubectl exec -ti mongod-0 -c mongod-container bash

(pod 내에서 mongo console 실행)
mongo

 

해당 replica set 의 몽고 서버에 접속하기 위해 dns 설정이 잘 되었는지 확인해본다.

kubectl apply -f https://k8s.io/examples/admin/dns/busybox.yaml
kubectl exec -ti busybox -- nslookup mongod-0.mongodb-service

설정을 확인해서 정상적으로 pod IP 가 나와야 한다.

이런식으로 나오면 실패.

Server:    127.0.0.53
Address 1: 127.0.0.53

nslookup: can't resolve 'mongod-0.mongodb-service'

아래처럼 나와야 정상.

Server:    10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local

Name:      mongod-0.mongodb-service
Address 1: 10.1.32.109 mongod-0.mongodb-service.default.svc.cluster.local

 

 

[추가]

혹시 microk8s 설치시 다음과 같은 메시지나 나오고 진행이 안된다면.

error: too early for operation, device not yet seeded or device model not acknowledged

snapd 를 삭제했다가 다시 설치해본다.

sudo apt purge snapd
sudo apt install snapd

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

쿠버네티스 를 사용하기 위해 알아보고 있다. (이미 대세가 된지 오래)

단순 개발환경에 적용하기 보다. 실무에 적용하기 위해 연습/학습 단계 부터 단계적으로 해본다.

현재로서는 다음 단계로 진행예정.

1. microk8s (우분투 기반) - 로컬
2. kubeadm , kubespray 등을 이용한 세팅 - (클라우드 or 실서버)
3. helm 등의 패키지(?) 개념의 설치/세팅

아직 용어도 익숙치 않아서 시간이 걸리겠지만, 하나씩 해보면서 목표를 이뤄나간다.

장비도 노트북(그램) , 서버(PC) , 클라우드(D.O , GCP) 등 여러환경에서 해본다.

 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

LG 그램을 사용중이다. 윈도우가 기본 설치가 되어 있지만, 개발에 필요해서 우분투를 설치해서 사용하려 한다.

USB 부팅(설치) 디스크를 만들고 부팅을 시도 했는데. 다음과 같은 에러가 나면서 부팅이 되지 않는다.

Failed to open \EFI\BOOT\NULL - Not Found
Faild to load image \EFI\BOOT\NULL : Not Found
start_image() returned Not Found

위와 같은 에러가 나는 경우. USB 설치 디스크의 해당 위치를 보면

grubx64.efi
mmx64.efi
bootx64.efi

등의 파일이 있는데.

난 grubx64.efi 를 복사해서 NULL 파일로 이름을 바꿔줬다. (NULL.efi 가 아닌 그냥 NULL )

다시 재부팅을 해보니 정상적으로 부팅화면으로 넘어갔다.

ps. 여러가지 그램 바이오스 세팅을 바꾸는 방법이 구글링 하면 나오는데.
난 위 방법으로 했다. (secure boot : disable 등 몇가지는 설정했다.)


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  1개가 달렸습니다.
  1. 트러블슈팅이무서운사람 2020.05.25 10:31
    감사합니다 덕분에 부팅 문제 해결했습니다.
secret

예전 부터 가상서버를 써왔다. 국내/해외. 본격적으로 써온지도 5년이 넘었다.
(특히 해외업체들의 서비스가 괜찮아 많이 쓰고 있다. https://blog.1day1.org/564 에 소개를 하기도 했다)

국내업체들은 아직 불편한 부분이 많다.
그 사이 AWS 도 국내 서비스도 하고 있다.

이미 AWS 쪽은 대세가 된 kubernetes , 위 업체중 디지털오션 만 공식(?) 지원하고 있다. 서비스로서 지원.

디지털오션 - 쿠버네티스 서비스

벌쳐 / 리노드는 아직 공식 지원하지는 않는다. 별개로 kubernetes 설치해서 사용할 수는 있다.

디지털오션은 서비스로 지원해서, 쿠버네티스 클러스터를 구성하기 쉽도록 했다.(마스터는 별도 비용을 받지 않는 듯 하다)
노드 비용만 계산이 되는 듯 하다.(10$ 플랜부터 사용가능)

런칭한지는 좀 되었지만, 아직 실 사용은 해보지 않아 언급하진 않았다.
조만간 서비스를 쿠버네티스 기반으로 옮길것을 검토중이라 정리 차원에서 글을 쓴다.

도입하면서 나오는 이슈들을 정리할 생각이다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

사용중인 시스템에 HDD 관련 커널에러가 발생하였다.

보통 여러가지 이유가 많지만, 이런 에러가 생기면 그냥 AS 보낸다.

그런데, 이번에는 디스크 관리를 보니 배드섹터 1 개 라고 나온다. 애매하네...
당장 시스템 교체할 하드가 마땅치 않아, AS 보내기전 잠시라도 계속 사용해야 하는 상황.

배드섹터를 기록(?)해서 에러가 발생하지 않도록 하고자 한다.

커널 에러 메세지는 이런식이다. (에러 종류에 따라 , 메시지가 다르다 )

[348303.307873] ata4: EH complete
[348305.814497] ata4.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[348305.814503] ata4.00: irq_stat 0x40000008
[348305.814508] ata4.00: failed command: READ FPDMA QUEUED
[348305.814517] ata4.00: cmd 60/08:c0:78:3b:76/00:00:31:01:00/40 tag 24 ncq 4096 in
                         res 41/40:00:78:3b:76/00:00:31:01:00/40 Emask 0x409 (media error) <F>
[348305.814521] ata4.00: status: { DRDY ERR }
[348305.814524] ata4.00: error: { UNC }
[348305.815611] ata4.00: configured for UDMA/133
[348305.815625] sd 3:0:0:0: [sdc] tag#24 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[348305.815630] sd 3:0:0:0: [sdc] tag#24 Sense Key : Medium Error [current] [descriptor] 
[348305.815635] sd 3:0:0:0: [sdc] tag#24 Add. Sense: Unrecovered read error - auto reallocate failed
[348305.815639] sd 3:0:0:0: [sdc] tag#24 CDB: Read(16) 88 00 00 00 00 01 31 76 3b 78 00 00 00 08 00 00
[348305.815643] blk_update_request: I/O error, dev sdc, sector 5124799352

눈에 띄는 부분은 마지막줄.

blk_update_request: I/O error, dev sdc, sector 5124799352

배드 섹터가 생긴 것으로 보인다(다른 에러로 인해 나오는 경우도 있을 수 있을 듯 하다 - 입출력시 에러이니 다양한 원인이 있을 수 있음)


보통의 절차는 badblocks 로 배드섹터 위치를 찾고, fsck 로 배드섹터 표시를 해서 디스크사용시 해당 섹터를 건드리지 않도록 한다.

badblocks -v /dev/sdc1 > badsectors.txt

위 처럼 배드섹터 위치를 찾는다 ( /dev/sdc1 등은 본인의 HDD 명칭으로 쓰면 된다)
오래걸린다 (디스크 크기가 크면 클수록)
검색 범위를 정할 수 있는지 모르겠다. 2930265542

그 다음은 배드섹터를 파일시스템에 기록(?) 한다.

fsck.ext4 -l badsectors.txt  /dev/sdc1

fsck 명령은 본인의 파일시스템에 맞게 적절하게 바꿔준다. (fsck.ext2 , fsck.ext3 등)

끝.

이게 영구적인 해결방법은 아닐 듯 하다. 배드섹터가 계속 생길 수 있으니, AS 보내기 전까지 버텨보자.


추가

badblocks 가 너무 오래 걸린다. (거의 2시간 넘게 했는데, 반도 못했다. 6시간 넘게 걸릴 듯 하다 - 하드디스크 속도에 따라 차이가 있을 듯 함. 해당 HDD 는 7200 rpm )

badblocks -v /dev/sdc1 > badsectors.txt
Checking blocks 0 to 2930265542
Checking for bad blocks (read-only test): ^C

Interrupted at block 1102688832

block 범위를 정해서 다시 해본다. ( 전체가 5860533168 이다. 대략 배드섹터 위치는 5124799352 )

Disk /dev/sdc: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt

위 처럼 한 블럭이 512 byte ( badblocks 의 기본값은 1024 - 그래서 0 to 2930265542 으로 나옴)
그런데, 512 로 하면 다음과 같은 메시지가 나온다.

badblocks: 정의한 자료형으로 쓰기엔 너무 큰 값 invalid end block (5860531087): must be 32-bit value

기본값 1024 로 해야겠다. 대신 뒤의 블럭을 반으로 나눠서 범위를 정해야 겠다. ( 2562399676 가 된다)
그러고 보니 기본값을 fsck 쪽과도 맞춰야 할까? 파일시스템마다 다를려나? ( 4096 이 기본값인가? 5124799352 x 0.125 = 640599919 이 된다.)

# badblocks -b 4096 -v /dev/sdc1 640600000 640590000 > badsectors.txt
Checking blocks 640590000 to 640600000
Checking for bad blocks (read-only test): done                                                 
Pass completed, 1 bad blocks found. (1/0/0 errors)
# cat badsectors.4096.txt 
640599663

뒤의 숫자는 640599919 의 대략 범위 위치를 {last block} {first block} ( 끝 / 시작 값을 약간 여유 잡고 지정한다 )
실제 블록 위치는 640599663 로 확인된다.

fsck 를 해보니.

# fsck.ext4 -l badsectors.4096.txt /dev/sdc1
e2fsck 1.42.13 (17-May-2015)
/dev/sdc1: Updating bad block inode.
Pass 1: Checking inodes, blocks, and sizes

Running additional passes to resolve blocks claimed by more than one inode...
Pass 1B: Rescanning for multiply-claimed blocks
Multiply-claimed block(s) in inode 110625949: 640599663
Pass 1C: Scanning directories for inodes with multiply-claimed blocks
Pass 1D: Reconciling multiply-claimed blocks
(There are 1 inodes containing multiply-claimed blocks.)

File { ================== 에러난 파일 =================== } (inode #110625949, mod time Wed Jun 26 16:35:07 2019) 
  has 1 multiply-claimed block(s), shared with 1 file(s):
    <The bad blocks inode> (inode #1, mod time Sat Jul 27 21:54:33 2019)
Clone multiply-claimed blocks<y>? yes
Error reading block 640599663 (Attempt to read block from filesystem resulted in short read).  에러 무시<y>? yes
강제로 덮어쓰기<y>? no
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
/lost+found not found.  Create<y>? no
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong for group #0 (23517, counted=23516).
Fix<y>? yes
Free blocks count wrong for group #19549 (65535, counted=0).
Fix<y>? yes

/dev/sdc1: ***** FILE SYSTEM WAS MODIFIED *****

/dev/sdc1: ********** WARNING: Filesystem still has errors **********

/dev/sdc1: 36792/183148544 files (0.0% non-contiguous), 632810807/732566385 blocks

위에서 Clone multiply-claimed blocks? yes => 이 부분을 그냥 n 로 건너뛰는게 좋다. 어차피 에러로 복사(clone) 실패 하는 듯 함.

일단 위와 같이 조치했는데, 잘 된 것인지는 좀더 체크해봐야 겠다. ( 특히 block 의 위치가 맞게 처리된 것인지... )


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

기존에 vmware 로 세팅되어 사용중이던 windows xp 를 다른 호스트머신 으로 옮기려고 한다.

그런데, vmware player 가 설치가 안된다. (windows 10 의 문제인지?)
계속 알아볼까 하다가, 그냥 virtualbox 로 옮기기로 해본다. (요즘 PC 성능이 좋아져 vm 의 성능차이가 없을 듯 하여)

예전(몇년전)에 virtualbox 를 vmware 로 해봤을때는 잘 안되었는데, 그 반대를 해보려는것.

결론은 잘 이전 된다.

그 설명을 정리해본다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우분투 업그레이드를 했다. (간만에)

버전은 4.4.0-143-generic

Virtualbox 가  커널이 바뀌어서 모듈을 재 컴파일 해야 한다.

# sudo /sbin/rcvboxdrv setup

Stopping VirtualBox kernel modules ...done.

Uninstalling old VirtualBox DKMS kernel modules ...done.

Trying to register the VirtualBox kernel modules using DKMSERROR: Cannot create report: [Errno 17] File exists: '/var/crash/virtualbox-5.0.0.crash'

Error! Bad return status for module build on kernel: 4.4.0-143-generic (x86_64)

Consult /var/lib/dkms/vboxhost/5.0.40/build/make.log for more information.

 ...failed!

  (Failed, trying without DKMS)

Recompiling VirtualBox kernel modules ...failed!

  (Look at /var/log/vbox-install.log to find out what went wrong)

에러가 난다.  Virtualbox 특정 버전만 그런것인가? ( 5.0.40 )


일단 커널 버전을 내렸다. 4.4.0-143 은 걸러야 겠다.


ps. 다른 서버 4.4.0-142 버전은 괜찮은 것 같다.

필요하면 설치

apt-get install linux-image-4.4.0-142-generic


[추가 - 03/21]

새버전 4.4.0-144 버전이 올라와서 해보니, 동일 이슈.


[추가-04/11]

새버전 4.4.0-146 까지도 나왔는데, 동일

virtualbox-5.2 / virtualbox-6.0 도 해봐도 에러.

https://askubuntu.com/questions/1126721/4-4-0-143-generic-upgrade-16-04-vmware-no-loger-working/1126950

=> 모듈 소스를 수정해서 조치를 해야할 듯 하다. (아직 안 해봄)  => 이건 vmware 기준 소스 수정


[추가-04/16]

virtualbox 의 vboxdrv 쪽의 소스를 수정하는 방법

virtualbox 6.0.4 를 기준으로 설명 ( 커널 버전은 4.4.0-146 으로 설명)

참조 - /usr/src/linux-headers-4.4.0-146-generic/include/linux/mm.h 의 get_user_pages 의 인수가 다른 문제

vboxdrv 의 소스를 수정해준다.

/usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c 에서 get_users_pages 부분을 수정해주면 된다.

1122                                 /*fWrite,*/                 /* Write to memory. */

virtualbox 버전에 따라 소스 라인 위치는 다를 수 있다.


수정 후  /sbin/vboxconfig  로 다시 모듈을 만들어 준다.

정상 동작까지는 확인 했는데, 이 방법은 위험성이 있으니, 사용하면서 이상현상이 있으면 추가로 글을 남기도록 한다.



WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

맥에서 npm (node) 를 어떤 방법으로 설치하는게 좋은가?

보통 homebrew , nvm 을 주로 쓰는 듯 하다.

맥용 기본 패키지 매니저 같은 것은 없나? ( 우분투의 apt 같은 ..)


https://nodejs.org/ 에서 다운로드해서 설치해도 되는듯 하다.


# 일단 nvm 을 시도해본다.

1. 설치 : https://github.com/creationix/nvm

2. curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

3. 위 명령으로 설치하려고 하니 git 이 없다고 한다. xcode 설치하겠는지 물어본다. (일단 설치 진행.)

4. 다시 위 명령으로 실행. 설치OK. 터미널을 재실행해 보면 된다. (nvm --version 체크)


# node(npm) 을 설치한다.

1. nvm install node   ( nvm install stable 도 동일한 듯 하다)

2. npm install -g @vue/cli  => 최종 하려던 것 - 잘 설치된다.


# vue cli 3 버전 특징.

vue cli ui 를 지원한다. 

$ vue ui  

위 명령을 내리면 브라우저가 뜨면서 설정을 UI 로 할 수 있다. ( 기존  명령창에서 하던 것을 브라우저로 가능)
> 참조 : https://medium.com/@changjoopark/vue-cli-ui-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-9ef31fea4f40




WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

일본 아마존 상품을 체크중이다.



쓸만한, 뽐뿌 가 될만한 제품을 블로그에 올릴 생각이다.




affiliate 가입을 해보는데, 계속 잘린다.

왜 그럴까? 


개인블로그라서 그런가?

좀더 체크해서, 원인을 찾아봐야 겠다.



WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

딱히 돈이 남아돌아서 투자를 알아본 것은 아니었다.

P2P 투자도 그렇고, 암호화폐 투자도 그렇고 요즘 어떻게 돌아가는지 개념을 알아보자는 차원이었다.

(일단 뭐 투자할 돈이 없어서 ㅜㅜ )


[암호화폐 투자]

예전 10여년전이던가 아니 더 되었던가. 주식을 소액투자 해봤던 적이 있다.

요즘 가상화폐(암호화폐) 소액투자를 해보면서 비슷한 감정(?)을 느낀다.

신경이 많이 쓰이는 투자방법이다.  나에겐 좀 안 맞는다.(심장이 쫄깃해진다. 오래 못산다.)

그냥 적금처럼 넣어놓고 신경 안 쓰면 좋겠는데, 물론 그런식으로 할 수 있지만 맘이 그렇게 하기 쉽지 않다.


투자방식도 다양각색 - 업비트, 바이낸스 등 거래소등을 활용한 트레이딩.

POW, POS 등의 채굴을 통한 코인 획득.

블록체인 기반 사업을 위한 초기자본 모집하는 ICO 방식.


나는 암호화폐 트레이딩 보다는 주로 블록체인의 기술적인 관점에서 파악을 해보려고 하고 있다.

그래서 비트코인은 크게 관심이 없다. 블록체인 2세대(?)에 속하는 이더리움 , 네오 , 퀀텀 같은 플랫폼형 코인에 관심이 간다.

그래서 관련 플랫폼을 활용한 ICO 도 몇번 해봤다.(물론 소액)

이익보면 좋고, 안 되도 뭐... (속이 쓰리긴 하겠지만)


[P2P 투자]

가상화폐 투자보다는 좀더 안정(?)적인 방식은 P2P 투자인 듯 하다. 내 성향에도 딱 맞는 것 같다.

세팅 해놓고 신경 안 쓸수 있다.


여러 업체가 있겠지만, 써본 토스 와 렌딧이 마음에 든다.

토스는 원래 간편송금이 핵심인데, 부가(?)서비스로 부동산 소액투자, P2P투자(8퍼센트) 등이 있다. ( 펀드도 있는데, 내 성향이 아니라서 패스)

모바일 서비스 기반으로 투자 접근성이 편하다. 금액도 무리하지 않게 상한선이 있다.(투자 업체당 천만원)


렌딧도 P2P투자 인데, 토스의 8퍼센트 보다는 마음에 든다. ( 다만, 모바일 앱이 없는게 흠)

렛딧 추천코드 링크이다. ( https://goo.gl/tMaQ5F - 기승전 추천코드 )

추천코드 타고 가기 싫으면 그냥 https://lendit.co.kr 으로 가서 가입/투자 하시면 됩니다.


적금 넣는 대신 소액을 꾸준히 투자하기 좋은 것 같다. 수익률도 만족할 정도. (암호화폐 투자는 수익률은 좋지만 고위험)


투자시 고려할 것은 감당할 수 있는 범위내의 자금만 투입하라는 것.( 전부 없어도 지장이 없을정도 금액 )


3월 2일 추가 1)  2월 27일자로 투자금이 2천만원 으로 상향 조정되었다. 이쪽 계통으로 투자금이 몰리고 있다는 증거이려나? )

3월 2일 추가 2) 8퍼센트 쪽 웹버전도 괜찮다. 가입하면 토스쪽 투자내역을 세부적으로 볼 수 있다.  https://8percent.kr/



WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ubuntu 에서 squid3 설정.

- 설정은 간단하다.

- curl 을 이용해 해당 proxy 서버를 사용할때 주의점.


# 설치

apt-get install squid3

끝. 쉽다.


# 설정

/etc/squid3/squid.conf 을 설정

(원래 파일은 복사하고, 새로 생성한다)

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT


# digest

auth_param digest program /usr/lib/squid3/digest_file_auth /etc/squid3/squid3.digest.passwd

auth_param digest realm proxy

acl sq_digest proxy_auth REQUIRED

http_access allow sq_digest


# basic

auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/squid3.basic.passwd

auth_param basic realm proxy

acl sq_basic proxy_auth REQUIRED

http_access allow sq_basic


cache deny all


http_port 4128


#http_port 3128

coredump_dir /var/spool/squid3


refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

진한 부분이 추가한 부분이다. 기본파일에는 http_access 관련 설정이 있는데 삭제했다.


# 포트 변경

그리고 추천하는 부분은 기본포트인 3128 을 다른 포트로 바꾸길 권장한다.
언제나 그렇듯이 공격 대상이 될 수 있다. (ssh 도 필수로 바꾸는 것이 좋다. 22 -> 다른 포트)


# 캐시 비활성화

cache deny all 

캐시를 비활성화 했는데, 필요하면 삭제 또는 주석처리한다.


# 인증 모드

인증 모드는 digest 와 basic 이 있는데 설정은 위와 같다. 동시에 써도 되는지는 모르겠다.

암호파일 생성은 htpasswd / htdigest 를 사용한다.

사용법은

htpasswd -c /etc/squid3/squid3.basic.passwd {username}

htdigest -c /etc/squid3/squid3.digest.passwd proxy {username}

암호화는 digest 방식을 추천한다.


모두 설정이 완료되었으면 재시작해서 바뀐 설정을 적용한다.

service squid3 restart




# curl 에서는 다음처럼 사용한다. ( php 기준 설명 )

php curl 은 아쉽게도 digest 모드를 아직 지원안하는 듯 하다.

$proxyserv = '123.123.123.123:4128' ;
$proxyauth = 'username:password';


curl_setopt($ch, CURLOPT_PROXY, $proxyserv );

curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth );

위와 같이 써준다.

curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST ); 

위 옵션이 되면 좋겠는데, 아쉽게도 현재는 안된다.( 현재는 CURLAUTH_BASIC , CURLAUTH_NTLM 만 지원)





WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret