USB-SSD 오류 시 자동 재부팅: 초보자를 위한 상세 가이드
나는 Bnanapi m5를 간단한 서버로 게시판등을 운영하고 있는데 어느 순간 먹통이 되는 경우가 발생해서 원인을 파악해 봤습니다.
원인은 USB로 연결된 SSD를 갑자기 인식할 수 없어서 먹통이 된 것이었습니다. 부팅하면 잘 작동이되는.. ㅡ.ㅡ (아마 전력부족인듯합니다. 3A로 공급하고 있는데 아답터가 이상인지...)
현재 제 Bananapi m5는 boot는 보드에 있는 emmc를 통해서 부팅되고, root는 usb로 연결된 ssd에 설치되어 있습니다.
이에 따라 먹통시 자동 재시작 스크립트를 emmc에 설치해서 지속 운영 가능하도록 제미나이의 도움 을 받아 설치 했습니다.
저와 같은 경우는 따라하시면 될 듯합니다.
왜 USB-SSD 자동 재부팅이 필요한가요?
리눅스 시스템, 특히 Ubuntu 환경에서 USB로 연결된 SSD를 메인 저장 장치(루트 파일 시스템)로 사용하는 경우, SSD에 문제가 생기면 시스템 전체가 멈추거나 부팅되지 않는 상황이 발생할 수 있습니다. 예를 들어, 다음과 같은 메시지를 보게 될 수 있습니다.
udisksd[1686]: Error probing device: Error sending ATA command IDENTIFY DEVICE to '/dev/sda'
이런 오류가 발생하면 시스템은 SSD에 접근하지 못하고, 결국 작동을 멈추게 됩니다. 이때 수동으로 재부팅하는 것도 방법이지만, 항상 시스템을 주시할 수 없는 상황에서는 자동 재부팅 기능이 필수적입니다.
(initramfs) 프롬프트가 보인다면?
시스템 부팅 시 Loading, please wait... (initramfs) 와 같은 메시지와 함께 (initramfs) 프롬프트가 나타난다면, 이는 시스템이 루트 파일 시스템(운영체제 파일이 있는 곳)을 성공적으로 마운트하지 못했다는 의미입니다. 이는 보통 다음과 같은 이유로 발생합니다.
- 파일 시스템 손상: SSD의 파일 시스템이 손상되었을 가능성이 가장 큽니다.
- 하드웨어 문제: SSD 자체의 물리적인 오류나 USB 연결 문제입니다.
- 부팅 설정 오류: 시스템 부팅 설정이 잘못된 경우입니다.
이런 상황에서는 시스템이 실제 운영체제로 진입하지 못하고 최소한의 초기 환경에서 멈춰버립니다.
(initramfs) 상태에서 임시 재부팅 방법
(initramfs) 프롬프트에서는 일반적인 리눅스 명령어가 제한적으로 작동합니다. 가장 간단한 재부팅 방법은 다음과 같습니다.
exit입력:(initramfs) exit이 명령은
initramfs셸을 종료하고 시스템이 다시 부팅을 시도하도록 합니다.reboot입력:(initramfs) reboot이 명령은 시스템을 즉시 재부팅합니다.
만약 자주 (initramfs) 프롬프트를 만난다면, 단순히 재부팅하는 것만으로는 해결되지 않습니다. 아래에서 설명할 자동 재부팅 스크립트 설정과 함께, SSD의 건강 상태를 점검하거나 교체하는 것을 고려해야 합니다.
USB-SSD 오류 시 자동 재부팅 설정하기
가장 안정적인 자동 재부팅 방법은 시스템 부팅에 사용되는 eMMC(내장 메모리)에 스크립트를 저장하고, 이 스크립트가 주기적으로 SSD의 상태를 확인하여 오류 발생 시 재부팅을 명령하는 방식입니다. 이렇게 하면 SSD에 문제가 생겨도 스크립트가 독립적으로 작동할 수 있습니다.
1단계: 커널 패닉 시 자동 재부팅 설정 (권장)
시스템의 심각한 오류(커널 패닉) 발생 시 자동으로 재부팅되도록 설정합니다. 이는 SSD 오류가 더 큰 시스템 문제로 이어질 경우에 대비하는 최후의 보루입니다.
설정 파일 열기:
터미널을 열고 다음 명령어를 입력하여 설정 파일을 편집합니다.sudo nano /etc/sysctl.conf내용 추가:
파일의 맨 마지막에 다음 두 줄을 추가합니다.kernel.panic = 60 kernel.panic_on_oops = 1kernel.panic = 60: 커널에 치명적인 오류가 발생하면 60초 후에 자동으로 재부팅하라는 의미입니다. (0으로 설정하면 즉시 재부팅됩니다.)kernel.panic_on_oops = 1: 사소한 커널 오류(OOPS)도 치명적인 오류로 간주하여 재부팅을 유도합니다.
설정 적용:
저장하고 나노 에디터를 종료한 후 다음 명령어를 입력하여 변경 사항을 즉시 적용합니다.sudo sysctl -p
2단계: eMMC에 스크립트 및 로그 디렉토리 생성
SSD와 별개로, eMMC에 스크립트와 로그 파일을 저장할 공간을 만듭니다. eMMC는 현재 /media/mmcboot에 마운트되어 있습니다.
디렉토리 생성:
sudo mkdir -p /media/mmcboot/scripts sudo mkdir -p /media/mmcboot/logs스크립트 파일 생성:
다음 명령어로ssd-monitor-reboot.sh파일을 새로 만듭니다.sudo nano /media/mmcboot/scripts/ssd-monitor-reboot.sh스크립트 내용 입력:
나노 에디터에 아래 내용을 복사하여 붙여넣습니다.#!/bin/bash # eMMC에 위치한 SSD 모니터링 및 재부팅 스크립트 LOG_FILE="/media/mmcboot/logs/ssd-reboot.log" REBOOT_DELAY=30 # 재부팅 전 대기 시간 (초) LOCK_FILE="/tmp/ssd-reboot-lock" # /tmp는 임시 공간이므로 재부팅 시 자동 삭제됨 # 로그 메시지 기록 함수 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 중복 실행 방지 (이전 재부팅 시도 중인 경우) if [ -f "$LOCK_FILE" ]; then log_message "재부팅 잠금 파일 감지. 중복 실행 방지." exit 0 fi # SSD의 /dev/sda1 마운트 상태 및 읽기 가능 여부 확인 # 'dd' 명령으로 SSD에서 데이터를 읽어 오류 여부 확인 if ! timeout 5s dd if=/dev/sda1 of=/dev/null bs=1M count=1 >/dev/null 2>&1; then log_message "심각한 SSD 오류 감지 (읽기 명령 실패)." # 잠금 파일 생성 touch "$LOCK_FILE" log_message "${REBOOT_DELAY}초 후 시스템 재부팅 시작." # 만약 웹 서버(Apache2, Nginx 등)를 운영 중이라면, 아래 주석을 해제하여 서비스 종료 추가 # systemctl stop apache2 2>/dev/null || true # systemctl stop nginx 2>/dev/null || true sleep "$REBOOT_DELAY" # 지정된 시간만큼 대기 log_message "시스템 재부팅 실행 중..." sync # 모든 파일 시스템 버퍼 동기화 (안전한 재부팅을 위해) sudo /sbin/reboot # 시스템 재부팅 명령 실행 exit 1 # 스크립트 종료 else # SSD가 정상 작동 중일 때 로그 기록 (선택 사항) # 이 로그를 너무 자주 기록하면 파일 크기가 커질 수 있습니다. # log_message "SSD 정상 작동 중. 스크립트 실행 확인." : # 아무것도 하지 않음 (주석 처리된 로그가 없다면) fi스크립트에 실행 권한 부여:
sudo chmod +x /media/mmcboot/scripts/ssd-monitor-reboot.sh
3단계: Cron 작업 설정 (5분마다 SSD 상태 확인)
이제 cron 스케줄러를 사용하여 5분마다 위 스크립트가 자동으로 실행되도록 설정합니다.
cron 테이블 편집:
sudo crontab -e(처음 실행하는 경우, 어떤 에디터를 사용할지 물어볼 수 있습니다.
nano를 선택하는 것이 가장 쉽습니다.)cron 작업 추가:
파일의 맨 마지막에 다음 줄을 추가하고 저장합니다.*/5 * * * * /bin/bash /media/mmcboot/scripts/ssd-monitor-reboot.sh >> /dev/null 2>&1*/5 * * * *: "매 5분마다" 스크립트를 실행하라는 의미입니다./bin/bash /media/mmcboot/scripts/ssd-monitor-reboot.sh: eMMC에 저장된 스크립트를bash셸로 실행합니다.>> /dev/null 2>&1: 스크립트에서 발생하는 모든 메시지(정상 및 오류)를 버려서 불필요한 로그나 알림이 쌓이는 것을 방지합니다. 스크립트 내부에 따로 로그 파일이 설정되어 있으므로 문제 없습니다.
저장하고 에디터를 종료하면 cron 설정이 즉시 적용됩니다.
4단계: 설정 확인하기
크론 작업이 정상적으로 실행되고 있는지 확인하는 가장 좋은 방법은 스크립트가 남기는 로그 파일을 확인하는 것입니다.
로그 파일 실시간 확인:
tail -f /media/mmcboot/logs/ssd-reboot.log이 명령을 실행하면
/media/mmcboot/logs/ssd-reboot.log파일에 스크립트가 기록하는 메시지가 실시간으로 출력됩니다.만약 스크립트 내에서
log_message "SSD 정상 작동 중. 스크립트 실행 확인."줄의 주석을 해제하셨다면, 5분마다 이 메시지가 날짜 및 시간과 함께 기록되는 것을 볼 수 있을 것입니다. 이를 통해 스크립트가 주기적으로 잘 실행되고 있음을 확인할 수 있습니다.
요약
이 가이드를 통해 USB로 연결된 SSD에 오류가 발생했을 때 시스템이 자동으로 재부팅되도록 설정하는 방법을 알아보았습니다.
kernel.panic설정을 통해 커널 수준의 치명적인 오류에 대비합니다.- eMMC에 위치한 스크립트가 독립적으로 SSD 상태를 모니터링하고, 오류 발생 시 재부팅을 시도합니다.
cron을 사용하여 이 모니터링 스크립트를 주기적으로 실행합니다.
이 설정은 SSD 오류로 인한 시스템 다운타임을 최소화하고, 안정적인 서버 운영에 큰 도움이 될 것입니다.
'IT 관련 > 우분투(Ubuntu) 이것저것' 카테고리의 다른 글
| Ubuntu 서버(N100)에 Docker 설치방법 (0) | 2025.06.06 |
|---|---|
| Ubuntu 로그 확인 journalctl 이란? (0) | 2025.05.30 |
| [왕초보] Banana Pi M5 메일 서버 호스팅 A to Z: 마지막! (0) | 2025.05.23 |
| [왕초보] Banana Pi M5 메일 서버 호스팅 A to Z: 5단계 최종점검, 유지보수, 백업 및 고급팁 (0) | 2025.05.23 |
| [왕초보] Banana Pi M5 메일 서버 호스팅 A to Z: 4단계 SSL, DKIM, 웹메일, 스팸필터 완벽 설정 (0) | 2025.05.23 |