locate无法open mlocate.db

# locate xxxx
locate: can not open () `/var/lib/mlocate/mlocate.db': No such file or directory
如果出现此错误,请执行updatedb
  # updatedb
  # locate xxxx

整个locate工作其实是由四部分组成的:

  • /usr/bin/updatedb
  • /usr/bin/locate or mlocate
  • /etc/updatedb.conf
  • /var/lib/mlocate/mlocate.db

updatedb主要用来更新数据库,这个工作是通过crontab自动完成的. 
mlocate/locate是作来完成查询功能的程序;
updatedb.conf是配置要查询哪些目录, 哪些文件;
mlocate.db则是存放文件信息的文件;

对于mlocate.db,这是有一定格式的数据库文件. 也就是说数据库文件是由头和数据组成. 文件开始的8byte是magic number, 其值是mlocate, 接下来的4byte是配置文件的大小,以大端模式存放. 然后1byte是文件格式版本,目前为0. 再1byte是可见性标记(0或1), 接下来是2byte的填充字节和以SMNUL结尾的根目录名数据库文件.

所以对于mlocate.db的读取需要遵循这一格式. header接下是配置块. 其作用是当配置文件更新后,确保过期数据库不会被使用. 配置块的大小是在文件头以bytes为单位存放. 配置块是一系列的以变量名排序的变量分配区. 每个变量分配是由变量名和顺序的列表,它们都已SMNUL为结束符. 变量列表是由两个NUL字符结束的. 排序的规则是基于strcmp()结果的. 

当前定义的变量有:
prume_bind_mounts: 单节点, PRUNE_BIND_MOUNTS的值;
prunefs: PRUNEFS的值,每个节点转换为大写;
prunepaths: PRUNEPATHS的值;

文件接下来的内容一直到文件末尾描述了目录和内容. 每个目录有一个头: 8byte目录时间(以秒为单位),4byte目录时间(以ns为单位).如果未知,则设为0, 其值小于1000000000. 4byte填充值, SMUNL目录终止符. 

目录内容,是一系列的文件节点,按如下顺序排列:
目录时间是st_ctime和st_mtime的最大值. updatedb使用原始的数据如查目录时间在数据库中,并且和文件系统匹配正确.  目录时间为0,则会导致重新扫描目录. 这是必要的.

每个文件节点由单个字节开始,标记它们的类型:

  • 非目录文件, 文件名以SMNUL终止;
  • 子目录,文件名以SMNUL终止;
  • 标记当前目录的结尾;

来自:http://www.cnblogs.com/linuxcat/archive/2012/10/16/2726904.html

原文地址:https://www.cnblogs.com/spacepirate/p/4060019.html