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