profile文件的错误加载与基本命令间的映射
一、绪论
【因为这篇心得是原创的,所以如果有哪处总结或者意见不足的地方,欢迎各位大神的批评和意见,共同学习,谢谢了!】
早些时候,需要在centos6.4系统中配置单机版和集群版单节点的hadoop HDFS,由于那时候一边跟老师学hadoop一边自学Linux。初学的自己懂得也不多,别人都用普通用户登录,在需要root权限时才sudo或者切换root用户进行配置,而我呢? 从一开始就使用了root登录,在给java和hadoop配置了profile文件环境变量,等到重启之后,出现了下图的现象:进入系统用户登录界面后,原本的鼠标小指针一直都是小时钟的样子,无论怎么点击都是能移动但是指针的形状偏偏就变不回来,也无法登录。
那无法登陆了,肿么办?下意识就问老师吧,可他说他也没碰到过这种奇怪的现象。也对,但凡是规范的操作又怎么会碰到我的这种现象呢?想必极为少数吧!没有了老师的帮助,那时候我一贯的做法就是:强制关机-重启=不行,正常关机-重启=不行,之后便干脆直接放弃了整个系统,启用新系统从头开始配置HDFS。这个鼠标指针变成小时钟而无法登陆的现象,到现在前前后后碰到不下十遍,也由此令我一直耿耿于心,希望这篇心得能帮到更多与我类似困窘的人吧!
这几个月来,其实,我一直都在追寻是什么原因导致的系统用户无法登陆,以及系统的各个配置文件都有些什么作用?下面先讲该怎么恢复系统的登录先吧!
二、恢复正常登录
profile文件的错误加载而导致系统用户无法登录的现象,主要有两类:profile文件的内容配置错误、profile文件在进行vi时被挂起。如果是profile文件的内容配置错误,解决的办法:一是删除所有自定义配置的内容,但这种方法个人很不推荐;二是没有加载系统变量。至于profile文件在进行vi时被挂起,解决的办法就是恢复该文件,再删除生成的临时挂起文件。
(1)加载系统变量恢复
1、切换到字符界面。可按Ctrl+Alt+F6,由用户图形界面切换到字符界面。
2、登陆用户。这里由于用户图形界面本身就是一个应用程序,而不是Linux内核的一部分,所以即使图形用户界面完完全全地崩溃了,也是丝毫不影响我们使用字符界面进行常规的操作。这里,因为是系统的登录界面损坏,所以建议登录最高权限用户root。
3、编辑profile文件。执行如下错误,查找并修改错误配置内容:
/usr/bin/vim /etc/profile
可以看到我这里缺少了明显的系统传递参数:$PATH 。需要注意的是:如果 export PATH= 后面有多个变量值,在值与值之间需要使用英文的“ : ”符号隔开。具体修改如下:
如果打开的profile文件中,已经存在了$PATH,那么导致图形界面无法进行用户登录的原因,很可能就是自定义部分的内容存在手动输入错误。如:缺少某个字符或者字符错误。倘若,仍然无法找到错误的根源,建议将所有自定义配置的内容进行删除。
4、保存退出后,输入一下内容进行重启,重启后便可恢复正常登录。
/usr/bin/reboot
如果不进行重启的话,也可以使用source命令让profile文件进行生效,但是不建议。因为这种方式容易导致profile文件的配置生效不完全。
(2)恢复挂起的profile文件
如果在配置profile文件内容时,中途断电或者强迫退出vim编辑,那么就会在/etc/目录下,临时生成profile.swp的隐藏文件,可以使用ll -a或者ls -a来查看是否存在.swp文件。在确保profile配置信息没有错误之后,记得删除该文件。删除的命令不再是" rm -rf profile.swp ",因为在profile文件错误加载的情况下rm命令不可直接使用,要在前面加上路径名称。具体的步骤类似上面的过程,区别在于第3步后,需要删除该隐藏文件再重启。
三、基本映射作用
没错,前面所执行的命令,如简单的重启:
/usr/bin/reboot
都在命令前加了路径名称。那么为什么需要加路径名称而不能直接使用呢?这和profile配置文件又有什么关联呢?如果每个命令都需要加前缀路径,这些前缀都相同吗?如果命令相同那么为什么执行下面的命令,会提示“No such file or directory”呢?
yang@cMaster:~]#/usr/bin/ls /etc/profile
bash: /usr/bin/ls: No such file or directory
(1)profile文件的映射类型
我们知道profile文件可进行环境变量的配置,那么对于命令的映射类型有两种:用户变量和系统变量,类似于我们win10的系统环境一样:
我们先看一下Linux系统下的$PATH都有哪些内容?使用前面修复过的系统,登录并进入命令终端,输入如下命令并查看返回信息:
yang@cMaster:~]#which $PATH
/usr/bin/which: no bin in (/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/java/jdk1.8.0_161/bin:/home/yang)
可见,“which”这个命令是属于/usr/bin/ 目录下的。至于每个常用的命令都在哪个目录下,这里先不讨论。我想说的是,我这里需要提出两个概念词,或许早有人为此下过定义,这里姑且暂用。我提出的概念是:权限比重、优先度。在权限比重方面,例如:“ /bin ”要比 “ /usr/local/bin ”权限大的多,但是“ /usr/local/bin ”的优先度级别比“ /bin ”还大。简而言之,就是用户登录系统后先使用的命令默认是 “ /usr/local/bin ”下的,当 “ /usr/local/bin ”找不到才到第二级别更高权限的“ /bin ”去找,这对于“/sbin”和“usr/sbin”一样的道理。这是对于单用户来说,如果我这里的yang用户需要root的权限,当sudo一下时,会跳出这些目录而去使用root用户“ /bin ”、 “ /usr/local/bin ”目录下的命令等等。
我们完全可以这样来假设,“ /bin ”和“/sbin”是系统环境下的指令库,而“ /usr/local/bin ”和“usr/sbin”为用户环境下的指令集。也就是,可以大胆地假设一下,对于centos6.4来说:每个Linux用户都存在一个系统环境和一个用户环境。
但其实在centos8里,“ /bin ”就是 “/usr/bin”的链接,“/sbin”也是 “/usr/sbin”的链接。
(2)profile文件的映射作用
1、root用户所定义下的profile环境内容,其他用户环境可继承性较大;
2、profile文件用于登录设置的全系统环境和启动程序。利用vi查看一下profile文件,内容如下:
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`id -u`
UID=`id -ru`
fi
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
将“# /etc/profile# System wide environment and startup programs, for login setup# Functions and aliases go in /etc/bashrc# It's NOT a good idea to change this file unless you know what you# are doing. It's much better to create a custom.sh shell script in# /etc/profile.d/ to make custom changes to your environment, as this# will prevent the need for merging in future updates.”粘贴到百度翻译一下:
这也恰恰说明了,为什么profile文件配置不好,会出现鼠标指针变成小时钟而无法登陆的现象。
3、profile配置文件所自定义的内容,如:export PATH= 后面必须必须跟随传递参数:$PATH 。当不配置export PATH=的值时,$PATH为隐藏属性。当export PATH=的值被配置时,$PATH的作用是将“ /bin ”、“/sbin”、“ /usr/local/bin ”和“usr/sbin”等目录下的命令进行聚集和简化路径。这也正是,为什么当profile配置文件损坏时,必须在命令前加路径名称的缘故。但是每个命令的路径名称又是什么呢?
(3)常用命令的映射目录
还记得前边说到的,在profile文件不起作用时,要删除profile挂起的临时文件,必须要在rm命令的前面加了上命令的路径名称,不然会提示No such file or directory相类似的错误。当which $PATH一下,也看到过列举了一些路径,我们逐个进去看看:
yang@cMaster:~]#ll /usr/local/bin
total 0