Linuxでファイルを探すための方法として、locateコマンドがあります。locateコマンドは専用のデータベースから検索するため、ディスクをスキャンしてファイルを探すfindコマンドよりも高速に検索することができます。
私はWSL2を使用しているのですが、このデータベースの更新に時間がかかりいつまでも完了しないという現象に遭遇したので、今回はその解決方法の紹介です。
実行環境
・ホストOS: Windows 11
・仮想化技術: Windows Subsystem for Linux 2 (WSL2)
・ゲストOS: Ubuntu 22.04.3 LTS
インストールまで
インストールの確認
locateコマンドがインストールされているかを確認します。
$ locate --version
この時点でバージョンが表示されればすでにlocateコマンドを使用することができます。しかし、locateコマンドは初期状態のLinuxにはインストールされていない場合もあるため、インストールされていなければ以降の手順のとおりインストールします。
mlocateをインストール
locateコマンドはmlocateパッケージに含まれているので、aptコマンドでインストールします。
$ sudo apt install mlocate
データベースの初期化
通常、locateコマンドをインストールすると、updatedbが定期的に実行されるように設定されるため、以降は手動で実施しなくても、自動的にデータベースが更新されます。
$ sudo updatedb
データベースの更新
updatedbが終わらない
mlocateをインストールしたところ、「Initializing mlocate database; this may take some time…」というメッセージが表示されいつまでもデータベースの初期化が完了しない状態になってしまいました。
原因
locateコマンドのデータベースにWindowsのファイルもインデックスしてしまっていたから。
※WSL2はLinuxファイルシステムへのアクセス速度は速いが、Windowsファイルシステム(/mnt/c)へのアクセス速度が遅いため。
解決方法
Windowsファイルのインデックス作成を避けるために、/etc/updatedb.conf
のPRUNEPATHS
に/mnt
を追加します。
updatedb.confのバックアップを取る
念のためバックアップを取っておきましょう。
$ sudo cp /etc/updatedb.conf /etc/updatedb.conf.org
updatedb.confのPRUNEPATHSに/mntを追加する
Vimなどでupdatedb.conf
を編集します。
$ sudo vim /etc/updatedb.conf
PRUNEPATHS="/mnt"
これでデータベースの更新時にWindowsファイルがインデックスされないようになります。
updatedbが数秒で完了するようになった!
アクセス速度が遅いWindowsファイルをインデックスしないようになったため、updatedbコマンドを実行しても数秒でデータベースの更新が完了するようになりました。
おわりに
WSL2でlocateコマンドを使用したいときに起きる現象だと思いますが、一度この設定ができれば以降はデータベースの更新に時間はかからなくなると思います。
また、locateコマンドはインストール時に、ファイルパスのデータベースを1日1回作成するように設定されています。その性質上、たった今作成したばかりのファイルはデータベースに入っていないため、locateコマンドでは見つけることはできません。システムにあらかじめインストールされているファイルや、数日前に作成したファイルなど、作成してからしばらく経ったファイルを見つけるのに向いています。findコマンドとlocateコマンドの使い分けは必要ですね。
参考サイト:https://askubuntu.com/questions/1251484/why-does-it-take-so-much-time-to-initialize-mlocate-database
コメント