실패한 디스크를 완전히 무시하도록 Linux Kernel> 3.0에 지시하는 방법은 무엇입니까?


23

나는 1 개 개의 SATA 버스에 하드 디스크와 삼성 노트북 (크로노스 S7)가 ata:1로 감지되고 /dev/sda,에 8 세대 SSD ata:2, /dev/sdb및 SATA 인터페이스의 나머지 부분에 다양한 장치를.

문제는 SSD 디스크가

  • 메인 보드에 납땜 됨 (이동할 수 없음)
  • 버스트 됨 (모든 작업에 대한 I / O 오류 만 제공함)
  • 그것은 바이오스에 나타나지 않습니다 (아마 파손 되었기 때문에)

이제이 디스크는 :

  • 부팅이 실패한 디스크를 검사하려고 시도하는 데 3 ~ 5 분이 지연됩니다.
  • 그러나 가장 성가신 것은 실패로 인해 시스템이 일시 중단되지 않는다는 것입니다 /dev/sdb.

부팅이 늦어도 살아남을 수 있다는 점에 주목하십시오.


그래서 질문은 : 커널에게 ata : 2에서 장치를 조사하지 않도록 할 수 있습니까?

이전 커널 (<3.0)에서 소스에 약간을 파헤칠 수 있었을 때 hdb=ignore트릭을 수행 한 스타일의 명령 줄 매개 변수가 있었습니다.

나는 아래 제안 된 모든 트릭 udevlibata:force커널 매개 변수를 사용해 보았습니다 . 구체적으로, 다음은 작동하지 않습니다.

  1. 다음 /etc/udev/rules.d/파일 중 하나에 추가 (초기 실행 중 00-ignoredisk.rules또는 늦게 99-ignoredisk.rules또는 두 위치 모두에서)

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    

    ...도 아니다

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    

    많은 중간 솔루션도 --- 이렇게하면 부팅 후 디스크에 액세스 할 수 없지만 부팅시 디스크가 검사되고 일시 중단시 여전히 검사되어 일시 중단이 실패합니다.

  2. 시스템 파일 편집 /lib/udev/rules.d/60-persistent-storage.rules(및 udisks, udisks2) 변경

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"
    

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"
    

    다시 말하지만 이것은 사용자 공간에서 디스크를 마스킹하는 효과가 있지만 디스크는 여전히 커널에서 볼 수 있습니다.

  3. 모든 가능한 조합으로 부팅 (물론, 그들 중 많은)의 libata:force(예를 들어 발견 매개 변수 여기 비활성화 DMA, 낮은 속도 또는 무엇이든 실패한 디스크에 대해 --- 작동하지 않는 순서대로). 매개 변수가 사용되지만 디스크는 여전히 검사되어 실패합니다.

    http://paste.ubuntu.com/6186145/에 전체 udevadm info -a -n /dev/sdb붙여 넣기

    smartctl -i /dev/sdb -T permissive 제공합니다 :

    root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
    smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
    Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
    
    Vendor:               /1:0:0:0
    Product:              
    User Capacity:        600,332,565,813,390,450 bytes [600 PB]
    Logical block size:   774843950 bytes
    >> Terminate command early due to bad response to IEC mode page
    

    분명히 잘못되었습니다. 그렇지만:

    root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
    fdisk: unable to read /dev/sdb: Input/output error
    

( http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579의 SSD 데이터 ).


이것이 너무 명백한 경우 죄송하지만 질문에 포함하지 않았으므로 장치 이름 또는 UUID가 목록에 없는지 확인 /etc/fstab했습니까? 부팅 지연은 커널이나 udev에 의해 더 일찍 발생할 수 있기 때문에, 읽을 때 나중에 fsck에 의해 발생 fstab합니다.
Teresa e Junior

예, 시스템 파일에 / dev / sdb (또는 파티션)에 대한 언급이 없습니다. 지연은 init가 시작 되기 전에 조차도 ... kthread에 있으며 (부팅이 병렬로 계속되기 때문에) 더 근본적인 수준입니다. 그러나 실제로 부팅 지연은 문제가 적습니다. --- 일시 중단 / 재개 중 디스크를 무시하여 일시 중단 작동을 할 수만 있다면 행복합니다. (어쨌든 감사합니다).
Rmano

initrd에서 사용하고 있습니까? 그렇다면 누구의?
19:04에

@hildred : 우분투 13.04의 주식 커널과 initramfs를 사용하고 있습니다. AHCI 또는 모든 SATA를 비활성화 할 수 있지만 시스템이 죽었습니다. 디스크가 전혀 없습니다.
Rmano

데비안 (및 Umbutu)은 ata 서브 시스템을 모듈로 컴파일합니다. initrd에 의해로드 될 때 모듈에 매개 변수를 설정해 보셨습니까?
19:11에서

답변:


26

libatanoprobe 옵션이 전혀 없습니다. 그것은 레거시 IDE 옵션이었습니다 ...

그러나 나는 그것을 구현 하는 커널 패치 를 작성 했다. 많은 커널에 매우 쉽게 적용 할 수 있습니다 (위의 줄은 2013-05-21 / v3.10-rc1 *에 추가되었지만 해당 줄없이 수동으로 안전하게 적용 할 수 있음).

업데이트 이제 패치가 업스트림 상태에 있습니다 (최소 3.12.7 안정적인 커널에서). Ubuntu 14.04와 함께 배포 된 표준 커널에 있습니다 (3.1을 기반으로 함).

패치가 설치되면 추가

 libata.force=2.00:disable

커널 부팅 매개 변수는 Linux 커널에서 디스크를 숨 깁니다. 번호가 올바른지 다시 확인하십시오. 장치 이름을 검색하면 도움이 될 수 있습니다 ( 부팅 매개 변수 추가 하기 전에 커널 메시지를 확인해야 함 ).

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

중요한 숫자는 ata2.00위의 첫 번째 줄에 있습니다.


고마워 우분투에서 커널을 컴파일하고 설치하는 방법을 기억하자마자 확인하려고 노력할 것입니다. 불행히도, 나는 앞으로 매우 복잡한 주를 가질 것이다 ...
Rmano

1
+1 내가 게시 한 트릭보다 분명히 낫습니다. 그것이 공식화되기를 바랍니다.
Emmanuel

1
좋아, 패치를 테스트했다. 작동합니다. 업스트림으로 푸시해야하는 경우 Tested-by :를 패치에 추가 할 수 있습니다. --- 내 프로필에 내 이메일이 있습니다. wiki.ubuntu.com/Kernel/BuildYourOwnKernel 의 지침에 따라 설치했습니다 .
Rmano

1
@ illuminÉ --- 방금 그 의미에서 답변을 편집했습니다 --- 승인되기를 기다립니다.
Rmano 2016 년

1
GENTOO를 사랑하는 또 다른 이유 !!
eyoung100

15

하드웨어 문제에는 물리적 하드웨어 솔루션이 있습니다. 드라이브의 전원 공급 장치를 납땜 해제하거나 차단하는 것을 고려 했습니까?

편집 : 사람들이 하드 드라이브를 핫 플러그하기 전에이 옵션을 사용하지 않는 경우 좋습니다. 이를 사용하여 드라이브를 비활성화 할 수 있습니다.

echo 1 > /sys/block/sdb/device/delete

다른 프로세스는 SATA 버스를 강제로 스캔 한 다음 다시 되돌릴 수 있습니다. 랩톱을 최대 절전 모드로 전환하기 직전에 수행하십시오.

OP에 의해 편집 : 그것은 효과가 있었습니다. 다음 파일을 추가했습니다.

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

내용으로 :

#!/bin/sh

# Tell grub that resume was successful

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo Deleting device sdb 
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

... 이제 시스템이 올바르게 일시 중단 (및 재개)됩니다.


1
그것이 사실이라면. SSD 드라이브가 어떤 칩인지 말할 수조차 없습니다. 대부분은 표시되어 있지 않습니다. 그리고 칩의 전원을 끄는 것은 안전하지 않습니다. SSD 드라이브가 일종의 도터 보드에 연결되기를 바라고 랩탑을 열었습니다. 불운. (그리고 커널 드라이버를 작성하는 데 어려움이 대부분은 나쁜 설계 hw 해결하는 것입니다).
Rmano

@Rmano "삭제"트릭은 어떻게 수행합니까?
Emmanuel

그것은 작동합니다 --- "삭제"트릭 후 일시 중단 할 수 있습니다. 고마워 (부팅은 여전히 ​​지연되지만 문제는 아닙니다.)
Rmano

에 대해 알려 주셔서 감사합니다 delete.
Michael Shigorin

3

BIOS

이 장치는 BIOS를 통해 어떤 방식으로도 나타나지 않습니까?

HDD가 "자동"모드로 구성되는 경우가 많으므로 이러한 장치가 비활성화 된 상태인지 확인하고 하나의 HDD 만 명시 적으로 활성화하고 다른 모든 장치를 비활성화하는 정도까지 진행합니다.

커널 부팅 옵션

종종 스위치로 전달 될 수있는 다른 부팅 옵션을 사용하여 부팅 Linux 커널이 다양한 서브 시스템을 자동 감지하지 못하게 할 수 있습니다.

대부분의 옵션이 모두 여기에 나열되어 있지 않은 경우

간단히 말해서 리눅스

O'Reilly 책, Linux Kernel in Nutshell , 특히 7 장 : 커널 사용자 정의를 통해 훑어 볼 수 있습니다 .

이 책은 저자 Greg Kroah-Hartman의 개인 웹 사이트에서 무료로 제공됩니다. 전체 책도 다운로드 할 수 있습니다.


아니요, BIOS에는이 디스크의 흔적이 없습니다. HDD와 DVD를 볼 수 있습니다. 실패하기 전에 Windows (현재 시스템에는 더 이상 창이 없음)에서 주 디스크의 속도 향상 캐시로 사용되었습니다. AHCI 모드를 레거시, 꺼짐, 예 또는 자동 (모든 디스크에 대해)으로 설정하려고 시도했지만 아무것도 변경되지 않았거나 (꺼짐에 따라) 단순히 시스템이 부팅되지 않았습니다.
Rmano

내가 과거에 사용한 다른 방법은 커널이 부팅 될 때 Grub (커널 부팅 옵션)을 통해로 알려줍니다 noide=..... 하드웨어 자동 감지를 비활성화하기 위해 부팅 커널에 제공 할 수있는 다양한 옵션이 있습니다.
slm

디스크는 SATA (scsi)이며 IDE는 없습니다. 그리고 hdb=noprobe옵션은 scsi에 소집자를 통과시키지 않았으므로 (2.6.x 부근에서 제거 된 것으로 생각합니다) a sdb=noprobe또는 ata:2=noprobe옵션 이 존재하지 않습니다 . kernel-parameters.txt커널 소스의 모든 파일을 읽었 으며 올바른 매개 변수를 찾을 수 없습니다. 당신이 누군가를 안다면, 답변으로 알려주세요 --- 정말 감사하겠습니다.
Rmano

@Rmano-더 찾기 위해 HDD와 버스 감지와 관련된 몇 가지 옵션을 기억하지만 내 머리 꼭대기는 아닙니다.
slm

@Rmano-옵션은 어떻습니까 :libata.dma=
slm

0

잠금을 확인하는 리눅스 방법 : sudo hdparm -I /dev/sdX(X = a..z; 드라이브가 어떤 장치인지 알아야합니다). (큰) 출력이 끝나면 마지막 10 줄을 읽을 수 있어야합니다 *not* locked.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.