studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  1. Linux Settings

홈서버 트러블슈팅

재부팅이나 종료할 때 꺼지지 않거나 한참 걸리는 이슈

홈서버를 새 기기에 옮겨서 복구한 다음부터 좀 이상한 이슈가 생겼음. 서버를 내리거나 재부팅할 때 엄청 오랜 시간이 걸리는 것. 처음엔 부팅에 오래걸리는줄 알았는데 그게 아니었음. 내려가는데 엄청 오랜 시간이 걸리고 있었음.

이것을 확인하기 위해 우선 다시 재부팅을 한 다음 journalctl -b -1 명령어로 확인해봄

확인해보니 현재 홈서버에서 사용 중인 home-assistant docker container가 내려가질 않아 docker daemon도 못 내려가고 있었고 docker daemon이 못 내려가기 때문에 강제종료할 때까지 매우 긴 시간을 기다리고 있었던 것으로 확인되었음.

home-assistant container를 내리기 위해 docker kill 과 같은 명령어들을 시도해보았으나 아무 효과가 없음.

최후의 수단으로 sudo ps aux | grep containerd-shim | grep $CONTAINER_ID 명령어로 containerd-shim 프로세스를 찾아낸 다음 containerd-shim을 kill해서 docker stop 이 먹히게 된 것까진 확인함

그 다음 다시 container를 재시작하려 하였으나 port already bind 에러로 실패하는 것을 확인

다시 프로세스를 확인해보니 home-assistant process가 아직 살아있는 상태였음. kill -9 역시 당연히 먹히지 않는 상태. 특이한 점이라면 프로세스의 stat이 Ds 였다는 것. 확인해보니 process가 D에 빠지는 것은 I/O 대기하고 있는 상태로 다른 어떤 일도 할 수 없는 상태라는 뜻이었음. 그래서 심지어 kill까지 무시하고 있었음. 보통은 빠른 시간 안에 I/O가 완료되어 R(Run)/S(Sleep)으로 돌아가야 정상인데 home-assistant process는 한참동안 D인 것을 보아 뭔가 문제가 있었음.

이러한 경우는 보통 어떤 잘못된 드라이버가 깔려있거나, 이슈가 있는 NFS 또는 원격 파일시스템에 접근 시도하고 있거나, 문제가 발생한 스토리지에 접근 중이거나 하는 경우가 많음. D상태에 빠져있는 프로세스를 종료하려면 이러한 문제가 생긴 파일시스템, 스토리지 등을 정상 상태로 회복시켜 I/O가 완료되게 하거나 아니면 포기하고 시스템을 재시작하는 수 밖에 없음. 다만 내 경우엔 시스템을 재시작하더라도 매우 오랜 시간이 걸린다는 문제가 있었음.

그래서 좀 더 정확한 정보를 알아야했는데 이건 프로세스의 wait channel을 확인하는 것으로 가능했음. ps -o pid,wchan $PID 명령어를 실행해보니 hci_sock_bind 라고 하는 것에 멈춰있는 것을 확인할 수 있었음. 확인해보니 블루투스에 관련된 함수임. home-assistant에서 bluetooth 연결을 사용하고 있는데 이 부분이 문제가 된 모양. 원래 서버에서는 퀄컴의 QCNFA765 wifi/bluetooth chipset을 사용하고 있었는데 새 서버에선 미디어텍의 칩셋으로 바뀌면서 문제가 발생한 것으로 추측함.

sudo apt purge -y bluez && sudo apt install -y bluez

위 명령어로 bluez를 삭제하고 다시 설치해준 다음부터는 문제가 해결되었음.

Previous홈서버 백업 및 복구기NextKubernetes

Last updated 19 days ago