プライマリ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貪欲な複数の呼び出しに依存しないこれを達成する方法が欲しいです。
私がやろうとしていることのアイデアについては、以下の私の答えをチェックしてください
これを手動で理解しようとする代わりに、既存のものに頼ってください。私はファイルサーバーで hd-idle を使用していますが、うまく機能します。ドライブをアンマウントする理由が本当にないので、アンマウントもしません。ファイルにアクセスしたい場合、ディスクが回転します。次に、タイムアウトが経過すると、再びスピンダウンします。
データの整合性に非常に偏執的である場合は、 autofs を使用できます。これにより、必要に応じてファイルシステムを自動的にマウントおよびアンマウントできます。私自身は使用していませんが、 ArchWikiページ は非常に便利に見える情報を提供します。
エイリアスがあります!おそらく、同期/アンマウントしてから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デバイスであり、コントローラーはこれらのコマンドをサポートしていないため、実際にこれをテストすることはできません。
これが私のこれまでのスクリプトのハックです。誰かがより良い解決策を見つけるまで、私はこれを開いたままにします...
#!/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つを超える場合は、修正する必要があります。
何か提案があれば、遠慮なくお願いします。
ハードドライブをスピンダウンするためにパーティションをアンマウントする必要はありません。スタンバイタイムアウトを設定するだけの方が簡単です(しばらく使用されなかった後にトリガーされます)。このようにして、必要に応じてディスクが起動(スピンアップ)し、パーティションを再マウントしなくてもすぐに使用できるようになります。
@Nattgewがコメントで提案しているように、hdparm
(使用したいツールの場合)と-S
オプションを使用して、スタンバイタイムアウトを設定します。
-S Set standby (spindown) timeout
このようにして、アクティビティがないときにディスクが自動的にスピンダウンします。
この変更を永続的にするために(つまり、再起動後)、/etc/hdparm.conf
に変更を加える必要がある場合があります。あるいは、最近ではディストリビューションでsystemd
を使用している可能性が高いため、ユニットを作成する必要があるかもしれません。
https://unix.stackexchange.com/a/89013/66295
おそらく最も簡単な方法は、グラフィカルツールを使用することです...(ええ、システムでグラフィカルインターフェイスがすでに有効になっている場合は、それが最速の方法です)
あなたがあなたのラップトップを使用していると言っているように、私はあなたが実際にグラフィカルインターフェースを持っていると思います。 GNOMEディストリビューションには、「ディスク」という名前のプログラムがあります。
スタンバイモードにするハードドライブを選択したら、メニューから[ドライブ設定]をクリックできます(または CTRL + E ショートカットかもしれません):
次に、スタンバイタイムアウト設定を変更します。