블로그 이미지
포도알77
IT 방랑기

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Notice

 라즈베리파이(raspberry pi)에서 serial to ttl usb 컨버터 장치를 통해 통신을 하기 위해서는 장치명이 아닌 포트위치가 필요하다.

 

 포트 위치는 /dev/ttyUSB1과 같이 디렉터리이며, 여기서 USB0, USB1...의 장치는 연결되는 USB 장치의 개수에 따라 달라진다.

 

 물론 이 포트 위치는 제조사와 장치 명칭을 통해서 고정하여 쓸 수 있다. 하지만 장치는 언제나 동일 기능을 수행하는 다른 장치로 변경할 수 있으므로 나는 Device ID를 이용해서 해당 장치의 포트를 알아내는 방식을 선택했다.

 

 

 우선 크게 동작하는 방법을 알아보면,

 

1) Device 입력 및 해당 device가 존재하는지 확인

    configuration파일을 통해서 장치ID를 입력 받을 것이므로, 입력받은 ID 값이 실제 라즈베리파이에서 인식된 USB 장치인지 확인한다.

 

2) ls /dev/ttyUSB* 명령을 통하여 모든 포트 위치 확인

    실제 시리얼 통신이 가능한 장치들은 /dev/ttyUSB[0-9]+와 같이 포트 명을 부여 받기 때문에, 모든 포트명을 읽어온다. 더 나은 방법이 있는 것 같긴한데 자세히 안찾아봐서 모르겠다.

 

3) grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent를 통하여 장치 device id와 일치하는 포트 확인

    명령어를 실행해보면 알겠지만, 해당 포트에 연결된 장치 정보를 담고 있다. 이 정보에서 PRODUCT열의 값을 가져오면 장치 ID가 포함되어 있는 것을 알 수 있다.

 

이 세개의 플로우를 통해서, 입력된 device id와 매칭되는 포트값을 찾아낸다.

 

 

 코드는 파이썬3으로 작성되었다.

 

 


## lsusb 명령어를 통해서 device id를 가진 장치가 있는지 확인
deviceID = "1234:1234"
result = ""
try:
    result = subprocess.check_output("lsusb | grep "+deviceID,
                                  shell=True,
                                  stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e :
    result = ""
    
if(len(result) == 0):
    print("장치가 발견되지 않았습니다.")
    exit(1)

# 모든 포트 위치 검색
try:
    result = subprocess.check_output("ls /dev/ttyUSB*",
                                  shell=True,
                                  stderr=subprocess.STDOUT)
    # 바이트 배열로 리턴되는 값을 문자열로 변경
    result = str(result)
    # 배열이 b'ABCD'의 형식이므로 앞, 뒤 불필요한 문자 제거
    result = result[2:len(result)-1]
except subprocess.CalledProcessError as e :
    result = ""

# 다수의 행이 반환되므로 개행문자로 문자열 분리
result = res.split('\\n')
found = False
for path in result:
    # 포트 패턴 정규식
    portPattern = re.compile("^/ttyusb[0-9]+$")
    if(portPattern.match(path)):
        #올라온 값이 포트값이면, 포트의 PRODUCT정보를 읽어서 장치값 비교
        try:
            result2 = subprocess.check_output("grep PRODUCT= /sys/bus/usb-serial/devices/"+path[4:]+"/../uevent",
                                          shell=True, stderr=subprocess.STDOUT)
            # 문자열로 변경
            result2 = str(result2)
            # 배열이 b'PRODUCT=1234/1234/100'과 같은 형식이므로 앞, 뒤 불필요 문자열 제거
            result2 = result2[10:len(result2)-1]
        except subprocess.CalledProcessError as e :
            result2 = "GGGG/GGGG\n"

        # 개행문자와 /으로 문자열 분리
        result2 = result2.split('\\n')[0].split('/')
        # 입력받은 device ID를 :으로 분리
        didHexList = deviceID.split(':')
        # 16진수로 변경하여 확
        if(int(result2[0],16)==int(didHexList[0],16) and
           int(result2[1],16)==int(didHexList[1],16)):
            print("장치의 포트를 찾았다.")
            found = True
            break
        

posted by 궁금한 포도알77
2019.03.21 08:20 리뷰

 이전에 내부망을 기가비트로 쓰기위해서 [컴퓨터] ip 타임 기가비트 랜카드 구매, 설치기 (WoL : Wake on Lan)포스트를 쓴적이 있다.

 

 

 

 마찬가지로 이 블로그의 서버를 돌리는 노트북의 랜카드도 기가비트로 바꾸기 위해서 USB 3.0 기가비트 랜카드를 구매하였다.  

 

 

 

 노트북은 ASUS G501JW인데 이상하리 만큼, 사양에 비해서 제공되는 유선랜카드는 USB2.0 100M 랜카드이다. 그래서 외부로 나가는 ip는 2.0 랜카드에 내부망에서 사용하는 랜카드는 이번에 구매한 기가비트 랜카드에 연결하였다.

 

 

 

 일단 구매한 제품은 넥시라는 회사에서 판매하는 제품으로 USB3.0과 기가비트 스펙이있다. 구매는 컴*존해서 했다. 가격이 싸서...  

 

 

 

 랜카드의 박스는 이렇게 생겼다. 



 

 

 박스의 후면에는 스펙이 적혀있다. 하위 호환도 되는 제품이라, USB2.0에 꼽아도 동작한다 대신 속도가 기가비트가 안나올 뿐이다.

 

  


 

 내용물을 빼보면, USB 랜카드만 있다.

 

 

 

  

 

 

 

 나름 두꺼운 선을 사용했고, USB 3.0이라 포트가 파란색이다.

 

  

  

 

 

 

 기가비트 지원 랜카드 답게 RJ45 8핀을 모두 사용한다.

 

   

 

 

 

 뒷면에는 간단히 모델명이 적혀있는 스티커가 부착되어 있다.

 



  

 

 

 

 

 랜카드를 USB에 연결하면 전원이 켜졌다는 의미의 빨간LED가 점등된다.

 


   

 

 

 

 그리고 랜선을 연결하면, 통신을 알리는 파란색 LED가 점멸한다.

 


  

 

 

 

 우분투에서 정상적으로 랜카드가 인식되었다. 이로서 이 노트북은 무선랜 1개와 USB2.0, USB 3.0 유선랜 3개를 사용하게 되었다.

 


  

 

 

 

 그리고 ifconfig를 확인하여 할당된 ip를 보면 정상적으로 내부 주소를 할당받았고

 

  

 

 

 

 마지막으로 DHCP에 핑을 날리면 정상적으로 받아온다.

 


  

 

 

 

 마지막으로 우분투에서 랜카드의 속성을 보면 1기가 (1000Mbps)로 연결된 것을 알 수 있다.

 

    

 

 

 

 대신 생각보다 발열이 조금 있는 편이다. 그리고 이 블로그의 서버를 이 노트북으로 이전하고 한 일주일이 지났는데 아수스에서 제공한 USB 2.0 랜카드의 LED가 나가버렸다.  

 

 

 

 조금 걱정되니 팬쿨러라도 달던지 아니면, 바람이 통하는 쪽으로 노트북의 위치를 바꿔야할 것 같다.

posted by 궁금한 포도알77
2019.03.19 08:43 운영체제/리눅스
까먹지 말자 


 Ubuntu를 설치하고, 가장 기본적으로 설치하는 openssh-server 이후, config 파일을 설정해야하는데, 지금까지 대충하다가 그냥 기록해두고 써먹으려고한다.


 대부분의 default 세팅이 그러하듯, 거의 수정할 것이 없다.   
sudo apt-get update
sudo apt-get install openssh-server --yes
sudo apt-get install vim --yes
sudo vim /etc/ssh/sshd_config


이후 sshd_config에서 설정해야 할 것은
RSAAuthoentication yes 
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication Yes


 여기서 RSA는 프로토콜 2가 아닌 1에서 쓰인다는데 일단은 열어뒀다.


 보안상 닫아야할 수도 Pubkey는 공개키 기반  접근으로 C9.io가 사용하는 방식이기 때문에 열어준다. 아마 기본이 열려있는 상태일것이다.  


 AuthorizedKeysFile은 키를 저장하는 곳인데, 우분투 설치시 ~/.ssh/authorized_keys 가 없을 수도 있다.(대부분 없다)


 그래서 만들어줘야 한다. 만약 AuthorizedKeysFile이 주석 처리되어있다면, 기본 위치가 %h/.ssh/authorized_keys이다. 


 PasswordAuthenticiation은 비밀번호를 입력하고 들어오는 방식, 기본적인 SSH 방식으로 끄면, 로그인 자체가 안된다. 



 아무튼 C9.io를 설정하려면 프로젝트 설정 화면에 사용자 이름과 포트, 그리고 기본 위치 입력창과 키값을 준다. 


 입력창은 적당히 입력하면 되고, 이제 문제는 키파일인데
sudo mkdir ~/.ssh
sudo vim ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/authorized_keys
이후 제공된 키 값을 authorized_keys에 복붙후 저장한다. 



그다음
sudo service ssh restart
하면 될것 같지만 안된다. 


 아무래도 c9.io는 그룹기반으로 접근하는 것 같은데 이렇게 해버리면, 소유자 문제로 아마 pubkey 인증 실패가 뜬다. 



 우선 정확한것은 모르겠지만 아래와 같이 소유자와 권한을 바꿔준다.   
sudo chmod 711 ~/.ssh/.

sudo chmod 700 ~/.ssh/..

sudo chmod 644 ~/.ssh/authorized_keys



이후 ls -al로 확인해보면, 아래와 같이 출력된다.    
drwx--x--x  2 root	root	. 
drwxr----- 21 계정	계정	..
-rw-r--r--  1 root	root	authorized_keys

  



 왜 나만 이렇게 해야하는지 모르겠다 다른사람들은 700, 600주면 된다던데.. 어려운 리눅스   그리고 만약 Node.js관련 오류가 발생한다면, node.js를 설치해주자.

sudo apt-get install node.js



posted by 궁금한 포도알77
2019.03.19 08:31 운영체제/리눅스
 다중 NIC(=네트워크 인터페이스 카드, 랜카드, RJ45...)에서 다중 Network를 사용할때 문제가 발생한다. 


 엄청 당연하게 랜카드가 여러개면, 해당 랜카드로 들어온 데이터를 당연히 그쪽으로 다시 보내는줄 알았지만, 그렇지 않단다. 


 대부분의 운영체제에서는 별도의 설정이 없으면, default gateway로 응답을 보낸다.  



 지금 내가 운영중인 서버 컴퓨터에는 NIC가 4개있고, 그중에서 1개는 공인 IP(고정), 나머지 1개는 내부망 라우터에서 제공하는 동적 IP를 적용했다. 

 근데 조금 특이한 환경이다. 

 우선 다른말로 하면, 내부망 IP Netmask가 2개이다. 192.168.0.X과 192.168.1.X처럼 

 [ 공인 동적 IP <=>  Router 1 <=> Router2 <=> Server #1 <=> 공인 고정 IP ] 

 당연히 Router 1에도 PC가 설치되며, Router2가 제공하는 사설망이 내부망이다.  



 즉, 서버 컴퓨터는 공인 IP(이하 111.111.111.111)과 Router2에서 할당된 사설 IP(192.168.1.2)을 동시에 가지며, 네트워크 설정 당시의 Subnetmask에 따라서 각각의 Gateway로 보낸다. 


 만약 내부망 구성을 라우터 1개로 했다면, 별로 고민을 안했을것이다. 하지만 이렇게 서로 다른 대역 (사설망)을 가지는 2개의 네트워크를 연결해야했기 때문에 Router1의 PC들과 Router2의 PC들은 통신할 수 없다. 


 서버에서 192.168.0.1로 보낸 데이터는 192.168.1.2의 Subnet(255.255.255.0)을 만족하지 못해서, 바로 공인 고정 IP를 타고 나가버린다.


 따라서 서버에 192.168.1.2로 오는 모든 192.168.0.X대역을 다시 192.168.1.2 게이트 웨이로 던져버린다. 


 그러면 자연스럽게 192.168.0.X 대역의 패킷도 다시 192.168.1.2의 게이트웨이를 타고 라우터 1의 대역으로 날아간다. 


 코드로는
sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.1

 즉 192.169.X.X에서 온 패킷은 마스크 255.255.255.0으로 확인후 192.168.1.X의 게이트웨이인 192.168.1.1로 보내버리는 것이다.  



 이렇게 하면 잘된다. 괜히 시간만 허비했다. 후.. 리눅스    



posted by 궁금한 포도알77
2019.03.18 08:32 리뷰
DB 서버용도로 구매한 DL385 G7서버에 드디어, 디스크를 설치할 때가 되었다. 


사실 DB 용량이 적지만, 나중을 위해서 Raid 1+0으로 구성했으며, 넉넉하게 1T로 구성했다.  


DL 385 G7 서버는 SFF 규격의 2.5 Sata 또는 SAS hdd만 연결되므로, 트래블스타 Z5K1 PMR로 구매했다. (시게이트 하드는 SMR 이슈로 인해서 패스)  


  

1. 하드 구경

요즘 하드디스크가 정말 작게 나온다. 깜짝놀랐다.   

 

   



정품 스티커와 정전기 방지 비닐에 포장되어있는 HGST Z5K1


   



디스크는 앞서 말한것 처럼 4개다




 



정말 얇다.






 SFF Tray(caddy)에 담아서 1~4번 베이에 연결했으며, 1,3(미러) 2,4(미러) 그리고 [1,3]-[2,4] 스트라이프의 1+0 레이드로 묶었다.



사실 레이드를 지원하는 서버면 정말 간단하게 레이드 구성이 가능하다. 



리눅스의 소프트웨어 레이드 구성할때는 정말 복잡하고, 시간도 오래걸렸는데.. 하드웨어 레이드는 바이오스 설정바꾸듯 손쉽게 세팅할 수 있다.



핫스왑을 지원하는 모델이라 하드가 깨지면, 그냥 새 하드를 넣기만하면 바로 리빌딩이 된단다. 근데 하드 깨진걸 어떻게 알지?..



2. 디스크 마운트 (우분투 16.04 LTS)

 아무튼 하드웨어 레이드든 혹은 소프트웨어 레이드든 논리 디스크 단위로 /dev/sd[a-z] 형식에 연결되어있을 것이다.   이제 이 디스크를 리눅스 포맷으로 변경해주고, 마운팅을 하면 된다.   


 [1] 하드 디스크 확인
sudo fdisk -l

 위 명령을 치면 Disk  /dev/sd[a-z]: 1.8TB, ...으로 정보가 출력된다. 여기서 연결한 디스크가 안나온다면, 디스크를 설치해야한다. (Raid를 다시 묶는 다거나)   


 [2] 파티션 생성
sudo fdisk /dev/sdb
n
p


p
w
 순서대로 입력하면 된다. n은 new partition을 만드는 것, p 는 primary, 엔터 3번은 파티션 개수, 시작 섹터 위치, 마지막 섹터 위치인데, 각각 기본값으로 1개, 2048, 디스크 끝이 입력된다. p는 현재 파티션을 보는것이고, w는 종료하는 명령이다.   


 [3] 포맷
sudo mkfs.ext4 /dev/sdb1
파티션을 만들고 나면 디스크 뒤에 파티션 번호가 붙는다. 기존 /sdb 디스크였고, 파티션을 하나 만들었다면, /sdb1 처럼 가만히 두면 포맛된다.     


 [4] UUID 확인

sudo blkid
 위 명령을 치면 논리 디스크의 고유 id가 나타난다. 자신이 위에서 만든 파티션의 UUID를 따로 저장해두자.


 형식은 /dev/sdb1: UUID="ddddddddddddddddddddddddddddddddddddd" TYPE="ext4"   



 [4] fstab 파티션 추가
sudo vi /etc/fstab
 위 파일을 열고 아래의 형식으로 파티션을 적어주면 된다. UUID=dddddddddddddddddddddddddddddddddddddd /마운트위치 ext4 default 0 0   



 [5] 마운트 위치 생성 및 마운트하기
sudo mkdir /마운트위치	
sudo mount -a
df -h

 당연히 마운트 위치는 마음대로다. 나는 db서버로 쓸것이기 때문에, /home/user/db 디렉터리를 만들고 해당 위치에 마운트했다. 다만 fstab과 위치가 동일해야 mount 명령시 자동 마운팅 된다.   



 [**] Trouble shooting 만약 리붓하였을때, 부팅이 안된다면 터미널을 열어서 fstab에서 추가한 문장을 주석처리하자. 처음에 바로 마운팅이 안되고, UUID가 변경되는 사태를 경험했다. 이후에는 제대로 동작하더라. 리눅스....ㅎ  



posted by 궁금한 포도알77
2019.03.11 08:27 운영체제/리눅스

 DB 서버에 RAID로 구성한 디스크를 준비하였으니, 이제는 데이터 베이스를 RAID 디스크에 옮겨서 보관해야한다.  


 OS 가 깨질 수도 있으니.. 항상 데이터 영역과 OS 영역은 구분하자. 데이터를 저장할 디스크의 마운트 위치가 /db라고하자.   



 [1] 기존 디비 저장 위치 확인  
sudo -u postgres psql
SHOW data_directory;

 먼저 sudo 명령으로 postgres 사용자를 실행한다. 



 이후 SHOW data_directory;를 입력하여 현재 위치를 확인한다. 아마도 아래처럼 나올 것이다.

       data_directory       
------------------------------
/var/lib/postgresql/9.5/main
(1 row)


  [2] postgresql 멈추기  

 이제 시스템상에서 postgresql 서비스를 멈추어 준다. 그리고 현재 상태를 확인하여, Stopped 상태인지 확인하자.
sudo systemctl stop postgresql
sudo systemctl status postgresql


  [3] 저장 공간 형식 카피
sudo rsync -av /var/lib/postgresql /db

 앞 위치는 기존 데이터 베이스 저장 위치, 뒤 위치는 새로운 저장공간. 여기서 끝에 / (슬래시)가 붙으면 안된다.  



 [4] 기존 conf 백업 백업은 필수다.

sudo mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.bak


  [5] conf에 위치 변경
sudo vi /etc/postgresql/9.5/main/postgresql.conf
 역시 편집기는 자신이 편한것 쓰자.   


 [6] data_directory 변경 
 postgresql.conf에서 data_directory를 찾아서 변경해주자.
.
.
data_directory = '/db/postgresql/9.5/main'
.
.


  [7] postgresql  재시작과 확인 
 postgresql을 재시작하고, 상태를 확인하자
sudo systemctl start postgresql
sudo systemctl status postgresql


이후에 처음과 똑같이 postgresql상에서 확인해보자.
sudo -u postgres psql
SHOW data_directory;



  [8] 마지막 정리

sudo rm -Rf /var/lib/postgresql/9.5/main.bak
sudo systemctl restart postgresql
sudo systemctl status postgresql
백업 파일은 지우고, 재시작하자.  


 끝났다.



posted by 궁금한 포도알77
2019.03.05 08:20 임시 노트

 웹 서버 개발시, 개인적으로 VM이나 AWS으로 서버를 생성한다. 그래야 나중에 뒷처리도 깔끔하고 향후 웹 서버 세팅시 바닥환경부터 필요한 패키지등등을 알 수 있기 때문이다.


 그러나, VM을 설치할 때마다 필요한 파일을 USB나 기타 방법으로 옮길 수는 없다.  그래서 사용한것이 VMware에서 제공하는 파일 공유.



 (1) 현재 작업중인 인스턴스의 Settings->Options ->Shared Folders 에서, Add를 눌러 추가할 수 있다.





(2) VM 웨어 세팅

 VM웨어에서 바로 세팅된다면, 그대로 사용해도 무방하다. 만약 에러가 발생하여, 리눅스상에서 폴더가 설정되지 않는다면 VM 툴을 재설치 해야한다.


 현재 사용중인 인스턴스탭을 우클릭하여, Reinstall VM tools를 선택하자.

그러면 리눅스상에서 DVD가 연결되며 설치파일이 나타난다.



(3) VMWareTools 설치

 DVD 폴더내의 VMwareTools-[버전].tar.gz를 적당한 폴더로 옮겨주고, 압축을 풀고 실행하자.

 tar zxpf VMwareTools-[버전].tar.gz
cd vmware-tools-distrib
sudo ./vmware-install.pl

 설치 스크립트를 실행하면, Yes/No로 질문한다. 그냥 엔터치면 된다.



(4) 마지막으로 모든 설치가 끝났다면,

ls /mnt/hgfs

 공유했던 폴더가 /mnt/hgfs에 연결되어있다. 만약 다른 프로그램을 위해서 해당 폴더를 이용해야 할 때, 하드 링크를 생성해서 연동하면된다.


 예를 들어 웹 서버(VM) - 호스트(파일) - 편집기(호스트) 형식일 때, 웹 서버가 호스트의 공유 파일을 읽어야 하는데, 이를 copy 명령으로 옮기면 아무런 의미가 없어진다.


 따라서 COPY명령이 아닌 웹 서버의 폴더에 하드링크로 공유폴더를 가져가면 모든게 해결된다.


 설정하고자 하는 폴더로 이동하여, 아래의 명령어를 설정하면 해당 폴더내에 공유 폴더가 하드링크된다.

ln -s /mnt/hgfs/폴더 ./


posted by 궁금한 포도알77
prev 1 next