题记: 学习要细心
缘起:ssh 的免密登录方式很方便,但是很多苛刻的要求你可能很少会去注意,一旦遇到,你会很郁闷,这里记录一下
- 私钥必须属主是自己,mode为600,否则不会被参考
- 公钥在服务器上必须不能被其它用户可写,不仅仅是文件本身,也包括任何层级的父目录
DevOps
题记: 学习要细心
缘起:ssh 的免密登录方式很方便,但是很多苛刻的要求你可能很少会去注意,一旦遇到,你会很郁闷,这里记录一下
将写在一行的脚本推到后台执行,切换到前台的时候,居然是做了“格式化”了…
题记: cgroup早该学习了
缘起:
几十台虚拟机,没有资源限制,宿主机经常挂掉,不知道因为啥。
该看看cgroup了
1 2 3 |
# yum install libcgroup # chkconfig cgconfig on # chkconfig cgred on |
1 2 3 4 5 6 |
group vagrant{ cpuset { cpuset.cpus = "0,1"; cpuset.mems = "0"; } } |
1 |
*:/usr/bin/vagrant * vagrant |
1 2 |
# /etc/init.d/cgconfig restart # /etc/init.d/cgred restart |
libcgroup 工作方式:
参考:
题记: 学习要细心
曾经,在php中要创建一个权限为 0777的目录:
1 2 |
<?php mkdir("/tmp/abc", 0777); |
应该问题不大,写完就交差了,测也不测;后来发现,创建的目录是 0755的,再检查一遍代码,确认是0777,不可能错的!可能是谁给修改成0755了吧?然后就做别的去了…
终于有一天,同事遇到了同样的问题,叫我过去看看,猜测可能和umask有关系,修改umask=0000(零零零零)后,终于创建出了0777的目录了,果然和umask有关系,有点儿坑die吧?
难道是PHP中添加了这种奇怪的逻辑? (写C的同学不要笑我,俺没写过C)
查看PHP源代码,发现PHP的mkdir直接调用的是glibc中的mkdir,没有做任何特殊处理,那么?
man 2 mkdir
有如下描述:
问题真相大白了。
我们知道命令行的mkdir -m 0777 能创建出来777的目录,难道命令行的mkdir用的不是glibc的mkdir?不太可能,参看: mkdir –help
很有可能mkdir在创建目录之后,chmod修改了目录的权限
系统cpu占用 100% ,但是没有一个进程使用cpu很高,如下:
祭出 vmstat 看看吧:
in/cs 都很高
结果发现有类似下面的一个程序:
1 2 3 4 5 6 7 8 |
#!/bin/bash #真实的程序没这么简单,不管怎样,是有一个分支没考虑到,没有写sleep if [ -e /tmp/my_test_file ];then sleep 1 sh $0 & exit 1 fi sh $0 & |
于是当 /tmp/my_test_file 不存在时,程序在拼命地”生孩子<=>死掉”;于是,你不知道那个进程占用cpu很高,你只知道cpu被用光了
号称阿里云的SLB可以处理syn-flood攻击,如何实现的呢?
猜想:
阿里云的SLB在做tcp代理时,如果能在和client端tcp握手成功之后,再和后端服务器进行tcp连接,然后进行正常的服务,这样不就可以很好地避免后端服务器遭受syn-flood攻击了吗?
测试:
如果符合猜想,则:SLB后端机器上不会看到syn请求;事实上看到了syn请求,于是,不符合猜想。
结论: SLB在做tcp代理时,不会在和client握手成功之后才向后端服务器发起tcp连接的。(可能那样会比较麻烦,可能需要处理序号之类的东西)
对于一个高级的tcp负载均衡设备来讲,当接到client的syn包后,就先去连接后端,如果后端能连接,再syn-ack给client,这样逻辑上是好的
mv是多么简单的一个命令啊,但是,获取有些东西你真的不知道。
一个同事mv big_dir_of_small_file to_other_disk ; 明明看着目标地址的空间使用在增加,但就是不见源地址的空间使用在减少,为什么呢?
lsof 查了一下,移走的文件没有立即删除。那就应该是全部移完之后再删除了。
因为文件实在太多,如果中断了程序,会是什么结果呢?
猜测:
参看: http://lingrok.org/xref/coreutils/src/mv.c
解疑:
其实代码很简单,就是先copy,最后在删除,根本没处理执行一半时被中断做何处理;所以,如果中断的话,就是:copy多少算多少,不删除任何文件。
几十台虚拟机需要修改root相关内容,只有一个普通账号的key,没有root的key,虽然普通账号可以sudo到root,但是脚本中的ssh使用sudo是不行的,于是,使用脚本生成一大堆命令行,手动粘贴执行,太low了
学点儿expect吧: http://www.cnblogs.com/iloveyoucc/archive/2012/05/11/2496433.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/usr/bin/expect -f set ipaddress [lindex $argv 0] set passwd vagrant set timeout 30 spawn ssh root@$ipaddress expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$passwd\r" } } expect "#" send "mkdir -p /tmp/testfile\r" expect "#" send "ls -l /tmp/testfile\r" expect "#" send "exit\r" send "exit\r" |
http://www.gnu.org/software/coreutils/coreutils.html
http://lingrok.org/xref/coreutils/ 这个看源码有高亮(但是跳转到定义还是不太好使)