USB Disk Check at Boot or Hot Plug (improved version) - XIYO/asuswrt-merlin.ng-kr GitHub Wiki

λ°°κ²½

이 κ°€μ΄λ“œλŠ” μ—¬κΈ°μ—μ„œ 찾을 수 μžˆλŠ” 원본에 이은 κ²ƒμž…λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ˜ λͺ©μ μ€ λΆ€νŒ… μ‹œ λ˜λŠ” USB μ €μž₯ μž₯μΉ˜κ°€ 연결될 λ•Œ 파일 μ‹œμŠ€ν…œμ„ μžλ™μœΌλ‘œ μ κ²€ν•˜κ³  λ³΅κ΅¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” pre-mount 슀크립트 μ˜ˆμ‹œλ₯Ό μ œκ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” λΌμš°ν„°κ°€ 파일 μ‹œμŠ€ν…œμ„ μžλ™μœΌλ‘œ λ§ˆμš΄νŠΈν•œ ν›„μ—λŠ” 점검을 μœ„ν•΄ 마운트λ₯Ό ν•΄μ œν•˜κΈ° μ–΄λ €μšΈ 수 있기 λ•Œλ¬Έμ— λ°”λžŒμ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 κ·Έ 파일 μ‹œμŠ€ν…œμ΄ Entware와 같은 제3자 μ†Œν”„νŠΈμ›¨μ–΄μ— μ˜ν•΄ μ‚¬μš©λ˜λŠ” κ²½μš°μ—λŠ” λ”μš± κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

이 μŠ€ν¬λ¦½νŠΈλŠ” 원본 μŠ€ν¬λ¦½νŠΈλ³΄λ‹€ λ‹€μŒκ³Ό 같은 κ°œμ„  사항을 ν¬ν•¨ν•©λ‹ˆλ‹€:

  1. GPT λ””μŠ€ν¬μ™€μ˜ ν˜Έν™˜μ„± (2TB보닀 큰 λ””μŠ€ν¬λŠ” GPTκ°€ ν•„μš”ν•©λ‹ˆλ‹€).
  2. 파일 μ‹œμŠ€ν…œ μœ ν˜•μ˜ μ‹ λ’°ν•  수 μžˆλŠ” 탐지.
  3. Merlin의 νŽŒμ›¨μ–΄μ™€ John의 νŽŒμ›¨μ–΄ λͺ¨λ‘μ™€ ν˜Έν™˜λ˜λŠ” λ””μŠ€ν¬ 점검 λͺ…λ Ή.
  4. HFS 파일 μ‹œμŠ€ν…œ 지원.
  5. μŠ€μ™‘ νŒŒν‹°μ…˜ 탐지.

Merlin의 384.11 및 John의 V39E1 νŽŒμ›¨μ–΄ λ¦΄λ¦¬μŠ€λΆ€ν„° pre-mount μ‚¬μš©μž μŠ€ν¬λ¦½νŠΈμ— 두 번째 λ§€κ°œλ³€μˆ˜($2)κ°€ μ „λ‹¬λ©λ‹ˆλ‹€. 이 λ§€κ°œλ³€μˆ˜μ—λŠ” λΌμš°ν„°μ— μ˜ν•΄ νƒμ§€λœ 파일 μ‹œμŠ€ν…œ μœ ν˜•μ΄ ν¬ν•¨λ©λ‹ˆλ‹€. μ΄λŠ” MBR νŒŒν‹°μ…˜ IDλ₯Ό μ‚¬μš©ν•˜λŠ” 이전 방법보닀 훨씬 더 μ‹ λ’°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ κ°€λŠ₯ν•œ λͺ¨λ“  파일 μ‹œμŠ€ν…œ μœ ν˜•μ˜ λͺ©λ‘μž…λ‹ˆλ‹€: NULL, mbr, swap, ext2, ext3, ext4, hfs, hfs+j, hfs+jx, ntfs, apple_efi, vfat, unknown.

첫 번째 λ§€κ°œλ³€μˆ˜($1)λŠ” λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ©° μž₯치 이름(예: /dev/sda1 λ˜λŠ” /dev/sda)μž…λ‹ˆλ‹€. 숫자둜 λλ‚˜μ§€ μ•ŠλŠ” μž₯치 이름(예: /dev/sda)이 μœ νš¨ν•˜λ‹€λŠ” 점에 μœ μ˜ν•˜μ„Έμš”. μ΄λŠ” 일반적으둜 μž₯μΉ˜μ— νŒŒν‹°μ…˜ ν…Œμ΄λΈ”μ΄ μ—†κ³  단일 파일 μ‹œμŠ€ν…œ(즉, 슈퍼 ν”Œλ‘œν”Ό)을 ν¬ν•¨ν•˜κ³  μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ΄λŠ” USB ν”Œλž˜μ‹œ λ“œλΌμ΄λΈŒμ™€ 같은 κ²½μš°μ— 자주 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•„μˆ˜ 쑰건

λ‹€μŒ νŽŒμ›¨μ–΄ 버전 이상이 ν•„μš”ν•©λ‹ˆλ‹€: Merlin의 384.11 λ˜λŠ” John의 V39E1.

κ³ λ € 사항

  1. κ°€λŠ₯ν•œ 경우 예제 μŠ€ν¬λ¦½νŠΈλŠ” 파일 μ‹œμŠ€ν…œμ˜ "λΉ λ₯Έ" 점검을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ΄λŠ” pre-mountκ°€ λΈ”λ‘œν‚Ή 슀크립트이며 전체 파일 μ‹œμŠ€ν…œ 점검을 μˆ˜ν–‰ν•˜λ©΄ λΆ€νŒ… μ‹œκ°„μ— μ•…μ˜ν–₯을 λ―ΈμΉ  수 있기 λ•Œλ¬Έμ— 일반적으둜 λ°”λžŒμ§ν•©λ‹ˆλ‹€.
  2. 기본적으둜 ext2, ext3, λ˜λŠ” ext4 파일 μ‹œμŠ€ν…œμ€ λ§ˆμ§€λ§‰ 점검 ν›„ 20회 이상 λ§ˆμš΄νŠΈλ˜μ—ˆκ±°λ‚˜ 6κ°œμ›” 이상 지났을 경우 "전체" 점검이 κ°•μ œλ©λ‹ˆλ‹€. 이 행동은 tune2fs λͺ…λ ΉμœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λΌμš°ν„°μ˜ μ›ΉUIμ—μ„œ "λ””μŠ€ν¬ 검사" μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•  λ•Œ, 검사가 μ™„λ£Œλœ ν›„ μž₯μΉ˜κ°€ λ‹€μ‹œ λ§ˆμš΄νŠΈλ˜μ–΄ pre-mountκ°€ λ‹€μ‹œ 싀행될 수 μžˆμŒμ„ λͺ…μ‹¬ν•˜μ„Έμš”. μ΄λŠ” μž₯μΉ˜κ°€ 두 번 점검될 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€!

예제 슀크립트

λ‹€μŒμ€ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κ±°λ‚˜ μžμ‹ μ˜ pre-mount 슀크립트λ₯Ό 기반으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž 슀크립트λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ ν™œμ„±ν™”ν•˜λŠ” 방법에 λŒ€ν•΄μ„œλŠ” μœ„ν‚€μ˜ λ‹€λ₯Έ κ³³μ—μ„œ μ„€λͺ…λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ—¬κΈ°μ„œλŠ” μ„€λͺ…ν•˜μ§€ μ•Šκ² μŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ œλ“€μ€ μž‘λ™ 방식을 μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 그듀은 μ˜λ„μ μœΌλ‘œ "μ˜λ¦¬ν•œ" (즉, 비직관적인) μ½”λ”© 기법을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ 슀크립트

이 μŠ€ν¬λ¦½νŠΈλŠ” ext2, ext3 및 ext4 파일 μ‹œμŠ€ν…œλ§Œ μ κ²€ν•˜λ©° λͺ¨λ“  좜λ ₯을 λΌμš°ν„°μ˜ syslog둜 λ³΄λƒ…λ‹ˆλ‹€.

#!/bin/sh

# $1=μž₯치 $2=파일 μ‹œμŠ€ν…œ μœ ν˜•

if [ "$2" = "ext2" ] || [ "$2" = "ext3" ] || [ "$2" = "ext4" ]; then
    logger -t "pre-mount" "$1μ—μ„œ 파일 μ‹œμŠ€ν…œ 점검 쀑"
    e2fsck -p "$1" 2>&1 | logger -t "pre-mount"
fi

μ „ν˜•μ μΈ 슀크립트

이 μŠ€ν¬λ¦½νŠΈλŠ” κ³ κΈ‰ 슀크립트의 κ°„μ†Œν™”λœ 버전이며 λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžμ—κ²Œ 적합할 κ²ƒμž…λ‹ˆλ‹€. 점검을 μˆ˜ν–‰ν•˜λŠ” λΆ€λΆ„λ§Œ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. "", mbr, swap, apple_efi, unknown μœ ν˜•μ€ λ¬΄μ‹œλ©λ‹ˆλ‹€. HFS(즉, Apple) λ””μŠ€ν¬λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 ν•΄λ‹Ή μ½”λ“œ μ„Ήμ…˜μ„ μ œκ±°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 정보 λ©”μ‹œμ§€λŠ” λΌμš°ν„°μ˜ syslog둜 μ „μ†‘λ˜μ§€λ§Œ fsck λͺ…λ Ήμ˜ μ‹€μ œ 좜λ ₯은 /var/log/fsck.log둜 μ „μ†‘λ©λ‹ˆλ‹€.

#!/bin/sh

# $1=μž₯치 $2=파일 μ‹œμŠ€ν…œ μœ ν˜•

TZ=$(cat /etc/TZ); export TZ
TAG=$(basename "$0")
CHKLOG=/var/log/fsck.log
CHKCMD=""

case "$2" in
    ext2|ext3|ext4)
        CHKCMD="e2fsck -p" ;;
    hfs|hfs+j|hfs+jx)
        if [ -x /usr/sbin/chkhfs ]; then
            CHKCMD="chkhfs -a -f"
        elif [ -x /usr/sbin/fsck_hfs ]; then
            CHKCMD="fsck_hfs -d -ay"
        fi ;;
    ntfs)
        if [ -x /usr/sbin/chkntfs ]; then
            CHKCMD="chkntfs -a -f"
        elif [ -x /usr/sbin/ntfsck ]; then
            CHKCMD="ntfsck -a"
        fi ;;
    vfat)
        CHKCMD="fatfsck -a" ;;
esac

if [ -n "$CHKCMD" ]; then
    logger -t "$TAG" "'$CHKCMD $1' μ‹€ν–‰ 쀑 - 좜λ ₯은 $CHKLOGμ—μ„œ 확인"
    echo -e "\n'$(date)'에 '$CHKCMD $1' μ‹œμž‘" >> $CHKLOG
    $CHKCMD "$1" >> $CHKLOG 2>&1
fi

κ³ κΈ‰ 슀크립트

이 μŠ€ν¬λ¦½νŠΈμ—λŠ” κ°€λŠ₯ν•œ λͺ¨λ“  파일 μ‹œμŠ€ν…œ μœ ν˜•μ— λŒ€ν•œ μ½”λ“œ 블둝이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄, 일뢀 덜 λͺ…ν™•ν•œ μœ ν˜•μ˜ 의미λ₯Ό μ„€λͺ…ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. 슀크립트λ₯Ό 더 κ΄€λ¦¬ν•˜κΈ° μ‰½κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ 관심이 μ—†λŠ” μ„Ήμ…˜μ„ μ œκ±°ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 정보 λ©”μ‹œμ§€λŠ” λΌμš°ν„°μ˜ syslog둜 μ „μ†‘λ˜μ§€λ§Œ fsck λͺ…λ Ήμ˜ μ‹€μ œ 좜λ ₯은 /var/log/fsck.log둜 μ „μ†‘λ©λ‹ˆλ‹€.

#!/bin/sh

# $1=μž₯치 $2=파일 μ‹œμŠ€ν…œ μœ ν˜•

TZ=$(cat /etc/TZ); export TZ
TAG=$(basename "$0")
CHKLOG=/var/log/fsck.log
CHKCMD=""

if [ $# -lt 2 ]; then
    logger -t "$TAG" "λ§€κ°œλ³€μˆ˜κ°€ λˆ„λ½λ¨. νŽŒμ›¨μ–΄κ°€ λ„ˆλ¬΄ 였래됨?"
    exit 1
fi

case "$2" in
    "")
        logger -t "$TAG" "μž₯치 $1을 μ½λŠ” 쀑 였λ₯˜ λ°œμƒ" ;;
    mbr)
        logger -t "$TAG" "MBR($1)μ—μ„œ νŒŒν‹°μ…˜μ΄ λ°œκ²¬λ˜μ§€ μ•ŠμŒ" ;;
    swap)
        logger -t "$TAG" "$1은 μŠ€μ™‘ νŒŒν‹°μ…˜μž„" ;;
    ext2|ext3|ext4)
        CHKCMD="e2fsck -p" ;;
    hfs|hfs+j|hfs+jx)
        if [ -x /usr/sbin/chkhfs ]; then
            CHKCMD="chkhfs -a -f"
        elif [ -x /usr/sbin/fsck_hfs ]; then
            CHKCMD="fsck_hfs -d -ay"
        fi ;;
    ntfs)
        if [ -x /usr/sbin/chkntfs ]; then
            CHKCMD="chkntfs -a -f"
        elif [ -x /usr/sbin/ntfsck ]; then
            CHKCMD="ntfsck -a"
        fi ;;
    apple_efi)
        logger -t "$TAG" "$1은 μ• ν”Œ EFI μ‹œμŠ€ν…œ νŒŒν‹°μ…˜μž„" ;;
    vfat)
        CHKCMD="fatfsck -a" ;;
    unknown)
        logger -t "$TAG" "$1은 μ•Œ 수 μ—†λŠ” 파일 μ‹œμŠ€ν…œ(예: exFAT)을 κ°€μ§€κ³  μžˆκ±°λ‚˜ νŒŒν‹°μ…˜ ν…Œμ΄λΈ”μ΄ μ—†μŒ(예: 빈 λ―Έλ””μ–΄)" ;;
    *)
        logger -t "$TAG" "$1에 μ˜ˆμƒμΉ˜ λͺ»ν•œ 파일 μ‹œμŠ€ν…œ μœ ν˜• $2" ;;
esac

if [ -n "$CHKCMD" ]; then
    logger -t "$TAG" "'$CHKCMD $1' μ‹€ν–‰ 쀑 - 좜λ ₯은 $CHKLOGμ—μ„œ 확인"
    echo -e "\n'$(date)'에 '$CHKCMD $1' μ‹œμž‘" >> $CHKLOG
    $CHKCMD "$1" >> $CHKLOG 2>&1
fi

μ „ν˜•μ μΈ μŠ€ν¬λ¦½νŠΈμ™€ κ³ κΈ‰ μŠ€ν¬λ¦½νŠΈλŠ” λΌμš°ν„°μ˜ 자체 λ‚΄μž₯ λ””μŠ€ν¬ 검사 μœ ν‹Έλ¦¬ν‹° /usr/sbin/app_fsck.shμ—μ„œ λ§Žμ€ 뢀뢄을 μ°¨μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 사싀, 당신은 κ·Έ 슀크립트λ₯Ό pre-mount의 κ°„λ‹¨ν•œ 래퍼둜 μ‚¬μš©ν•˜λŠ” 것을 원할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ·Έ μŠ€ν¬λ¦½νŠΈμ—λŠ” 일뢀 μ œν•œμ΄ 있으며 "전체" 점검과 같이 μ›ν•˜μ§€ μ•ŠλŠ” μ˜΅μ…˜μ„ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.