Linux系统下解决:tar (child):XXX: Cannot open: No such file or directory问题
本来用的Linux的Centos系统,想用Linux 的Ubuntu系统,于是就把阿里云更换系统盘一切重新开始了。
问题描述
在安装jdk的时候遇到了问题
我是这样操作的
代码语言:javascript代码运行次数:0运行复制sudo tar -xvzf jdk-8u201-linux-x64.tar.gz
结果:
报错翻译:
tar(child):jdk-8u201-linux-x64.tar.gz:无法打开:没有这样的文件或目录 tar(child):错误无法恢复:现在退出 tar:孩子返回状态2 tar:错误无法恢复:现在退出
原因是告诉我们找不到jdk文件,但是我明明已经把jdk放在了/opt路径下。
解决办法
尝试了很多的解决办法都无法解决,直到我意识到会不会是安装包存放的位置也有讲究。
我的解决办法: 采用第一种添加完整路径的办法
代码语言:javascript代码运行次数:0运行复制sudo tar -xvzf /opt/jdk-8u201-linux-x64.tar.gz
原因
出现这个问题,原因有多种
- 账号权限不足造成的,使用sudo执行则解决
- 压缩包损坏
- 磁盘空间不足,可以df /home -h查看/home是否已满
- 默认的linux共享库搜索路径为/lib和/usr/lib目录,若共享库不在这两个路径,进程运行时不能自动链接,按照默认共享库路径找不到该共享库文件。
前三种情况不予讲解了,烦请自行排查,看一下第四种原因的解决办法
找不到该共享库文件
默认的linux共享库搜索路径为/lib和/usr/lib目录,若共享库不在这两个路径,进程运行时不能自动链接(比如安装程序后共享库在/usr/local/bin),此时一般有下面4种方法解决:
一般有下面4种方法解决
方法一:链接时使用静态库,编译脚本或者命令中指明jdk文件的完整路径
即上面我的解决办法:使用绝对路径
方法二:将文件直接复制到可搜索的路径中
默认的linux共享库搜索路径为/lib和/usr/lib目录,可以把文件复制到/lib或/usr/lib目录下
代码语言:javascript代码运行次数:0运行复制cp -r 文件 目标路径
然后再进行操作
方法三:添加搜索路径,使用ldconfig
如果共享库文件安装到了 /usr/local/lib (很多开源的共享库都会安装到该目录下)或其它非 /lib 或 /usr/lib 目录下, 那么在执行 ldconfig 命令前, 还要把新共享库目录加入到共享库配置文件 /etc/ld.so.conf 中, 如下:
代码语言:javascript代码运行次数:0运行复制# 执行命令
cat /etc/ld.so.conf
# 没有编辑过/etc/ld.so.conf文件会输出:include ld.so.conf.d/*.conf
# 把新共享库目录加入到共享库配置文件
echo "/usr/local/lib" >> /etc/ld.so.conf
# 执行 ldconfig 命令
ldconfig
方法四:修改LD_LIBRARY_PATH环境变量
如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在 /etc/ld.so.conf 中加路径(或者是没有权限加路径). 那可以 export 一个全局变量 LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH 的意思是告诉 loader 在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个 mysql 到 /usr/local/mysql 目录下, 其中有一大堆库文件在 /usr/local/mysql/lib 下面, 则可以在 .bashrc 或 bash_profile 或 shell 里加入以下语句即可:
1、打开Terminal(终端) 2、输入:vi ~/.bash_profile 3、设置LD_LIBRARY_PATH:export LD_LIBRARY_PATH=/opt:LD_LIBRARY_PATH 4、输入::wq //保存并退出vi 5、修改立即生效:source ~/.bash_profile 6、查看环境变量的值:echo LD_LIBRARY_PATH 7、如果bash_profile存在的情况下,可以通过open ~/.bash_profile的命令打开,编辑好后再执行5的方式
注意⚠️: 1、~/.bash_profile中有个点 2、如果是新增环境变量或者是修改环境变量的值,都需要source一下才能立即生效。如果是删除一个环境变量,必须输入exit以logout当前shell,然后再重新打开一个新的shell并login才能生
但是个人认为使用第四种方法比较好(虽然我是用第一个方法解决的),应该这样可以一劳永逸
但是近期收到很多小伙伴的留言和私聊,以上方法貌似还不能完全解决部分同学的问题,正好最近在协助一个同学解决同款问题,等解决了,我再来更新最新的解决办法。
1.根据提示获得找不到路径的共享库的安装路径,使用locate命令,先用updatedb更新locate的索引库“/var/lib/mlocate/mlocate.db”,然后locate xxx.so查找,比如自动编译安装的库文件放在/usr/local/lib;
2.修改/etc/ld.so.conf,在文本结尾添加路径即可,比如加一行/usr/local/lib。
3.使用ldconfig更新记录系统中so文件的缓存文件“/etc/ld.so.cache”。