현장에 넣을 장비를 사무실에 두고 시험하고 있었다. 다음 주에 현장으로 나간다고 했다.
Table of contents
Open Table of contents
나가면 못 하는 것이 있었다
장비가 현장에 들어가면 손대기 어렵고 ssh 로 붙는 것 말고는 방법이 없다.
원격으로 되는 것과 안 되는 것을 나눠 봤다.
원격으로 되는 것
소프트웨어 갱신
로그 확인
설정 변경
원격으로 안 되는 것
선 연결 확인
센서 교체
전원 재투입
통신 모듈 교체
위쪽은 ssh 로 나간 뒤에도 할 수 있으니 급하지 않은데 아래쪽은 손으로 해야 하는 것들이다.
남은 며칠이 이 장비를 자유롭게 다룰 수 있는 마지막 기간이었다. 그 안에 아래쪽을 다 확인해야 했다.
목록을 만들었다
나가기 전에 볼 것을 적었다.
[ ] 센서 4종 전부 값이 나오는가
[ ] 통신이 끊겼다 붙었을 때 자동으로 재연결되는가
[ ] 전원을 껐다 켜면 자동으로 시작되는가
[ ] 저장 공간이 찼을 때 어떻게 되는가
[ ] 시간이 안 맞을 때 어떻게 되는가
[ ] 원격 접속이 되는가
[ ] 원격으로 갱신이 되는가
일곱 개였고 목록으로 만들지 않으면 급한 것부터 하다가 몇 개를 빠뜨린다.
세 개가 안 됐다
전원을 껐다 켜니 프로그램이 안 떴다.
$ systemctl is-enabled collector
disabled
disabled 였다. 그동안 손으로 띄우고 있었으니 현장에서 정전이 나면 그대로 멈춘다.
$ systemctl enable collector
둘째는 저장 공간이 찼을 때였는데 fprintf 가 실패하면서 프로그램이 죽었다.
if (fprintf(fp, "...") < 0) {
/* 죽지 않고 넘어간다. 로그를 못 써도 수집은 계속한다 */
log_dropped++;
}
fprintf 가 음수를 돌려주면 세어 두고 넘어가게 했다. 로그를 못 쓰는 것과 수집을 못 하는 것은 무게가 다르다.
셋째는 NTP 가 안 맞을 때였는데 자료가 미래 시각으로 저장돼서 동기가 될 때까지 저장을 미루게 했다.
검증 — 실제로 그 상황을 만들기
목록에 적고 눈으로 보는 것으로는 이 셋이 안 나왔고 실제로 그 상황을 만들어야 나온다.
전원은 코드를 뽑았고 저장 공간은 dd 로 만든 큰 파일로 채웠다.
$ dd if=/dev/zero of=/data/fill bs=1M count=2000
dd 로 2기가를 채워 df 가 거의 100퍼센트를 가리키게 해 놓고 돌렸다. 통신은 랜선을 뽑았다 꽂았다.
코드를 읽어서는 전원이 언제 끊길지를 정할 수 없다. 만들어 보니 셋이 나왔는데 눈으로만 봤으면 일곱 개가 전부 통과로 보였을 것이다.
원격으로 되는 것도 확인했다
나간 뒤에 쓸 것이니 그것도 지금 봐야 했다.
$ ssh -p 22 root@<장비주소> 'uptime'
사무실 망에서는 uptime 이 잘 돌아왔는데 현장 망에서도 되는지는 다른 문제였다.
현장 담당자에게 물어보니 밖에서 ssh 로 못 들어온다고 했고 장비가 나가는 방향만 열려 있었다.
/* 장비가 주기적으로 서버에 붙어 명령을 받아 가게 바꿨다 */
그래서 장비가 주기적으로 서버에 붙어 명령을 받아 가는 구조로 바꿨다. 나가기 전에 알아서 다행이었고 나간 뒤에 알았으면 손댈 방법이 없었다.
결과 — 넘긴 미확인 목록
기간이 부족해서 못 한 것도 있었다.
확인 못 한 것
- 영하 환경에서의 동작 (사무실에서 못 만든다)
- 3개월 이상 연속 가동 (기간이 부족하다)
- 센서 4종을 동시에 붙였을 때 (센서가 2개뿐이다)
셋을 적어서 넘겼는데 조건을 만들 수 없거나 시간이 모자란 것들이었다.
못 한 것을 안 적으면 목록에 있는 것이 전부 확인된 것으로 여겨진다. 그러면 나중에 그쪽에서 문제가 났을 때 왜 안 잡혔는지부터 따지게 된다.
나간 뒤에 실제로 나온 것
두 달 뒤에 문제가 하나 났는데 센서 4종을 동시에 붙였더니 하나가 값을 안 줬다.
적어 둔 셋 중 하나여서 예상하고 있던 자리라 원인을 빨리 찾았다.
I2C 주소가 겹치는 센서가 있었는데 사무실에서는 두 개만 붙여 안 겹쳤다. 적어 두지 않았으면 같은 결론에 닿는 데 훨씬 오래 걸렸을 것이다.
정리
- 시험할 수 있는 기간이 정해져 있으면 그 안에 다 확인한다
- 나간 뒤에 원격으로 되는 것과 안 되는 것을 먼저 나눈다
- 손으로 해야 하는 것부터 남은 기간에 배치한다
- 확인할 것을 목록으로 만들지 않으면 급한 것만 하다 빠뜨린다
- 눈으로 보지 말고 전원을 뽑고
dd로 공간을 채워 상황을 만든다 systemctl is-enabled가disabled인 것은 뽑아 봐야 드러난다- 원격 접속이 현장 망에서도 되는지를 나가기 전에 확인한다
- 못 한 것을 적어서 넘기지 않으면 전부 확인된 것으로 여겨진다
- 적어 둔 자리에서 문제가 나면 원인을 빨리 찾는다