반응형
반응형

이번 주에 단자함에 공유기 하나를 넣음으로써, 드디어 홈 네트워크가 완성되었다.

이제 우리 집의 IPTV를 제외한 모든 장비는 공유기 하나에서 DHCP로 내려주는 Private IP로 유/무선 모두 접근이 가능해졌는데, DNS의 경우 무료 DNS인 duckdns.org를 가져다 쓰고 있었고, 결국 NAT IP타고 내부 네트워크로 들어오기 때문에, 현재 상황은 도메인으로 접근 시 내부 -> 외부 -> 내부와 같이 비효율적인 통신 환경이 만들어진다.

 

DNS 쿼리 시에도 private ip를 가져올 수 있도록 하려면, 공유기에 자체 구축한 DNS 서버를 연결하면 해결이 된다. 물론 장비가 많지 않은 경우면 그냥 개별 장비에 hosts에 박아서 쓰면 되지만, 완벽한 방법은 아니라고 생각한다.

 

결론으로 DNS 서버 구축을 위해 여러 솔루션들을 찾아봤는데, Technitium 이라는 DNS 서버가 간단하게 docker image 올리고, config 정도만 volume으로 연결해두면, Admin 페이지를 통해 각종 세팅을 할 수 있도록 제공을 하고 있었다.

docker hub에서도 100개가 넘는 STAR를 받았고, 업데이트도 자주 해주어서, 이걸로 해보는 것으로 결정!

 

https://hub.docker.com/r/technitium/dns-server 에 작성된 README를 읽다보면, docker 설치 방법에 친절하게 docker-compose.yml까지 제공을 해준다.

 

https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml

 

GitHub - TechnitiumSoftware/DnsServer: Technitium DNS Server

Technitium DNS Server. Contribute to TechnitiumSoftware/DnsServer development by creating an account on GitHub.

github.com

그대로 복붙하면, 컨테이너가 뜨고, 5380 포트로 admin 페이지에서 이것저것 세팅을 조정할 수 있다.

 

본인 같은 경우는, duckdns.org 관련 도메인을 입력하면 사설 IP가 반환되기를 원했기 때문에, 아래와 같이 ZONE을 먼저 추가를 해주었고, A 레코드만 사설 IP로 입력하여 사용하고 있다.

 

이제 공유기의 WAN 설정 쪽으로 가서 DHCP에 지금 세팅한 DNS 서버의 IP를 넣어주면, 유 / 무선 기기에 DNS 쿼리 시 지금 세팅한 DNS 서버를 바라보게 된다.

(DNS 서버 구축 한 장비가 원격에 있는 경우 53번 포트 TCP / UDP를 열어야 한다.)

 

router.asus.com도 가끔 오락가락 하길래, 192.168.0.1로 아예 박아넣었더니 이후에 못찾는 일이 없어졌다.

실무 환경에서도 써먹으면 좋을만한 Technitium 추천!

 

혹시 DNS 쿼리가 잘 안되는 분들을 위해.. 일반적인 DNS 같은 경우 3600초를 Default로 TTL (캐싱으로 이해하면 쉬움)이 지정되어 있어서, 즉시 이용이 필요한 경우 아래와 같은 방법으로 DNS를 Flush 해주어야 한다.

Windows

cmd창을 열고 ipconfig /flushdns를 입력한다.

 

MAC

터미널을 열고, sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder 입력한다.

 

모바일 기기

wifi off후 on하고 다시 연결

반응형
,
반응형

최근 뭐때문인진 모르겠지만, 갑자기 전기세가 많이 나오고 있어서, 집에서 관리중인 서버도 자는 시간에는 rtcwake를 이용하여 절전모드로 해두고, 혹시나 긴급하게 봐야할 경우에는 wol을 이용하여 제어하는 것으로 계획을 세웠다.

 

rtcwake

  • 자는 시간이 00시부터 08시정도 이므로, 자정에 8시간동안만 절전을 활성화하면 되기 때문에 crontab을 사용하면 된다.
  • 0 0 * * * /usr/sbin/rtcwake -m mem -s 28800

 

wol (wake on lan)

  • 일단 서버가 연결되어 있는 공유기에서 wol을 지원해야 하고, 랜카드에서도 wol을 지원하는지 확인해야 한다.
  • 공유기는 모델명을 확인하여, 각 제조사 사이트에서 찾아봐야 하며, 랜카드의 경우 하드웨어에서는 지원한다고 해도, OS단에서 disable 되어 있는 경우가 있다.
  • 먼저 ifconfig 를 이용하여, 내 랜카드가 어떤 것인지 확인하고, ethtool 명령어를 아래와 같이 입력하여 wol이 설정되어 있는지 본다. 아래에서는 enp3s0이 내 랜카드라고 가정하였고, wol을 지원하고 있다면, Wake-on 란이 g 일것이고, 지원하지 않으면 d일 것이다.)
    • $ /sbin/ethtool enp3s0 
      
      #
      Settings for enp3s0:
              Supported ports: [ TP MII ]
              Supported link modes:   10baseT/Half 10baseT/Full 
                                      100baseT/Half 100baseT/Full 
                                      1000baseT/Full 
              Supported pause frame use: Symmetric Receive-only
              Supports auto-negotiation: Yes
              Supported FEC modes: Not reported
              Advertised link modes:  10baseT/Half 10baseT/Full 
                                      100baseT/Half 100baseT/Full 
                                      1000baseT/Full 
              Advertised pause frame use: Symmetric Receive-only
              Advertised auto-negotiation: Yes
              Advertised FEC modes: Not reported
              Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                                   100baseT/Half 100baseT/Full 
                                                   1000baseT/Half 1000baseT/Full 
              Link partner advertised pause frame use: No
              Link partner advertised auto-negotiation: Yes
              Link partner advertised FEC modes: Not reported
              Speed: 1000Mb/s
              Duplex: Full
              Port: MII
              PHYAD: 0
              Transceiver: internal
              Auto-negotiation: on
              Supports Wake-on: pumbg
              Wake-on: g
              Current message level: 0x00000033 (51)
                                     drv probe ifdown ifup
      #
  • 만약 Wake-on이 d로 되어 있다면 아래 명령어로 활성화 후 다시 확인해본다.
    • $ /sbin/ethtool -s enp3s0 wol g
  • 다만, 이렇게 명령어로 설정한 경우 재부팅 시에는 적용이 되지 않기 때문에, /etc/network/interface 파일을 열어서 두 줄을 추가해주어야 한다.
    • $ vi /etc/network/interface
      
      # 가장 하단에 아래 두 줄 추가
      post-up /sbin/ethtool -s enp3s0 wol g
      post-down /sbin/ethtool -s enp3s0 wol g

 

반응형
,
반응형

우선 아래의 블로그에서 많은 도움을 받았다.

lifeinprogram.tistory.com/18

 

MacOS에서 시스템 폴더에 접근하기 / 시스템 무결성 보호(SIP)/ Operation not permitted / csrutil disable / csru

MacOS 에서 시스템 폴더에 접근하여 파일을 생성하거나 디렉토리를 만들려고 하니 "Operation not permitted" 라는 메세지가 뜨면서 실행이 안됩니다. MacOS 에서 시스템 폴더에 접근하여 파일을 생성하

lifeinprogram.tistory.com

 

관리하는 Mac이 Ruby / Gem으로 패키지를 관리하는데, gem install / bundle update 든 하려고 하면, 계속 /usr/bin 하위에 권한이 없다고 뱉어내는 현상이 있어서, 일단 가장 먼저 찾아지는 SIP를 Recovery Mode로 진입해서 꺼보았다.

 

그런데도 뭔가 해결이 안되는 느낌이 있었는데, mount를 이용해서 Write 권한까지 주어야 하는 것인줄은.. 저 블로그에서 알게되었음.

 

이거 한줄로 모든게 해결이 되었다.

$ sudo mount -uw /

 

왠지 그동안 문제 있던 것들도 다 이 문제가 아니었나 싶을 정도로, 업데이트 / 설치 모두 깔끔!

xcode를 이용한 빌드 때문에 쓰는거지.. 정말 MAC은 서버용으로는 적합하진 않은 것 같다.

반응형
,
반응형

회사에 보안프로그램이 워낙 많고, ACL 관리가 철저하다보니, 갑자기 관리중인 머신의 SSH 포트와 VNC 포트가 내려가는 참사가 벌어졌다.

 

재택중이라 출근하신 분에게 sshd만 수동으로 올려달라고 부탁했고, 터미널에서 확인해보니 launchctl을 이용해서 sshd가 안올라가는 것으로 확인함..

 

그래서 기존 sshd.plist를 copy해서 내가 필요한 부분만 짤라서 구성해보기로 했다.

 

내 요구사항은 아래와 같았다.

1. ssh 접근이 되어야 함.

2. 장비의 전원을 뽑았다 켜도 ssh 접근이 되어야 함.

 

결론은 아래와 같이 plist를 구성했고, 정상동작하는 것을 확인했다. 

...
<dict>
  <key>Label</key>
  <string>com.sshd.alternative</string>
    <key>RunAtLoad</key>
    <true/>
  <key>Program</key>
  <string>/usr/sbin/sshd</string>
  <key>StandardErrorPath</key>
  <string>/tmp/sshd.alternative</string>
</dict>
...

 

이후 Label에 지정한 string을 이용해서 아래와 같이 컨트롤하면 된다.

$ launchctl start | stop com.sshd.alternative

 

희한한건 보안업데이트 든 뭐든 업데이트하면 원상 복귀됨.. 이유를 알 수 없다. 장비 문제인가?

반응형
,
반응형

사용자 계정으로 잘 돌던 스크립트가, 재부팅 시 서비스를 동작하게 하기 위해 root로 계정을 옮겼더니,

fastlane unlock-keychain 동작 시 키체인을 못찾겠다고 에러를 뱉었다.

 

인증서 자체를 기존 사용자 계정의 키체인에 등록했기 때문에, 당연한 결과라고 생각했고,

root에 인증서를 등록하는 것은 미련한 행동이라 생각하여, unlock-keychain에 argument가 없을지 검색해보았다.

 

역시나 있었다!

docs.fastlane.tools/actions/unlock_keychain/

 

unlock_keychain - fastlane docs

unlock_keychain Unlock a keyc

docs.fastlane.tools

 

path에다가 원래 등록했던 keychain의 경로를 명시해주면 된다.

대략 아래와 같은 경로다.

# Fastfile
...
unlock_keychain(
  path: '/Users/xxx/Library/Keychains/login.keychain-db',
  password: 'abcde12'
)
...

 

바꿔주니 잘 되는군!

반응형
,
반응형

homebrew를 통해서 jenkins를 설치했고, 빌드 머신이 될 놈이기 때문에, 리부팅이 되어도 문제 없도록 만들어야하는 니즈가 있다.

 

homebrew를 이용하면 아래와 같은 명령어로 손쉽게 시작 / 중지 / 재시작이 가능하고,

내부적으로 launchd를 활용해서 부팅 후 로그인 시 서비스 재시작도 어느정도 관리를 해준다.

# 서비스 시작
$ brew services start jenkins-lts

# 서비스 중지
$ brew services stop jenkins-lts

# 서비스 재시작
$ brew services restart jenkins-lts

 

근데 내가 필요한건, 머신이 재부팅 된 후에, 유저 로그인을 하지 않아도 리눅스처럼 서비스가 동작하는 것이 목표였다.

 

여러 자료를 찾아보니, MAC에는 LaunchAgents와 LaunchDaemons라는 놈들이 있는데..

Homebrew에서 제공하는 brew services 키워드의 경우 일반 유저로 서비스 실행 시 LaunchAgents라는 놈을 이용하고,

root 권한을 획득한 후에 실행하면 LaunchDaemons라는 놈을 이용하는 것으로 보였다.

 

이 두 개의 차이는 뭐일까?

 

LaunchAgents라는 놈의 경우 서비스를 재시작 해주긴하지만, 유저가 로그인했을 경우(ssh를 통한 로그인은 해당이 안됨)에 약속된 서비스를 재시작 해준다.

 

LaunchDaemons라는 놈은 우리가 흔히 알고 있는 리눅스에서의 서비스 처럼, 머신이 재부팅되어도 재시작을 해준다.

 

결론은 아래와 같은 명령어를 이용하면, 내가 원한 방향이 만들어지게 된다.

# 서비스 시작
$ sudo brew services start jenkins-lts

# 서비스 중지
$ sudo brew services stop jenkins-lts

# 서비스 재시작
$ sudo brew services restart jenkins-lts

 

하지만... 귀찮은 일이 하나 남았다.

 

서비스 실행하는 계정 자체가 변경이 되었기 때문에, jenkins처럼 유저별로 데이터를 저장하는 특성이 있는 경우,

이를 옮겨주어야 한다. (아.. 이런거 때문에 역시 docker를 써야해;;)

 

MAC 장비 스펙이 낮아서 standalone으로 설치를 해보았는데, 사실 docker를 쓰면 고민할 필요가 없는 문제이긴하다.

 

그 와중에 다행인건, 기존에 쓰던 유저 하위의 .jenkins 폴더 내용을 통째로, root로 복사했더니 잘 동작한다!

반응형
,
반응형

본인은 일반적으로 업무환경이 Windows PC가 주가 되고, OSX가 설치된 장비는 빌드머신 혹은 R&D용도로 사용을 하는 편이다. 

 

그렇기 때문에, 자주 파일 / 폴더 등을 옮겨야하는데, 사내 보안이 워낙 엄청나게 철저하기 때문에, 메일 등을 이용해서 하나하나 손수 옮기곤 하다보니, 자괴감이 들던 중 아래와 같은 생각을 하게 됨.

 

1안 : MAC에 smb 서버를 올려볼까?

2안 : 윈도우에 공유폴더 생성하고, MAC에서 mount해서 쓰면 굳이 옮길 필요가 없지 않을까?

 

2안이 좀 더 간단해보여서 시도해보았고, mac에서 mount 관련 명령어를 다양하게 제공하고 있어서, 충분히 가능하였다.

 

아래와 같은 절차로 진행하면 됨.

 

1. 윈도우 환경에서 OSX와 동기화할 폴더 하나를 공유폴더로 생성하고, 특정 유저가 접근할 수 있도록 만든다.

(이건 검색하면 많이 나오므로 과정은 생략)

 

2. 맥에서 터미널을 이용하여 해당 폴더를 Mount한다.

// 패스워드에 특문이 포함된 경우 escape가 필요하다. (url encoding 형태면 적합)
$ mount_smbfs //{계정}:{패스워드}@WindowsPC명/경로 OSX경로

 

이제 MAC이든 Windows든 해당 폴더에만 파일을 두면, 어디서든 접근할 수 있게 되었다. (편안)

 

재부팅하면 왠지 풀릴거 같은데, 리눅스처럼 /etc/fstab 같은게 있지 싶은데, MAC을 끌일이 거의 없으므로 이건 일단 패스

반응형
,
반응형

이번에 m1 칩셋이 출시되면서, 맥 제품들 가격군은 내려가고 성능도 좋아졌는데 굳이 기존 2017년도 구형 맥 장비를 초기화하고 테스트를 해달라는 요청이 있어서, ruby / gem을 이용해서 fastlane을 설치하다가 발생한 이슈를 정리해보기로 했다.

 

파일들만 대충 백업하고, 공장초기화를 진행했고, fastlane에서 제공하는 공식 설치 가이드(https://docs.fastlane.tools/getting-started/ios/setup/)를 참고해서 진행을 했다.

 

xcode-select 키워드를 이용한 Command line Tools는 정상적으로 진행되었는데,

이후에 gem 명령어를 사용하는 부분이 문제가 있었고, 로그를 분석해보니 ruby/config.h를 못찾는 문제가 있었다.

결국 뭔가 환경적인 문제라는 이야기인데...

 

OSX가 최근 Bigsur로 올라가게 되면서, 대부분의 라이브러리가 그 기준을 따라가게 된 것이 문제라는 생각이 들어, 구글링을 해보다보니, 심볼릭 링크로 연결만 만들어주면 해결이 되는 것으로 보였다.

(맥은 역시 어렵다.. ㅠㅠ)

 

결론은, 아래와 같은 부분에 대해 조치가 필요하다.

// 이 경로에 보면, universal-darwin20만 있을텐데, 우리는 universal-darwin19를 만들어줘야 한다.
$ cd /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0

// universal-darwin19라는 이름으로 링크 걸기
$ ln -s universal-darwin20 universal-darwin19

 

이후에 gem을 이용한 모든 설치 및 업데이트가 정상화된 것 처럼 보였다.

하지만, 명령어 창에 fastlane을 입력하면 아무것도 안나왔고, 이 부분도 조금 살펴보니 /usr/bin 폴더에 cp나 ln을 사용할 수 없는 것이 원인이었다.

 

해결방법은 복구모드로 들어가서, SIP라는 애를 disable 시키면 된다고는 하는데.. 맥에서 괜히 enable을 default로 해둔것이 아닌가 싶어서, 환경변수로 해결하기로 함.

 

환경변수는 대략 아래처럼 만들어주면 된다. 

CI툴이나 기타 솔루션에서 fastlane을 이용할 계획이 있다면, 가급적 root에 설정하는 것이 좋음.

(해당 툴에서 명령어 실행할 계정을 명시할 수 있다면 굳이 안해도 됨)

$ cd ~
$ vi .bash_profile

# .bash_profile

# fastlane 버전은 적용시점마다 다를 수 있으니, 본인 환경에 맞게 수정해야 함.
export PATH=${PATH}:/Library/Ruby/Gems/2.6.0/gems/fastlane-2.176.0/bin/

 

반응형
,
반응형

이번에 WD 10TB를 구매하면서, 기존에 예비용으로 쓰던 USB 2TB 외장하드의 데이터를 10TB로 옮기는 작업을 주말간 진행했다.

 

그동안 모았던 자료들은 대부분 RSS 통해서 받아진 자료이고, 관리를 안하다보니 2TB를 거의 꽉 채운 데이터를 옮겨야 했었고, GUI 환경은 아무래도 대용량 처리에 적합하지 않으므로 rsync로 옮기기로 결정!

 

데이터가 적을 경우에는 Rsync를 쓰던 cp를 쓰던 mv를 쓰던 사실 문제가 안된다.

하지만, 우리에겐 시간이 없기 때문에 최대한 고효율을 뽑아야 한다.

 

그러던 중 머리에 떠오른 것은 Rsync가 Single Thread이지만, xargs를 통해 Multiple Thread처럼 처리를 하면 좀 더 효율적이지 않을까하는 생각이 들었다. (결국은 Disk-iops의 한계가 있으므로 Thread를 적정량 설정해야 하겠다.)

 

아래와 같은 커맨드를 이용해봤다.

Source Directory의 목록을 ls로 가져오고, xargs를 통해 rsync와 연계하는데 쓰레드는 5개로 세팅

 

$ ls /root/2T/Video/TV | xargs -I {} -P 5 -n 1 rsync -avz --progress /root/2T/Video/TV/{} /root/10T/Video/TV/

 

이 명령어를 실행하고, 프로세스 목록을 보면, 서브프로세스들이 생성되며 작업을 잘 나눠서 처리하는 것을 볼 수 있다.

앞으로도 효율적인 대용량 데이터 처리에 참고해야겠다.

반응형
,
반응형

내부에 기괴한 시스템에서 POST Method밖에 지원을 못한다고해서, nginx에서 html을 업로드하고 405 method not allowed 에러를 우회할 수 있는 방법에 대해 알아보았다.

 

405에러가 발생할 경우 무시하고 uri를 돌려줘라라는 의미인데, 의외로 잘 동작한다.

location / {                
    root   /var/www/html;
    index  index.html index.htm;
    error_page 405 = $uri;
}

 

파라미터 주고 받는거 전혀 없는 static page를 POST Method로 굳이 호출해야 하는 것도 좀 이상하긴하지만, 사내에 기괴한 시스템 등에서 POST Method밖에 허용을 못하겠다고 한다면, 이렇게 해결하면 된다.

반응형
,
반응형