スクリプトを使用してfstabにnoatimeを追加するには?

スクリプトを使用してfstabにnoatimeを追加するには?

サーバーを設定するためにbashスクリプトをnoatime追加したいです。fstab

/パーティションに対してのみ安全な方法で自動化するにはどうすればよいですか?

簡単に言うと:

その行にまだbash / shellコードを使用しているものが含まれていない場合は、,noatime2行目の文字列をその行の4番目の文字列に追加するにはどうすればよいですか?/noatime

サンプルファイル:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

得るべきこと:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard,noatime    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

答え1

これにより、目的の効果を得ることができます。

awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab

これはあなたが要求したよりも少し具体的です。次の,noatime場合、4番目のフィールドに追加されます。その分野まだ含まれていないnoatime、行全体をチェックしません。

-i inplaceGawk専用です。サポートされていない場合、結果は新しいファイルに書き込まれます。

awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}

どちらの場合も、サーバー設定スクリプトがルートとして実行されていると仮定します。

(ありがとうございます。エドモートン強力なテキスト置換のために!を使用すると、4番目のフィールドの正規表現に関連する潜在的な問題を回避できますsub。 )

答え2

$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef    /     ext4  defaults,noatime,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

正規表現に一致する行m:^[^#]+\s+/\s+: (たとえば、スペースで囲まれた/いいえ前に#コメントがある)と一致しない場合は、挿入される行noatimeを修正します,noatime

注:これは,noatime背面defaultsではなく背面に挿入されますdiscard。私の考えにはこれがdefaultsほぼ確実に存在するので(discardとにかくそれよりも可能性が高い)、より意味があると思います。

これは練習の実行を行います。つまり、変更せずに./fstab標準出力に実行する操作のみを表示します。実際にファイルを変更するには、Perlの-iオプションを使用します。

perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

もちろん、./fstabを/etc/fstabに変更します。

atimeところで、、relatimeなどの既存のインスタンスも変更するには、nodiratimeステートメントを追加します。最初。例えば

perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
  m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

答え3

拡張正規表現モード(-E)で実行されているGNU sedを使用してこれを実行できます。 2番目のフィールドが単一のスラッシュ「/」で、4番目のフィールドにまだ完全な単語「noatime」が含まれていない行を確認し、それを4番目の単語に追加します。

sed -E -e '
  \:^\s*\S+\s+/\s:!b
  s/\S+/\n&\n/4
  /\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
  s/\n//g
' /etc/fstab

関連情報