Red Hat Enterprise Linux でファイル転送を学ぶ

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、RHEL システム上でファイルの管理と転送を効率的かつ安全に行うための実践的な経験を習得します。圧縮アーカイブを含む tar アーカイブの作成、リスト表示、抽出は、データのパッケージ化やバックアップに不可欠なスキルです。

さらに、この実験では、対話型のファイル転送に sftp、堅牢で効率的なファイル同期に rsync を使用して、安全にファイルを転送する方法を指導します。これにより、ネットワーク操作中のデータの完全性とセキュリティが確保されます。

tar アーカイブの作成とリスト表示

このステップでは、tar アーカイブの作成とリスト表示方法を学びます。tar コマンドは、ファイルやディレクトリをアーカイブするために使用される強力なコマンドラインツールです。バックアップやファイル転送によく用いられます。

tar コマンドは、実行する操作を指定するアクションオプションが必要です。一般的なアクションオプションには以下があります。

  • -c または --create: 新しいアーカイブを作成します。
  • -t または --list: アーカイブの内容をリスト表示します。
  • -x または --extract: アーカイブからファイルを抽出します。

さらに、tar は一般オプションを使用して動作を修正します。

  • -v または --verbose: アーカイブ化または抽出中に処理中のファイルを表示します。
  • -f または --file: アーカイブファイルの名前を指定します。このオプションの後にアーカイブファイル名が必要です。

まず、アーカイブするサンプルファイルをいくつか作成しましょう。デフォルトの作業ディレクトリである ~/project ディレクトリに移動します。

cd ~/project

次に、my_files という名前の新しいディレクトリを作成し、その中にいくつかのサンプルテキストファイルを作成します。

mkdir my_files
echo "This is file1 content." > my_files/file1.txt
echo "This is file2 content." > my_files/file2.txt
echo "This is file3 content." > my_files/file3.txt
ls my_files

すると、3 つのファイルが表示されるはずです。

file1.txt  file2.txt  file3.txt

次に、my_files ディレクトリの tar アーカイブを作成します。アーカイブ名は my_archive.tar とします。

tar -cvf my_archive.tar my_files

出力は、アーカイブに追加されるファイルが表示されます。

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

現在のディレクトリにアーカイブファイル my_archive.tar が作成されたことを確認できます。

ls

my_files と共に my_archive.tar がリスト表示されるはずです。

my_archive.tar  my_files

次に、-t (リスト表示) オプションと -f (ファイル) オプションを使用して、my_archive.tar ファイルの内容をリスト表示します。

tar -tf my_archive.tar

出力は、アーカイブの内容が表示されます。

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

ファイルのパーミッション、所有者、サイズなどの詳細情報を見たい場合は、-v (詳細) オプションを追加できます。

tar -tvf my_archive.tar

出力は、各アーカイブ項目の詳細情報を提供する、この例のようなものになります。

drwxr-xr-x labex/labex        0 2023-10-27 10:00 my_files/
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file1.txt
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file2.txt
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file3.txt

tar はデフォルトで、アーカイブ時に絶対パスから先頭の / を削除します。これは、アーカイブの抽出時にシステムファイルが誤って上書きされるのを防ぐための安全対策です。たとえば、/etc/hosts をアーカイブする場合、tar ファイル内では etc/hosts として保存されます。これにより、元の /etc/hosts ファイルに影響を与えることなく、新しい場所に抽出できます。

tar アーカイブからファイルの抽出

このステップでは、tar アーカイブからファイルを抽出する方法を学びます。ファイルの抽出とは、アーカイブされた内容を取り出してファイルシステムに戻すプロセスです。

ファイルを抽出するための主なオプションは -x または --extract です。通常は、アーカイブファイルの指定に -f を、抽出されるファイルを表示するために -v を使用します。

抽出する前に、既存のファイルの上書きを防ぎ、他のコンテンツと混在させないように、空のディレクトリにアーカイブを抽出するのが良い習慣です。~/project ディレクトリに extracted_files という新しいディレクトリを作成しましょう。

cd ~/project
mkdir extracted_files

次に、extracted_files ディレクトリに移動します。これにより、アーカイブの内容がこのディレクトリに抽出されます。

cd extracted_files

次に、親ディレクトリ (~/project) にある my_archive.tar の内容を、現在の extracted_files ディレクトリに抽出します。

tar -xvf ../my_archive.tar

出力は、抽出されるファイルが表示されます。

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

抽出後、現在のディレクトリ (~/project/extracted_files) の内容をリスト表示して、my_files ディレクトリとその内容が正常に抽出されたことを確認します。

ls

my_files ディレクトリが表示されるはずです。

my_files

次に、extracted_files 内の my_files ディレクトリの内容を確認します。

ls my_files

元のファイルが表示されるはずです。

file1.txt  file2.txt  file3.txt

抽出されたファイルの 1 つの中身を確認することもできます。

cat my_files/file1.txt

出力は次のとおりです。

This is file1 content.

ファイルを抽出するとき、tar コマンドは現在の umask を使用して抽出されたファイルのパーミッションを設定します。ただし、アーカイブ内の元のファイルパーミッションを保持したい場合は、-p または --preserve-permissions オプションを使用できます。これは、特定のパーミッションが重要な実行可能スクリプトや設定ファイルの場合に特に役立ちます。root ユーザーの場合、このオプションはデフォルトで有効になっていることがよくあります。通常のユーザーの場合、パーミッションの保存が重要であれば、このオプションを含めるのが良い習慣です。

この実験では、デフォルトの動作で十分であるため、-p オプションを明示的に示しません。ただし、将来のユースケースのためにこのオプションを覚えておいてください。

圧縮された tar アーカイブの作成

このステップでは、圧縮された tar アーカイブを作成する方法を学びます。tar 自体はファイルの単なる束ねですが、gzipbzip2xz などの圧縮ユーティリティと連携して、より小さなアーカイブファイルを作成できます。これは、ディスク容量の節約と転送時間の短縮に重要です。

tar コマンドは、さまざまな圧縮アルゴリズムに対応する特定のオプションを提供します。

  • -z または --gzip: gzip 圧縮を使用し、.tar.gz または .tgz のサフィックスになります。最も一般的で高速な圧縮方法です。
  • -j または --bzip2: bzip2 圧縮を使用し、.tar.bz2 または .tbz のサフィックスになります。一般的に gzip よりも優れた圧縮率ですが、速度は遅くなります。
  • -J または --xz: xz 圧縮を使用し、.tar.xz または .txz のサフィックスになります。3 つのアルゴリズムの中で最高の圧縮率ですが、最も遅いです。
  • -a または --auto-compress: アーカイブのサフィックス (例:.tar.gzgzip を意味します) に基づいて、tar が自動的に圧縮アルゴリズムを決定します。便利なオプションです。

まず、~/project ディレクトリにいることを確認します。

cd ~/project

最初に、my_files ディレクトリの gzip 圧縮アーカイブを作成します。ファイル名は my_archive.tar.gz とします。

tar -czvf my_archive.tar.gz my_files

出力は、ファイルの追加と圧縮が表示されます。

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

圧縮アーカイブの作成を確認します。

ls -lh my_archive.tar.gz

ls-lh オプションは人間が読みやすいサイズを表示します。ファイルサイズを示す、次の様な出力が出力されます。

-rw-r--r-- 1 labex labex 180 Oct 27 10:00 my_archive.tar.gz

(注:実際のサイズはシステムやコンテンツによってわずかに異なる場合がありますが、これらの小さなテキストファイルの場合、サイズは小さくなります。)

次に、通常はより優れた圧縮率を提供する xz 圧縮アーカイブを作成してみましょう。ファイル名は my_archive.tar.xz とします。

tar -cJvf my_archive.tar.xz my_files

再び、ファイルの処理が表示されます。

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

xz アーカイブのサイズを確認します。

ls -lh my_archive.tar.xz

my_archive.tar.xzmy_archive.tar.gz よりもわずかに小さくなっていることに気付くかもしれません。これは、xz の優れた圧縮率を示しています。

-rw-r--r-- 1 labex labex 168 Oct 27 10:00 my_archive.tar.xz

圧縮された tar アーカイブを抽出するには、tar-x オプションを使用するときに、圧縮の種類を自動的に検出することがよくあります。ただし、対応する解凍オプション (-z-j、または -J) または -a (自動圧縮) オプションを明示的に使用するのが良い習慣です。

my_archive.tar.gz を新しいディレクトリ extracted_gz に抽出してみましょう。

mkdir extracted_gz
tar -xzvf my_archive.tar.gz -C extracted_gz

-C オプション (ディレクトリ変更) は、tar に指定されたディレクトリにファイルを抽出するように指示します。これは、現在のディレクトリを整理しないために非常に便利なオプションです。

extracted_gz の内容を確認します。

ls extracted_gz/my_files

次の出力が出力されます。

file1.txt  file2.txt  file3.txt

sftp を使用したファイルの安全な転送

このステップでは、sftp (Secure File Transfer Program) を使用してシステム間でファイルを安全に転送する方法を学びます。sftp は、SSH (Secure Shell) を安全な通信に使用し、暗号化と認証を提供する対話型のファイル転送プログラムです。OpenSSH スイートの一部です。

この実験では、同じホスト上の labex ユーザーを「リモート」ユーザーとして使用することで、リモートシステムをシミュレートします。これにより、別の仮想マシンを必要とせずに sftp コマンドを実習できます。

まず、~/project ディレクトリにいることを確認します。

cd ~/project

シミュレートされたリモートユーザーのホームディレクトリに「アップロード」するファイルを作成しましょう。

echo "This file will be uploaded via sftp." > local_file.txt

次に、localhost 上の labex ユーザーへの sftp セッションを開始します。

sftp labex@localhost

labex@localhost のパスワードを求められます。labex と入力します。

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:....
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
labex@localhost's password: labex
Connected to localhost.
sftp>

これで、sftp の対話型プロンプトに入りました。

sftp プロンプト内では、通常のシェルと同様のコマンドを使用できます。

  • pwd: リモートシステムの現在の作業ディレクトリを表示します。
  • lpwd: ローカルシステムの現在の作業ディレクトリを表示します。
  • ls: リモートシステム上のファイルを表示します。
  • lls: ローカルシステム上のファイルを表示します。

試してみましょう。

sftp> pwd
Remote working directory: /home/labex
sftp> lpwd
Local working directory: /home/labex/project
sftp> ls

(ls コマンドは、自分のホームディレクトリであるリモート側の /home/labex の内容を表示します。)

次に、ローカルの ~/project ディレクトリにある local_file.txt を、リモートの labex ユーザーのホームディレクトリ (/home/labex) に「アップロード」します。put コマンドを使用します。

sftp> put local_file.txt
Uploading local_file.txt to /home/labex/local_file.txt
local_file.txt                               100%   32     0.0KB/s   00:00
sftp>

ファイルがアップロードされたことを確認するために、リモートディレクトリを表示できます。

sftp> ls

/home/labex のファイルの中に local_file.txt が表示されるはずです。

次に、リモートシステムからファイル「ダウンロード」してみましょう。リモートの labex ユーザーのホームディレクトリにある .bashrc ファイルを、ローカルの ~/project ディレクトリにダウンロードします。get コマンドを使用します。

sftp> get .bashrc
Fetching /home/labex/.bashrc to .bashrc
/home/labex/.bashrc                          100%  193     0.2KB/s   00:00
sftp>

ダウンロードを確認するために、ローカルディレクトリを表示します。

sftp> lls

ローカルの ~/project ディレクトリに .bashrc が表示されるはずです。

sftp セッションを終了するには、exit または bye コマンドを使用します。

sftp> exit

通常のシェルプロンプトに戻ります。

rsync を使用したファイルの安全な同期

このステップでは、rsync コマンドを使用してシステム間でファイルを同期する方法を学びます。rsync は、ローカルおよびリモートでファイルやディレクトリのコピーと同期を行うための強力で汎用的なツールです。その主な利点は、ファイル間の差異のみを転送できる点で、更新に非常に効率的です。sftp と同様に、rsync は SSH を使用して安全な暗号化転送を行うことができます。

rsync の一般的なオプションには以下があります。

  • -a または --archive: 複数のオプション (-rlptgoD) を組み合わせたもので、ほとんどのファイル属性 (再帰、シンボリックリンク、パーミッション、時刻、グループ、所有者、デバイスファイル) を保持します。「アーカイブモード」とも呼ばれ、ほとんどの同期タスクに推奨されます。
  • -v または --verbose: 詳細レベルを高め、転送に関する詳細情報を表示します。
  • -z または --compress: 転送中にファイルデータを圧縮し、低速なリンクでの転送速度を向上させることができます。
  • -h または --human-readable: 人間が読みやすい形式で数値を出力します。
  • -n または --dry-run: 実際の変更を加えずに試行実行を行います。rsync が実際にコマンドを実行する前に何をするかを検証するために非常に便利です。

まず、~/project ディレクトリにいることを確認します。

cd ~/project

ソースディレクトリと宛先ディレクトリを作成して、同期シナリオをシミュレートします。

ソースディレクトリ source_dir を作成し、いくつかのファイルを含めます。

mkdir source_dir
echo "Content of fileA" > source_dir/fileA.txt
echo "Content of fileB" > source_dir/fileB.txt
mkdir source_dir/subdir
echo "Content of subfile1" > source_dir/subdir/subfile1.txt

空の宛先ディレクトリ dest_dir を作成します。

mkdir dest_dir

次に、source_dirdest_dir に同期するときに rsync が何をするかを調べるために、ドライランを実行します。アーカイブモード、詳細出力、人間が読みやすいサイズのために -avh オプションを使用し、ドライランのために -n を使用します。

rsync -avhn source_dir/ dest_dir/

スラッシュの重要な注意点:

  • source_dir/: 末尾のスラッシュは、source_dir内容 をコピーすることを意味します。
  • source_dir: 末尾のスラッシュがない場合、source_dir 自体を宛先にコピーすることを意味します。

ドライランの出力は、転送される可能性のある ファイルを表示します。

sending incremental file list
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt

sent 186 bytes  received 12 bytes  396.00 bytes/sec
total size is 66  speedup is 0.33 (DRY RUN)

最後に (DRY RUN) が付いていることに注意してください。これは、実際には変更が加えられていないことを示しています。

次に、実際の同期を実行します。-n オプションを削除します。

rsync -avh source_dir/ dest_dir/

出力はドライランと似ていますが、(DRY RUN) タグはありません。

sending incremental file list
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt

sent 186 bytes  received 12 bytes  396.00 bytes/sec
total size is 66  speedup is 0.33

ファイルが dest_dir にコピーされたことを確認します。

ls -R dest_dir

次の出力が出力されます。

dest_dir:
fileA.txt  fileB.txt  subdir

dest_dir/subdir:
subfile1.txt

次に、source_dir のファイルを変更し、新しいファイルを追加して、rsync の効率を確認します。

echo "Updated content for fileA" > source_dir/fileA.txt
echo "New file content" > source_dir/new_file.txt

今度は rsync が何を転送するかを確認するために、別のドライランを実行します。

rsync -avhn source_dir/ dest_dir/

出力は、変更されたファイルと新しいファイルのみを表示します。

sending incremental file list
./
fileA.txt
new_file.txt

sent 128 bytes  received 12 bytes  280.00 bytes/sec
total size is 100  speedup is 0.71 (DRY RUN)

これは、rsync が差異のみを転送できることを示しています。

次に、実際の同期をもう一度実行します。

rsync -avh source_dir/ dest_dir/

dest_dir の内容をもう一度確認します。

ls -R dest_dir
cat dest_dir/fileA.txt
cat dest_dir/new_file.txt

dest_dirnew_file.txt があり、fileA.txt には「Updated content for fileA」が含まれているはずです。

まとめ

この実験では、RHEL システム上でファイルの管理と転送を行うための重要なコマンドラインツールを使用して、実践的な経験を積みました。まず、tar ユーティリティを使いこなし、アーカイブの作成、リスト表示、抽出方法を学びました。効率的な保存と転送のために圧縮された tar.gz アーカイブの作成も含まれています。

その後、安全なファイル転送方法を探求しました。sftp を使用して、システム間で対話型かつ安全なファイル転送を行い、ファイルのアップロードとダウンロードの機能を理解しました。最後に、ファイルやディレクトリの同期に強力なツールである rsync を深く掘り下げました。rsync は、増分更新を効率的に処理し、異なる場所でのデータ整合性を確保する点に焦点を当てました。