Bagaimana cara menonaktifkan kernel probing untuk drive?

9

Saya memiliki laptop samsung dengan SSD SanCisk ExpressCache 30GB yang disolder pada mainbord. SSD mati (memberikan banyak kesalahan ketika saya mencoba mengaksesnya entah bagaimana), tetapi masih diselidiki pada boot kernel, saya melihat partisi itu, kesatuan ubuntu menunjukkan ikon drive yang tidak di-mount di laci aplikasi, dan yang paling parah, saya tidak dapat menangguhkan laptop , karena mengirim perintah penangguhan ke perangkat SSD gagal. Saya mencoba untuk melewatkan parameter sdb = noprobe kernel, tetapi sepertinya sudah lama usang di kernel 3.8.0 (Ubuntu 13.04). Bagaimana saya bisa menonaktifkan perangkat sata di kernel baru-baru ini?

Sergey Melekhin
sumber

Jawaban:

1

Dua solusi di sini: satu cepat untuk diterapkan, walaupun hanya memecahkan sebagian saja, yang lain adalah yang lengkap tetapi mengharuskan Anda untuk mengkompilasi kernel Anda sendiri.

Jawaban yang benar adalah tambalan kernel.

Robin H. Johnson menulis tambalan untuk driver kernel SATA ( temukan di situs pertukaran tumpukan Unix / Linux ) yang menyembunyikan sepenuhnya drive.

Perbarui Patch sekarang merupakan hulu (setidaknya di kernel stabil 3.12.7), lihat repositori git . Saya meminta backport di launchpad Ubuntu .

Setelah tambalan diinstal, tambahkan

 libata.force=2.00:disable

ke parameter boot kernel akan menyembunyikan disk dari kernel Linux. Periksa kembali apakah nomornya benar; mencari nama perangkat dapat membantu:

(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

Penanganan masalah

Dijawab oleh pengguna Unix StackExchange Emmanuel di https://unix.stackexchange.com/a/103742/52205

Anda setidaknya bisa menyelesaikan masalah yang ditangguhkan dengan mengeluarkan perintah

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

sebelum ditunda.

Untuk mengotomatiskannya, saya menambahkan file berikut: (perhatikan benderanya, itu harus dapat dieksekusi)

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

dalam direktori /etc/pm/sleep.d/

#!/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

... dan sekarang sistem menangguhkan (dan melanjutkan) dengan benar. Saya menambahkan cuplikan

if [ -d /sys/block/sdb ]; then
      echo Deleting device sdb 
      echo 1 > /sys/block/sdb/device/delete     
fi

untuk /etc/rc.localjuga, untuk mengukur baik.

Rmano
sumber
Terima kasih @Rmano, gema berhasil. Tetapi tidak jelas, di mana saya harus menempatkan 99_delete_sdbfile yang dapat dieksekusi? Di /etc/rc0.d/mungkin?
Sergey Melekhin
Maaf --- menambahkan informasi yang relevan.
Rmano
5

Saya pergi dan menulis patch kernel untuk Anda yang mengimplementasikan kemampuan untuk menonaktifkan satu disk saat boot, sehingga Anda tidak perlu repot-repot menonaktifkannya di udev, atau menunggu selama boot awal.

http://dev.gentoo.org/~robbat2/patches/3.13-libata-disable-disks-by-param.patch

Seharusnya berlaku untuk banyak kernel dengan sangat mudah (baris di atasnya ditambahkan 2013-05-21 / v3.10-rc1 *, tetapi dapat dengan aman diterapkan secara manual tanpa garis itu).

robbat2
sumber
1
Terima kasih atas usaha Anda. Mungkin Anda dapat berkomentar (bagi mereka yang tidak begitu mengenal patch kernel), cara menerapkan patch dan bagaimana menggunakannya (mungkin sdb=disablesebagai parameter kernel).
mpy
1
kernel.org/doc/Documentation/applying-patches.txt mencakup penerapan patch kernel secara umum, tetapi banyak distribusi memiliki metode spesifik untuk menerapkan patch. Patch ini secara lebih spesifik mengimplementasikan flag force 'disable' untuk libata. Pengguna harus menggunakannya dengan libata.force = ID: nonaktifkan di mana ID adalah angka atau angka.nomor tuple mengidentifikasi drive yang dimaksud.
robbat2
Saya tidak tahu apakah instruksi ini: wiki.ubuntu.com/Kernel/BuildYourOwnKernel terbaru. Saya akan mencoba jika saya bisa minggu ini ...
Rmano
By the way, dalam kasus Laptop Samsung perintah mungkin harus "libata.force = 2.00: disable" ( grep iSSD /var/log/syslogharus memberi Anda petunjuk).
Rmano
1
FYI, itu digabung ke kernel untuk 3.13 serta pohon kernel yang stabil. Namun opsi yang dapat diterima TIDAK diterima.
robbat2
0

Saya telah meneliti ini dan menemukan solusi yang dapat diimplementasikan dengan cukup mudah di Ubuntu. Distro menggunakan kmod, jadi berikut ini akan berfungsi dengan baik pada itu dan setiap distro yang menggunakan kmod.

Tergantung pada driver apa yang Anda gunakan, Anda harus memasukkannya ke daftar hitam jika Anda ingin menonaktifkan semua perangkat SATA. Coba lsmod | grep satadan cari tahu driver mana yang Anda gunakan. Kemudian di Anda /etc/modprobe.d/membuat file baru dengan echo blacklist (module) > blacklist.confmenambahkannya ke daftar hitam. Bangun kembali initramf Anda mkinitramfsagar bisa diterapkan. Mulai ulang.

Sebagai alternatif, tambahkan saja modprobe.blacklist=(module)ke parameter kernel Anda.

Menggertak
sumber
1
Ini akan menonaktifkan semua perangkat sata termasuk hard drive, jadi laptop saya tidak bisa boot lagi. Dan dukungan sata dikompilasi ke dalam kernel (bukan sebagai modul), jadi saya tidak bisa memasukkannya ke daftar hitam.
Sergey Melekhin
Oke, jadi buka saja laptop Anda dan lepaskan drive ...
Hector
Sayangnya saya tidak cukup kompeten untuk melakukannya - disolder pada mainbord, tidak dipasang melalui kabel sata. Saya bahkan tidak yakin laptop akan berfungsi jika saya menghapusnya.
Sergey Melekhin