
私たちは256MBのRAMと4GBのeMMCを備えたビーグルボーンブラックベースのカスタムボードを持っています。マザーボードはLinuxカーネル4.9を実行します。
tempfs
ファイルを作成し、確認後にeMMCのext4パーティションに移動する必要がある状況があります。 1つだけ保管してくださいcertificate
場合によっては、1つのディレクトリに複数の証明書があるため、ディレクトリ全体をtempfsからeMMCのext4パーティションに移動する必要があります。
だから私たちが持っている懸念の一つはatomicity
(mv
モバイル)オペレーションです。
rename
システムコールによると、Linuxのマニュアルページでファイル名を変更するのは原子的な作業です。http://man7.org/linux/man-pages/man2/rename.2.html
ただし、名前変更操作で 2 つのファイルシステム間でファイルを移動しても、原子性を引き続き使用できるかどうかは不明です。もしそうなら、問題はファイルを原子から原子に移動することtmpfs
ですかext4
?
明らかに考えられる解決策の1つは、ファイルを同じパーティション(明らかに同じファイルシステム)の別のフォルダに保存し、ディレクトリのmv
場合は次の名前変更方法を使用することです。
SRC_dir --> TMP_DEST_dir
DEST_dir --> BAK_DEST_dir
TMP_DEST_dir --> DEST_dir
delete BAK_DEST_dir
代替案の提案がありますか?
編集する
答えを受けた後、ボード上のテストコードに従ってください。
#include <stdio.h>
#include <errno.h>
int main()
{
int retcode = 0;
system("touch /tmp/rename_test");
retcode = rename("/tmp/rename_test", "/home/fs_rename_test");
if ( retcode < 0) {
printf("errno : %d\n",errno );
perror("Error occurred while renaming file");
return 1;
}
return 0;
}
次の出力が返されます。そして、名前変更がファイルシステム全体で機能しないことを確認しました。
errno : 18
Error occurred while renaming file: Invalid cross-device link
答え1
ファイルを原子から原子に移動して
tmpfs
いますかext4
?
カント。これらの名前変更はファイルシステム内でのみ有効です。マニュアルページには、rename(2)
マウントポイント全体で名前を変更しようとすると返されるエラーが明確に記載されています。
EXDEV
古い道そして新しい道同じマウントされたファイルシステムにはありません。
ファイルシステム間を移動するには、コピーと削除を一緒に実行する必要があります。mv
動作しないと自動的に動作しますrename()
が、この場合はアトミックではありません。
この問題に対する簡単な解決策は、まずファイルを同じファイルシステムの一時的な場所にコピーすることです。通常、最も簡単な方法は、最終的な宛先と同じディレクトリに一時ファイルを配置することです。これは、同じファイルシステム内の唯一の場所であるためです。もちろん、これを行うには、ファイルを処理するすべてのプロセスに名前に基づいて一時ファイルを無視するロジックが必要です。
大まかに言えば、次のことがファイルに対して機能するはずです。
cp /src/filename /dst/filename.tmp &&
mv /dst/filename.tmp /dst/filename &&
rm /src/filename
説明するプロセスに注意してください。目次本質的には次のようになります。
cp -r /src/dir /dst/dir.tmp &&
mv /dst/dir /dst/dir.bak &&
mv /dst/dir.tmp /dst/dir &&
rm -r /dst/dir.bak
悪くないけどいいえ原子。現在存在しない2つの実行mv
(または呼び出し)rename()
の間の期間があります。/dst/dir
名前を変更するとリンクが自動的に置き換えられる可能性があるため、シンボリックリンクを介してディレクトリにアクセスするとこの問題を解決できます。