既知の2つの事実:
- Linuxでは、同じファイルシステムのある場所から別の場所にファイルを移動してもinodeは変更されません(ファイルは「同じ場所」に保持され、関連ディレクトリのみが変更されます)。
- ただし、コピーすると、新しいinodeを含むまったく新しいファイルが作成されます。
この情報を通して、私は以下を観察しました。
$ ls -li /tmp/*.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:33 /tmp/vf4.db
$
$ cp /tmp/vf4.db /tmp/vf4.2.db
$ ls -li /tmp/*.db # New inode introduced
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:38 /tmp/vf4.2.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:33 /tmp/vf4.db
$
$ mv /tmp/vf4.2.db /tmp/vf4.db
$ ls -li /tmp/*.db
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:38 /tmp/vf4.db
$
$ cp /tmp/vf4.db /tmp/vf4.2.db
$ ls -li /tmp/*.db # Original inode appears again! (1452722)
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.2.db
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.db
$
$ mv /tmp/vf4.2.db /tmp/vf4.db
$ ls -li /tmp/*.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.db
この「往復」により、常にソースインデックスノードがソースファイルに再度追加される。私は各レプリカに全く新しいinodeを使用したかったのです。
同じインデックスノードをどのように再利用しますか?
編集する
コメントセクションでは、一部は背景情報を要求しました。したがって、一部のsqliteラッパーはこの悪い慣行を使用してdbファイルを置き換え、sqlite3は置換のエラーを表示しません。しかし、これはsqliteに関する質問ではありません。、主題および質問に固執しなさい。
ベストアンサー1
ファイルシステム階層がそうすることを選択したため、システムは同じinodeを再利用します。記事で述べたようにコメント、これは実装の詳細です。私の場合はそうでしたがext4
、他のファイルシステムタイプがinodeを異なる方法で使用(または再利用)してはならない理由はありません。 inodeがなく、要求時にinode番号が動的に合成されるファイルシステムを見つけることができます。ファイルシステムはtmpfs
同じ方法で inode 番号を再利用しません。
# Create two files on ext4
touch file
cp file copy
ls -li file copy
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 file
# Remove one, copy the other back
rm file
cp copy file
ls -li file copy
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 file
# Remove one, create an unexpected intervention, copy the other back
rm file
touch thing
cp copy file
ls -li file copy thing
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
133237 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:14 file
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:14 thing
tmpfs
それでは、ファイルシステムでこれを繰り返してみましょう。/dev/shm
# Create two files on tmpfs
touch file
cp file copy
ls -li file copy
369355 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 copy
369354 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 file
# Remove one, copy the other back
rm file
cp copy file
ls -li file copy
369355 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 copy
368123 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:28 file
潜在的に役立つ参考資料