[关闭]
@xtccc 2018-03-16T16:16:30.000000Z 字数 5370 阅读 3177

Linux常见问题

Linux




1 关于User Account


1.1 修改账户的user id

CDH安装好后,会存在hdfsmapredhbase等账户。
由于在为CDH添加了Kerberos的支持后,如果某个账户的user id 小于1000,则该账户无法提交job。因此,在停止了集群的Hadoop服务后,我将hdfs账户的user id由原来的『496』更改成了『1100』:

  1. usermod -u 1100 hdfs

以上命令在集群的所有节点上执行。

然后,我重新启动HDFS服务时,启动失败了。去查看有关的日志目录,如下:

[root@hadoop5 ~]# ll /data/var/log/hadoop-hdfs/
total 140
drwx------   2   496 hdfs 4096      Jun 5    08:39 audit
-rw-------    1   root root 132052  Sep 19  23:35 jsvc.err
-rw-------    1   root root 0            Sep 18  16:36 jsvc.out
drwxr-xr-x 2   496 hdfs 4096      Mar 31  14:23 stacks

可见,这里的问题是:在我修改hdfs账户的user id之前,/data/var/log/hadoop-hdfs/audit 目录的owner显示为『hdfs』;在我通过usermod -u 1100 hdfshdfs账户的user id改为『1100』后,这个目录的owner就显示为『496』(这是hdfs账户原来的user id),而不是『hdfs』了。为什么?

先来看看关于 usermod -u 的说明:

-u, --uid UID
The new numerical value of the user´s ID.

      This value must be unique, unless the -o option is used. The value must be non-negative. Values between 0 and 999 are typically reserved for system accounts.

      The user´s mailbox, and any files which the user owns and which are located in the user´s home directory will have the file user ID changed automatically.

      The ownership of files outside of the user´s home directory must be fixed manually.

现在原因就很清楚了:在用usermod -u 1100 hdfs改变了用户『hdfs』的user id之后,只有其家目录下的文件的owner能够保持『hdfs』,其他的文件/目录的owner都会保持之前owner的user id (这里就是496)。

对于家目录之外的文件,只好去一一手动地修改他们的owner了。




2 用df与du计算目录的已用空间,结果不一致


参考


  1. [root@hadoop4 ~]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/xvda1 20G 7.5G 12G 40% /
  4. tmpfs 16G 0 16G 0% /dev/shm
  5. /dev/xvdb 1008G 813G 144G 85% /data
  6. cm_processes 16G 91M 16G 1% /var/run/cloudera-scm-agent/process
  7. [root@hadoop4 ~]# ll /data/
  8. total 32
  9. drwxr-xr-x 5 root root 4096 Apr 14 2015 data
  10. drwx------ 2 root root 16384 Mar 10 2015 lost+found
  11. drwxr-xr-x 3 root root 4096 Mar 19 2015 soft
  12. drwxrwxrwt 2 hdfs hdfs 4096 Mar 31 2015 tmp
  13. drwxr-xr-x 5 root root 4096 Jul 2 14:39 var
  14. [root@hadoop4 ~]# du -sh /data/data/
  15. 51G /data/data/
  16. [root@hadoop4 ~]# du -sh /data/lost+found/
  17. 16K /data/lost+found/
  18. [root@hadoop4 ~]# du -sh /data/soft/
  19. 421M /data/soft/
  20. [root@hadoop4 ~]# du -sh /data/tmp/
  21. 4.0K /data/tmp/
  22. [root@hadoop4 ~]# du -sh /data/var
  23. 8.3G /data/var

用命令df -h 可以看出: 目录 /data使用了813GB的磁盘空间,但是/data下的每一个子目录所占据的磁盘空间只和却只有60GB左右。两者为什么相差这么大?

这是因为:有些文件被一些进程打开了,我直接删除了这些文件,但是没有关闭进程,导致这些文件依然是打开的状态。

通过命令 lsof | grep deleted 可以看出这些被打开的文件。

解决方法:关闭这些进程。




3. 降序列出所有目录的占用空间


参考 List Folder and File Size and Sort By Size on Linux

如果我想看看/data/opt/cloudera下的所有一级子目录占用的磁盘空间大小,并且按照逆序排列,则可以使用命令:

  1. du -shBM /data/opt/cloudera/ | sort -nr

输出如下:

  1. # du -shBM /data/opt/cloudera/* | sort -nr
  2. 2917M /data/opt/cloudera/parcel-repo
  3. 2029M /data/opt/cloudera/parcels
  4. 1487M /data/opt/cloudera/parcel-cache
  5. 1M /data/opt/cloudera/csd




4. 无秘钥ssh登录


参考:




5. 允许以root身份进行无秘钥SSH登录


5.1 问题与需求

我们的AWS Spot Instance,在创建好了之后只能通过如下的方式进行SSH:

  1. $ ssh -i <path-to-key.pem> ec2-user@<instance-ip>



现在我们希望能够在机器A上以root身份直接无秘钥登录进机器B,但是如果我们执行命令:

  1. $ sudo su
  2. $ ssh -i ~/.ssh/<key.pem> root@<IP_A>
  3. Please login as the user "ec2-user" rather than the user "root".
  4. Connection to <IP_A> closed.

机器B不允许我们以root身份进行SSH登录,即使我们有正确的key.pem文件(里面的内容是RSA Private Key)。

5.2 修改authorized_keys文件

我们看看机器B的/root/.ssh目录下有什么文件?

  1. $ ls /root/.ssh
  2. total 4
  3. -rw------- 1 root root 550 Nov 15 07:46 authorized_keys
  4. $ cat /root/.ssh/authorized_keys
  5. no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10" ssh-rsa xxx<这里是private key>xxx akka_oregon

可以看出,/root/.ssh/authorized_keys里面包含了public key(A机器上的key.pem文件内容是对应的private key,akka_oregon是我们在AWS上创建spot instance时指定的key name,它对应着key.pem),但是从他的内容中我们又能看到“Please login as the user \"ec2-user\" rather than the user \"root\"”,即它不允许我们以root身份登录。

所以,将它修改为:

  1. ssh-rsa xxx<这里是private key>xxx



5.3 修改sshd_config文件

再看看B机器的/etc/ssh/sshd_config文件内容,会发现如下几行内容:

  1. #PermitRootLogin yes
  2. # Only allow root to run commands over ssh, no shell
  3. PermitRootLogin forced-commands-only
  4. #RSAAuthentication yes
  5. #PubkeyAuthentication yes

需要将其进行如下修改:

  1. PermitRootLogin yes
  2. # Only allow root to run commands over ssh, no shell
  3. # PermitRootLogin forced-commands-only
  4. RSAAuthentication yes
  5. PubkeyAuthentication yes


5.4 重启sshd服务

B机器(被登录host)上的文件已经修改好了,现在需要重启上面的sshd服务:

  1. $ service sshd restart


5.5 添加id_rsa文件

B机器已经好了,现在在A机器上添加一个private key,将其放入A机器的文件/root/.ssh/id_rsa中。其中的内容就是我们在创建spot instance时指定的key.pem文件的内容,这实际上是私钥。

同时,还要将该文件的权限设置为600。

5.6 测试

现在,在A机器上以root身份键入命令:

  1. $ ssh root@<ip_B>
  2. Last login: Tue Nov 15 12:39:52 2016
  3. __| __|_ )
  4. _| ( / Amazon Linux AMI
  5. ___|\___|___|
  6. https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
  7. 4 package(s) needed for security, out of 6 available
  8. Run "sudo yum update" to apply all updates.
  9. [root@ip_B ~]$

成功。




6. 使用Rolling File


防止文件/etc/logrotate.d/tape,文件的内容形式如下:

  1. /path/to/my.log {
  2. #指定转储周期为每天
  3. daily
  4. missingok
  5. #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  6. rotate 5
  7. compress
  8. delaycompress
  9. #如果是空文件的话,不转储
  10. notifempty
  11. }

其中,第一行 /path/to/my.log 是将被Roll的目标文件,也可以用*来匹配文件类型,如 /path/to/*.log




7. 修改max open files / max processes 限制


默认的比较小,是4096,对于很多service而言是太小了。
下面介绍怎样单独修改某个serveice的最大打开文件数的限制。注意,只对某个service生效
这里介绍在centos7(支持systemd),以rabbitmq-server为例说明怎样修改配置。

7.1 查看配置

在安装好rabbitmq-server之后,可以查看它的当前配置:

rabbitmqctl status

它可以输出rabbitmq-server的当前配置:

  1. ...
  2. {file_descriptors,
  3. [{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},
  4. ...


也可以通过这个命令来看这个进程的配置:

  1. $ cat /proc/19520/limits
  2. cat /proc/19520/limits
  3. Limit Soft Limit Hard Limit Units
  4. ...
  5. ...
  6. Max open files 1024 4096 files
  7. ...
  8. ...


7.2 修改配置

修改/etc/security/limits.d/20-nproc.conf文件
取消非root用户的nproc限制

  1. * soft nproc unlimited
  2. root soft nproc unlimited


修改/usr/lib/systemd/system/rabbitmq-server.service文件

增加:

  1. LimitCORE=infinity
  2. LimitNOFILE=95536
  3. LimitNPROC=100000

运行以下命令让其生效:

systemctl daemon-reload
systemctl restart rabbitmq-server


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注