web-dev-qa-db-ja.com

hdparmでハードドライブを手動でスピンダウンしても安全ですか?

プライマリOSドライブ用のssdとストレージ用の大きなスピニングディスクを備えたラップトップがあります。私は現在、ドライブを使用していないときに手動でドライブをスピンダウンするために使用するエイリアスを持っています(もちろんumountの後):

Sudo hdparm -y /dev/disk/by-id/ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985

これは安全に使用できますか?ドライブがまだ同期されていない場合、またはドライブをアンマウントするのを忘れた場合、hdparmはこれを拒否しますか?そうでない場合は、hdparm(または別のユーティリティ)を使用して、これを安全に実行できるかどうかを確認する方法はありますか?


更新-

両方の回答に感謝しますが、APMとスピンダウンの時間設定で無数の異なる値の組み合わせを試しましたが、a)10秒未満前以外の結果はありませんでしたので、まったく役に立ちません。スピンダウンb)スピンダウンなしでランダムパーキング、またはc)スピンダウンまたはパーキングなし。また、特定のドライブモデルとそれぞれのAPM値をWebで検索しようとしましたが、役に立ちませんでした。

だから、私が行きたい方向はこれです:私はsystemdサービスを書くことができるようにディスクが使用されているかどうかを確認する方法を理解する必要があります。私がこれまでに到達できる最も近いものはlsof | grep /mnt/data、またはそのようなナンセンス。しかし、ご覧のとおり、それは理想的とは言えません。事前に決められたマウントポイントに依存しない、または私が自分で提供した回答のlsof + DmntpointのCPU貪欲な複数の呼び出しに依存しないこれを達成する方法が欲しいです。

私がやろうとしていることのアイデアについては、以下の私の答えをチェックしてください

2
Shane

これを手動で理解しようとする代わりに、既存のものに頼ってください。私はファイルサーバーで hd-idle を使用していますが、うまく機能します。ドライブをアンマウントする理由が本当にないので、アンマウントもしません。ファイルにアクセスしたい場合、ディスクが回転します。次に、タイムアウトが経過すると、再びスピンダウンします。

データの整合性に非常に偏執的である場合は、 autofs を使用できます。これにより、必要に応じてファイルシステムを自動的にマウントおよびアンマウントできます。私自身は使用していませんが、 ArchWikiページ は非常に便利に見える情報を提供します。

3
Daniel B

エイリアスがあります!おそらく、同期/アンマウントしてからhdparmを呼び出すスクリプトを用意する方がよいでしょう。スクリプトをsudoersファイルに追加します。

cat >/usr/local/sbin/spindown
disk=/dev/disk/by-uuid/c542a956-fbfe-42f7-ac8f-44c029a35a69
sync && unmount /bigdisk/volume &&
hdparam -y $disk

&&は、次のコマンドを試す前に、前のコマンドが正常に終了することを確認します。

次に、sudoersに追加します。これはうまくいくかもしれません:

cat >/etc/sudoers.d/spindown <<EOF
ALL ALL=(ALL) NOPASSWD:/usr/local/sbin/spindown
EOF

DanielBは素晴らしい提案をしました:autofsを使用してローカルディスクを自動的にマウント/アンマウントします(私は通常サーバーで作業し、autofsは伝統的にNFS用だったので、そのように使用することを考えたことはありません)。次に、それが設定されたら(どのように私に尋ねないでください;))、次のようなものをcronjobに追加します。

cat >/etc/cron.d/spindown << EOF
* * * * *  hdparm -C | grep -q -E "idle|active" DISK-DEV && grep -q MOUNTPOINT /etc/mtab && hdparm -y DISK-DEV
EOF

必ずDISK-DEVとMOUNTPOINTを交換してください(Disk-devに0または1のパーティションがある場合は、MOUNTPOINTに使用できます)。注意:ATMにアクセスできる1つの物理システムはRAIDデバイスであり、コントローラーはこれらのコマンドをサポートしていないため、実際にこれをテストすることはできません。

3
Otheus

これが私のこれまでのスクリプトのハックです。誰かがより良い解決策を見つけるまで、私はこれを開いたままにします...

#!/bin/bash

# for each disk specified as disk
#   if disk is active/idle
#     disk in use as inuse = false
#     for each mount point as mntpoint accociated with it
#       if (lsof | grep mntpoint)
#         inuse = true
#         break
#       endif
#     endfor
#     if inuse
#       spin down disk
#     endif
#   endif
# endfor

DISKS_LEN=1
DISKS[1]=ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985

spindown_disk() {
    (sync $1 && Sudo hdparm -y /dev/$1 >/dev/null) &
}

diskArr_len=0
for i in `seq $DISKS_LEN`; do
    linkpath=$(readlink /dev/disk/by-id/${DISKS[$i]})
    ((diskArr_len+=1))
    diskArr[$i]=${linkpath##*/}
done

for i in `seq $diskArr_len`; do
    disk=${diskArr[$i]}
    if (Sudo hdparm -C /dev/$disk | grep -B1 'active/idle'); then
        inuse=false
        mntpoints="$(mktemp)"
        mount \
            | grep "^/dev/$disk[0-9]" \
            | sed -r "s|^/dev/$disk[0-9] on (.*) type.*$|\1|" \
            >"$mntpoints"
        while read mntpoint; do
            while read openfile; do
                [ $inuse = false ] && echo open files:
                echo $'\t'/${openfile#*/}
                inuse=true
            done < <(lsof | grep "$mntpoint")
        done <"$mntpoints"
        rm -f "$mntpoints"
        if [ "$inuse" = true ]; then
            echo $disk is in use
        else
            echo spinning down $disk \(after sync\)
            spindown_disk $disk
        fi
    else
        echo $disk is already inactive
    fi
done

exit 0

X分ごとに実行されるsystemdサービスでこれをまとめる方法を理解する必要があります。明らかに、lsofとgrepを使用する代わりの方法があればもっと良いでしょう。また、grepを使用しているため、これが面白いマウントポイント文字で機能するかどうかはわかりません。また、パーティションが9つを超える場合は、修正する必要があります。

何か提案があれば、遠慮なくお願いします。

1
Shane

注意

ハードドライブをスピンダウンするためにパーティションをアンマウントする必要はありません。スタンバイタイムアウトを設定するだけの方が簡単です(しばらく使用されなかった後にトリガーされます)。このようにして、必要に応じてディスクが起動(スピンアップ)し、パーティションを再マウントしなくてもすぐに使用できるようになります。

コマンドラインソリューション

@Nattgewがコメントで提案しているように、hdparm(使用したいツールの場合)と-Sオプションを使用して、スタンバイタイムアウトを設定します。

-S   Set standby (spindown) timeout

このようにして、アクティビティがないときにディスクが自動的にスピンダウンします。

この変更を永続的にするために(つまり、再起動後)、/etc/hdparm.confに変更を加える必要がある場合があります。あるいは、最近ではディストリビューションでsystemdを使用している可能性が高いため、ユニットを作成する必要があるかもしれません。

https://unix.stackexchange.com/a/89013/66295

おそらく最も簡単な方法は、グラフィカルツールを使用することです...(ええ、システムでグラフィカルインターフェイスがすでに有効になっている場合は、それが最速の方法です)

GUIソリューション(GNOME)

あなたがあなたのラップトップを使用していると言っているように、私はあなたが実際にグラフィカルインターフェースを持っていると思います。 GNOMEディストリビューションには、「ディスク」という名前のプログラムがあります。

enter image description here

スタンバイモードにするハードドライブを選択したら、メニューから[ドライブ設定]をクリックできます(または CTRLE ショートカットかもしれません):

enter image description here

次に、スタンバイタイムアウト設定を変更します。

enter image description here

1
Peque