MENU

ファイルコピーでパーミッションとタイムスタンプを維持する実務手順

設定ファイルをバックアップ目的でコピーしたら、パーミッションがリセットされてサービスが起動しなくなった――そうした現場トラブルを防ぐには、コピー時に属性を引き継ぐオプションを使うことが基本です。まず動くコマンドを示します。

# パーミッション・タイムスタンプ・所有者を保持してコピー
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

cp -p--preserve の短縮形)を付けるだけで、元ファイルのパーミッション・タイムスタンプ・所有者・グループがそのままコピー先に引き継がれます。

目次

cp -p が保持する属性と確認方法

デフォルトの cp はファイルの中身のみをコピーし、タイムスタンプは実行時刻に、パーミッションはその時点の umask に依存した値に変わります。-p を付けると以下の属性が保持されます。

  • アクセス権(パーミッション)
  • 所有者・グループ(所有者の変更には root 権限が必要)
  • タイムスタンプ(最終アクセス時刻・最終更新時刻)

コピー前後を ls -l で比較すると、属性が一致していることを確認できます。

# コピー前のファイル属性を確認
$ ls -l /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 2616 Jun 10 09:00 /etc/nginx/nginx.conf

# -p 付きでコピー
$ cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# コピー後:属性・タイムスタンプが一致していることを確認
$ ls -l /etc/nginx/nginx.conf*
-rw-r--r-- 1 root root 2616 Jun 10 09:00 /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 2616 Jun 10 09:00 /etc/nginx/nginx.conf.bak

一般ユーザーで実行した場合、所有者の引き継ぎは自分自身のファイルにのみ有効です。他ユーザーが所有するファイルを cp -p でコピーすると、所有者は実行ユーザー自身になります(パーミッションとタイムスタンプは保持されます)。

ディレクトリごと属性を保持してコピーする

ディレクトリ全体を属性付きで再帰コピーする場合は cp -a(アーカイブモード)が最短です。-a-dpR(シンボリックリンクを辿らない・パーミッション保持・再帰コピー)と同義です。

# ディレクトリ全体を属性保持で再帰コピー
cp -a /etc/nginx/ /backup/nginx_$(date +%Y%m%d)/

# コピー後に所有者・パーミッションを確認
ls -lR /backup/nginx_$(date +%Y%m%d)/

コピー先ディレクトリが既に存在する場合、末尾のスラッシュの有無によって挙動が変わります。/backup/nginx/ が存在する状態で cp -a /etc/nginx/ /backup/nginx/ を実行すると、/backup/nginx/nginx/ というネストが生まれます。コピー先の存在有無を事前に確認する習慣をつけておくと安全です。

rsync で属性を保持しながら同期・転送する

リモートホストへの転送や、変更分だけを効率よく同期したい場面では rsync が実務標準です。-a(アーカイブ)フラグで cp -a と同等の属性保持が可能で、さらに差分転送・SSH 経由の転送にも対応します。

# ローカル間で属性を保持して同期(--delete で削除も反映)
rsync -av --delete /etc/nginx/ /backup/nginx/

# リモートホストへ SSH 経由で転送
rsync -avz -e ssh /etc/nginx/ deploy@192.168.1.10:/backup/nginx/

-v は転送ファイルの一覧を表示、-z は転送時に圧縮を有効にするオプションです。ローカル間では -z は不要(かえって遅くなる場合がある)ため省いてかまいません。

SELinux コンテキストと ACL の扱い

RHEL 系・AlmaLinux・Rocky Linux など SELinux が有効な環境では、cp -arsync -a でも SELinux コンテキストは保持されません。コンテキストを含めてコピーしたい場合は cp --preserve=all を使うか、コピー後に restorecon でコンテキストを再付与します。

# SELinux コンテキストを含むすべての属性を保持(root 必要)
cp --preserve=all /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# または cp -a でコピーしてからコンテキストを再付与
cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
restorecon -v /etc/nginx/nginx.conf.bak

また、POSIX ACL が設定されているファイルを扱う場合、cp -a では ACL が保持されないケースがあります。そのような環境では getfacl / setfacl の組み合わせ、または rsync -a --acls-A)を使用します。

# ACL を保持して rsync(-A オプション)
rsync -aA /etc/nginx/ /backup/nginx/

# ACL の手動引き継ぎ(cp -a との組み合わせ)
getfacl /etc/nginx/nginx.conf | setfacl --restore=-

実務での使い分けポイント

用途別の選択基準をまとめます。

  • 単一ファイルのバックアップcp -p で十分。シンプルで副作用がない。
  • ディレクトリ全体のローカルコピーcp -a が最短。シンボリックリンクも含めて構造を保持できる。
  • リモートへの転送・定期同期rsync -av。差分転送で速く、ログも見やすい。
  • SELinux 有効環境での設定ファイル操作:コピー後に restorecon を実行するか、cp --preserve=all を root で実行する。

ある運用現場では、デプロイスクリプト内の cp-p を付け忘れたことで、Web サーバーの設定ファイルのパーミッションが 644 から 664(umask の影響)に変わり、セキュリティ監査に引っかかるインシデントが発生しています。バックアップ・デプロイ用のスクリプトでは -p または -a を明示することを標準化しておくと、こうした問題を未然に防げます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次