Matthew Note

Linux Command Notes

stat

可以用stat命令,查看某个文件的inode信息

mount

mount a dir

  • -t 指定文件系统类型,通常可以不指定,除了一些特殊的比如, smbfs, tmpfs, proc, sysfs等等
  • -bind 通常来讲mount是mount一个设备到文件目录,但是同样可以使用bind来mount一个目录到另一个目录
  • -o 代表 option,
    1
    2
    mount -o bind
    mount -bind

mount一个网络共享文件夹

1
mount //10.103.226.143/abc /mnt/net

这个对Ubuntu和Mint有效,有些情况下可能需要指定文件系统格式

-t smbfs -o username=root, password=pass

umount a busy device

1
umount -l unpacked/rbe

-l 代表lazy,可以强制umount一个device,如果依旧不行,可以尝试用

1
2
3
lsof | grep unpacked/rbe
//或者
fuser a file

来查找具体是谁占用了,Kill他

skip an existed dir

1
mkdir -p dir1
1
2
ln file1 file2
ln -s file1 file2

hard link and soft link

X windows

X Windows包含几个部分:

  • X server, 主要用于和硬件打交道,把绘图展示到显示器上
  • X client,关注与如何绘图,和绘制什么样的图形,一个完全抽象出来的脱离硬件的层面
  • Display manager, 用来管理多个Xclient绘制的窗口,最常见的有gdm,lightdm,sddm(kde), twm,i3block等

调整分辨率

1
2
xrandr -l
xrandr -s 1280x960

分辨率需要驱动支持,如果不支持会报错。 对于VBOX和VM,需要先安装VBOX tools和vmware-tools
有些时候需要更改显示驱动,在Xorg.conf中,虚拟机和服务器大多默认vesa

Console/Terminal

这是两个很容易混淆的概念,Console通常指的是一个串行借口,Terminal通常指的是一个Bash, Console通常会启动一个Bash

  • Console分为两种,ttyX和ttySX, 前者是一个逻辑上的Console,后者是物理上的Serial Console,Console的相关设置,可以在Grub这类工具中设置,Linux中通常是使用tty了,如果你有个COM口,那么可以用ttyS
  • 系统在启动的时候inittab中会设置,通过getty来获得一个console
  • Text Console的分辨率就不能用xrandr了,可以在grub中通过vga=ask/ID来设置,具体ID取决于硬件支持
  • stty可以设置tty相关属性,比如对应快捷键

权限操作

  • adduser
  • addgroup 加user到group
  • groupadd 新建一个group
  • usermod 可以改变user的属性,比如属于哪个Group,注意group改完要重新gdm进去才能生效

SElinux

是一个更高级的权限管理,可以避免一个有很高权限的程序随意访问文件系统,比如httpd,一个普通用户可以操作httpd来访问root权限的目录

DNS lookup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
sslvpn:~# host -a baidu.com
Trying "baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53987
;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 7
;; QUESTION SECTION:
;baidu.com. IN ANY
;; ANSWER SECTION:
baidu.com. 462 IN A 123.125.114.144
baidu.com. 462 IN A 220.181.111.85
baidu.com. 462 IN A 220.181.111.86
baidu.com. 86262 IN NS ns4.baidu.com.
baidu.com. 86262 IN NS dns.baidu.com.
baidu.com. 86262 IN NS ns3.baidu.com.
baidu.com. 86262 IN NS ns2.baidu.com.
baidu.com. 86262 IN NS ns7.baidu.com.
baidu.com. 7062 IN SOA dns.baidu.com. sa.baidu.com. 2012120775 300 300 2592000 7200
baidu.com. 7062 IN MX 20 mx1.baidu.com.
baidu.com. 7062 IN MX 20 jpmx.baidu.com.
baidu.com. 7062 IN MX 20 mx50.baidu.com.
baidu.com. 7062 IN MX 10 mx.n.shifen.com.
baidu.com. 7062 IN TXT "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com a mx ptr ~all"
;; ADDITIONAL SECTION:
ns4.baidu.com. 86262 IN A 220.181.38.10
dns.baidu.com. 86262 IN A 202.108.22.220
ns3.baidu.com. 86262 IN A 220.181.37.10
ns2.baidu.com. 86262 IN A 61.135.165.235
ns7.baidu.com. 86085 IN A 119.75.219.82
mx1.baidu.com. 162 IN A 61.135.163.61
jpmx.baidu.com. 7062 IN A 61.208.132.13
Received 508 bytes from 10.8.85.239#53 in 218 ms

man

1
2
3
4
5
6
7
8
9
man --regex ‘convert’
--Man-- next: gsettings-schema-convert(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: tapconvert(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: 2to3(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: 2to3-3.2(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: addr2line(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: atobm(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: b2m(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
--Man-- next: bdftopcf(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

查看所有convert相关的手册

Source

1
source /root/.bashrc

查看程序依赖关系

1
2
3
4
5
6
7
8
ldd /usr/bin/openssl
linux-vdso.so.1 => (0x00007fffcd05c000)
libssl.so.1.0.0 => /tip/bldfs/usr/lib/libssl.so.1.0.0 (0x00007fe45fb99000)
libcrypto.so.1.0.0 => /tip/bldfs/usr/lib/libcrypto.so.1.0.0 (0x00007fe45f7b1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe45f5aa000)
libz.so.1 => /tip/bldfs/usr/lib/libz.so.1 (0x00007fe45f394000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe45f009000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe45fe07000)

nm

查看库文件导出symbol

1
2
3
4
objdump -T /usr/lib/libcrypto.so.1.0.0| grep EVP_rc4
00000000000fbe20 g DF .text 0000000000000008 OPENSSL_1.0.0 EVP_rc4
00000000001086e0 g DF .text 0000000000000008 OPENSSL_1.0.1 EVP_rc4_hmac_md5
00000000000fbe30 g DF .text 0000000000000008 OPENSSL_1.0.0 EVP_rc4_40

RBE编译问题

1
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH

由于有两个libcrypto.so.1.0.0,分别在/tip/bldfs/usr/lib/里和/usr/lib/x86_64-linux-gnu, 两个版本不同 一个为1.0.0 一个为1.0.1 所以在使用ssl相关工具, 比如ssh,rsync时候会显示找不到symbol,这时需要手动设置LD_LIBRARY_PATH

  • LIBRARY_PATH is used by gcc before compilation to search for directories containing libraries that need to be linked to your program.
  • LD_LIBRARY_PATH is used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

程序栈最大大小

1
ulimit -s

查看每个目录硬盘占的空间

1
2
3
du -sm
df -ah //查看各个盘空间
fdiks -l

作业控制

1
2
3
4
5
6
7
8
9
/usr/bin/policyserver&
(kili64-rbe)shgao-virtual-machine:/tip/src/avt/gentoo# jobs
[1]+ Stopped /usr/local/extranet/bin/policyserver -f --logserverport 0
(kili64-rbe)shgao-virtual-machine:/tip/src/avt/gentoo# bg 1
[1]+ /usr/local/extranet/bin/policyserver -f --logserverport 0 &
(kili64-rbe)shgao-virtual-machine:/tip/src/avt/gentoo# jobs
[1]+ Running /usr/local/extranet/bin/policyserver -f --logserverport 0 &
(kili64-rbe)shgao-virtual-machine:/tip/src/avt/gentoo#
  • ctrl+z 暂停并放到后台
  • 程序后面加上&,使之自动在后台运行
  • bg 将一个在后台暂停的命令,变成继续执行
  • fg 将后台中的命令调至前台继续运行
  • kill %num num不是PID

ldconfig

1
ldconfig -v

ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接 库的管理命令--ldconfig ldconfig 命令的用途,主要是在默认搜寻目录(/lib/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. 他的存在是为了程序可以更快的load相关的lib,相当于一个cache

chkconfig

1
2
3
4
5
6
7
shgao@shgao-virtual-machine:~/workplace/Firmware/EXSeriesVPN$ chkconfig --list
acpi-support 0:off 1:off 2:on 3:on 4:on 5:on 6:off
acpid 0:off 1:off 2:off 3:off 4:off 5:off 6:off
alsa-restore 0:off 1:off 2:off 3:off 4:off 5:off 6:off
alsa-store 0:off 1:off 2:off 3:off 4:off 5:off 6:off
anacron 0:off 1:off 2:off 3:off 4:off 5:off 6:off
apparmor 0:off 1:off 2:off 3:off 4:off 5:off 6:off S:on
  • –add 新增所指定的系统服务
  • –del 删除所指定的系统服务
  • –level 指定该系统服务要在哪个执行等级中开启或关闭
  • –list 列出当前可从chkconfig指令管理的所有系统服务和等级代号
  • on/off/reset 在指定的执行登记,开启/关闭/重置该系统服务

正则表达式

  • +表示重复一次或多次
  • [] 中的字符不需要转义,就表示本义
  • ?: 告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。
  • +: 告诉引擎匹配前导字符1次或多次
  • *: 告诉引擎匹配前导字符0次或多次
  • {}: 表示前导字符重复的次数
  • (): 组(向后引用)
  • . 匹配任意字符(除了\n)
  • \b 匹配单词边界
  • \B 匹配非单词边界
  • |cat|dog,与[]相似,但是[]只能匹配一个字符
  • \w 匹配一个单词
  • \W 匹配任何非单词的字符
  • (?>正则表达式) :阻止海量回溯
  • 正则表达式具有贪婪性,可以用在?,+,*,{}之后加一个?来实现这一点,或者靠取反:<[^>]+>
  • 在字符集[]中, 除了]\^-需要转义,其他都不用转义,当然转义也不会错

向后引用:

1
2
3
grep -E '(\w)\1' /var/log/test
3 rrrr
135 nnn

Grep

1
2
3
4
grep -En "\-j" Makefile
grep -En '\-j' Makefile
grep -Ev ' ps [0-9a-z]* Debug 3 ' ap_ps.log > ap_ps_rip_debug3.log
  • 双引号会先解析其中的变量和命令
  • 单引号是原样匹配
  • \ 转义,不要记错…
  • -A 5 向后5行
  • -B 5 向前5行
  • -C 5 前后各5行
  • -H 显示文件名
  • -v 取反

awk

1
2
awk -F' ' '$5="ap" {print NR ":" $(NF) }' /var/log/aventail/access_servers.log
awk '{if(NF>=6){for (i=5;i<=NF;i++)printf("%s ", $i);printf "\n"}}' tmp.log //输出第六列之后所有列
  • -F 表示分隔符
  • $5 表示第五个
  • NR 表示行号,内嵌
  • NF 表示每行有几个分割域

sed

1
sed ‘s/^[A-Z]*/replace/g’
  • g 表示global

strace

记录命令的系统调用,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#strace echo “abc”
execve("/bin/echo", ["echo", "aa"], [/* 36 vars */]) = 0
brk(0) = 0x882000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3275000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=66284, ...}) = 0
mmap(NULL, 66284, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2ca3264000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1811128, ...}) = 0
mmap(NULL, 3925208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2ca2c96000
mprotect(0x7f2ca2e4b000, 2093056, PROT_NONE) = 0
mmap(0x7f2ca304a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b4000) = 0x7f2ca304a000
mmap(0x7f2ca3050000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3050000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3263000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3262000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3261000
arch_prctl(ARCH_SET_FS, 0x7f2ca3262700) = 0
mprotect(0x7f2ca304a000, 16384, PROT_READ) = 0
mprotect(0x605000, 4096, PROT_READ) = 0
mprotect(0x7f2ca3277000, 4096, PROT_READ) = 0
munmap(0x7f2ca3264000, 66284) = 0
brk(0) = 0x882000
brk(0x8a3000) = 0x8a3000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=7220736, ...}) = 0
mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2ca25b3000
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ca3274000
write(1, "aa\n", 3aa
) = 3
close(1) = 0
munmap(0x7f2ca3274000, 4096) = 0
close(2) = 0
exit_group(0) = ?

各种重定向

1
2
3
4
5
6
7
8
9
10
xmlread /home/xxx/abc/xml 2>&1
find . -type d -depth 1 | xargs -I % tar cvzf %.tar.gz %
tar cvf - /dir | tar xvf - -C /somewhere
cat > new_file << fuckend
write something
blabla
fuckend

update-alternatives

1
2
3
4
5
6
7
8
9
10
11
root@shgao-virtual-machine:~# update-alternatives --config nc
There are 2 choices for the alternative nc (providing /bin/nc).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nc.openbsd 50 auto mode
1 /bin/nc.openbsd 50 manual mode
2 /bin/nc.traditional 10 manual mode
Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /bin/nc.traditional to provide /bin/nc (nc) in manual mode.

Network Tools

  • netcat
  • curl
  • wget
  • ngrep

解决windows下编辑文件结尾有^M问题

^M 实际上就是\r, 如果键盘输入要用C-vC-m来输入

  • 解决方法一:安装一个dos2unix,可以转换文本
  • 解决方法二:source insight 中Preference->Files设置文件结尾

Grub rescue

1
2
3
4
5
6
7
8
grub rescue>set root=(hd1,msdos1)
grub rescue>set prefix=(hd1,msdos1)/boot/grub
grub rescue>insmod /boot/grub/i386-pc/normal.mod
grub rescue>normal
//之后进入了grub>
grub>linux /boot/bzImage //加载linux kernel
grub>initrd /boot/initrd.gz //加载启动
grub>boot
  • grub vga=ask/ID 可以设置text terminal分辨率

重新创建xorg.conf

有些时候xorg.conf的配置会别改坏,用如下方法可以生成一个新的xorg.conf

1.switch to console mode: Alt+Ctrl+F1

2.kill x server: sudo service lightdm stop

3.generate new xorg.conf file: sudo X -configure – this will create xorg.conf.new file in your current dir

4.rename and move: sudo mv xorg.conf.new /etc/X11/xorg.conf

5.return to GUI: sudo start lightdm

vnc4server

1
2
# vnc4server :1 //启动一个vnc display
# vnc4server -kill :1

查看硬件状态

1
2
lscpu
lshw -C display //查看显卡

网络配置

1
2
ifconfig eth0 10.103.250.11 netmask 255.255.255.0
route add default gw 10.103.250.1
  • DNS 配置在 /etc/resolv.conf
  • /etc/hosts
  • /etc/hostname

echo

echo -e 可以输出转义字符例如 echo -e "abc\ndef"> file, 注意有些shell支持的不好,比如sh(会把-e 一同输出出去),bash支持良好,最好的办法还是用printf命令替代echo -e, 注意printf命令不支持浮点类型

pipe

popen, pclose - pipe stream to or from a process

1
2
3
4
5
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

pipe 实际上是fork了一个子进程来运行,所以调用popen运行的命令和主程序share同一套文件描述符

popen 打开的fp不能rewind(), 只有文件可以rewind 而pipe是一个流Stream

xmllint

xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令,下面整理一些常用功能

  • –format 此参数用于格式化xml,使其具有良好的可读性。
  • –noblanks 与–format相反,有时为了节省传输量,我们希望去掉xml中的空白,这时我们可以使用–noblanks命令
  • –schema 使用scheam验证xml文件的正确性 xmllint --schema person.xsd person.xml

共享库的兼容问题

动态链接库一般以lib开头,形如libmymodule.so.1.0.0. 后面跟的三个版本号,从左到右的含义为:

1) 大版本号,当接口变得和之前不兼容,则新增一个大版本号。
2) 一般增加了接口,不过旧的接口不变,则新增此版本号。
3) 接口不做任何变化,只是实现做了修改,则新增此版本号。

可以用ldconfig来设置程序对应的lib版本

1
nm policyserver //查看导出符号

PATH

每个shell都有自己的PATH,从这个shell运行的程序共享这个shell的PATH, 如果需要永久性保存一个PATH,则需要在/etc/profile或者~/.bashrc_profile中加入export PATH=/xxx/yyy:$PATH

openssl生成证书

  1. 用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。
  2. 服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。
  3. 客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。
  4. 客户端浏览器为本次会话生成div-master secret,并将其用服务器公钥加密后发送给服务器。
  5. 如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。
  6. 如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的div-master secret,并用它通过某些算法生成本次会话的master secret。
  7. 客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。
  8. 客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。
  9. 服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。
  10. 本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。
1
2
3
4
5
6
7
8
9
10
11
12
13
//生成CA根证书及私钥
mkdir demoCA && cd demoCA && mkdir private crl certs newcerts #新建证书存放目录
echo '00' > serial #新建serial文件并写入初始序列号00
touch index.txt #新建index.txt空文件
openssl genrsa -out private/cakey.pem 1024 #生成CA根证书私钥
openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成CA根证书,注意如果不是-x509生成的是一个证书的request,还要自签名CA: openssl ca -selfsign xxxxxxxxxxx
//生成服务器证书私钥、证书,可用于https服务器
openssl genrsa -out private/server.key 1024
openssl req -new -key private/server.key -out crl/server.csr #生成证书请求文件,可提供认证CA签核,或自签名。
//在这之前,你可能需要修改配置`/usr/lib/ssl/openssl.cnf`指定CA的位置, 否则退回上一级执行这个
cd .. && openssl ca -in ./demoCA/crl/server.csr -out ./demoCA/certs/server.crt #自签名证书
openssl pkcs12 -export -clcerts -in certs/server.crt -inkey private/server.key -out server.p12

PKCS#12包含私钥,所以在需要客户端验证的时候要用PKCS证书,而crt不包含私钥

  • 证书通常包含三种,CA证书,server证书,client证书
  • server和client证书(两者实际上可以互换)都是有CA签发的(应包含私钥),如果是crt格式其中是只有他的一个公共证书和公钥,PKCS#12可以包含私钥和公共证书
  • 也可以没有CA证书,server和client自签名自己的证书
  • x509是一个证书格式,不是一个算法
  • 证书是一个链,包含从根CA到用户cert所有证书,验证的时候要逐一验证。

CA的类别

  • 自签名 CA: 在自签名 CA 中,证书中的公钥和用于验证证书的密钥是相同的。一些自签名 CA 是根 CA(参见第三项)。
  • 从属 CA: 在从属 CA 中,证书中的公钥和用于核实证书的密钥是不同的。一个 CA 向另一个 CA 颁发证书的过程叫做 交叉认证 。
  • 根 CA: 根 CA 是一种特殊的 CA,它受到客户无条件地信任,位于证书层次结构的最高层。所有证书链均终止于根 CA。根颁发机构必须对它自己的证书签名,因为在证书层次结构中再也没有更高的认证机构了。
  • 所有自签名 CA 都是根 CA,因为到自签名 CA 时证书链就终止了。

vino

No security type 问题解决方法

1
gsettings set org.gnome.Vino require-encryption false

UNIX socket上限

在使用Nginx+gunicorn+web.py unix socket方式时候,发现nginx会报“connect() to unix:/dev/shm/fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream” 原因是需要修改如下:

1
2
cat /proc/sys/net/core/somaxconn //默认是128,定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数
echo 8192 > /proc/sys/net/core/somaxconn //放到/etc/rc.local中

Reference of /proc/sys/net/core

mv tip

1
2
3
4
5
mkdir folder1
mkdir folder2
touch folder1/file1
touch folder2/file2
mv -f folder1 folder2

这个时候folder1会成为folder2的一个子文件夹,而如果两个都是空文件夹的时候,才会是重命名到folder2

僵尸进程

It’s a process that is dead, but its parent was busy doing some other work, hence it could not collect the child’s exit status.

environment

系统启动时候加载/etc/environment, 登陆时加载/etc/profile,针对每个用户的加载~/.profile, 对于non-login-shell, 读取~/.bashrc

exec

使用现有shell运行程序, 而不是作为子进程

sys, proc, tmpfs

The sysfs filesystem was mentioned briefly above. One may wonder how sysfs knows about the devices present on a system and what device numbers should be used for them. Drivers that have been compiled into the kernel directly register their objects with a sysfs (devtmpfs internally) as they are detected by the kernel. For drivers compiled as modules, this registration will happen when the module is loaded. Once the sysfs filesystem is mounted (on /sys), data which the drivers register with sysfs are available to userspace processes and to udevd for processing (including modifications to device nodes).

  • With the development of the unstable 2.5 kernel tree, later released as the 2.6 series of stable kernels, a new virtual filesystem called sysfs came to be. The job of sysfs is to export a view of the system’s hardware configuration to userspace processes. With this userspace-visible representation, the possibility of developing a userspace replacement for devfs became much more realistic.

Driver

Linux的driver是根据一个设备ID来匹配kernel module的

udev

通常来说linux不能保证多个同样的设备每次在被创建文件的时候对应同一个文件名,所以我们可以在/etc/udev/rules.d/中创建相关配置

  • Using the Udev method, only those devices which are detected by the kernel get device nodes created for them. Because these device nodes will be created each time the system boots, they will be stored on a devtmpfs file system (a virtual file system that resides entirely in system memory). Device nodes do not require much space, so the memory that is used is negligible

交叉编译

  • –with-sysroot=$LFS For cross compilation, this tells the build system to look in $LFS for the target system libraries as needed.
  • –target=$LFS_TGT Because the machine description in the LFS_TGT variable is slightly different than the value returned by the config.guess script, this switch will tell the configure script to adjust Binutil’s build system for building a cross linker
  • binutil, gcc, glibc 是比较关键的交叉编译部件,需要制定LFS_TGT, 可以用现有平台的编译器编译出对方平台的编译器

Reference of target, build, host

chroot

chroot之前要mount tmpfs proc 和 dev到新的root

常用命令

  • strip 可以去掉程序中的调试用的符号等
  • fuser 用来查谁用了哪个文件
  • vmstat 查看磁盘内存吞吐
  • free
  • ifstat
  • proc可以看到进程运行时的cmd和env
  • 管道中常用 ‘-’ 表示stdout或者stdin
  • cut -d “:” -f 2 :分割的第二个
  • cut -c 1-12 1-12个字符
  • strings 文件中打印字符串
  • tar 通常不会使用-P, 这样会把/目录包含进来,在extract的时候-C会不起作用
  • cpio 可以用来备份设备文件,不过要你指定每个文件,他不接受一个文件或者目录参数
  • dd if=xxx of=yyy bs=xbytes count=xxxx
  • time 统计运行时间: time [command] [args...]
  • tee stdin -> stdout, 也可以同时写入文件,叫双重重定向
  • tr 可以替换或者删除字段
  • ^foo^bar 替换上一条命令中的foo为bar然后执行
  • sudo !! 以sudo运行上一条
  • dpkg-reconfigure 重新配置一个已经安装过的安装包
  • oh-my-zsh 是个好东西,加上powerline味道更好哦
  • journalctl 查看systemd log

Process PID PPID SID PGID

查看这些可以用ps -ao pid,ppid,sid,pgid,comm, PGID是父进程的PID号,但是父进程的结束并不影响PGID, 组中的所有进程还是沿用同一个PGID,程序中可以对一个进程组来群发信号,SID会有些不同,同一个shell下运行的程序都同属于一个Session,这个Session Leader挂了会导致所有session中的程序退出,所以根据这个我们可以再程序中使用setsid来新建一个新的session,这样程序就不会因为session leader的退出而退出,这也是daemon的基本原理

gsettings

GSettings configuration tool

1
2
gsettings list-schema
gsettings set org.mate.session.required-components windowmanager marco

获取符号链接

1
readlink /proc/${pid}/exe

su and su -

进入超级用户模式。也就是输入su -,系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。(当然,你也可以直接用root用)
(注意有- ,这和su是不同的,在用命令su的时候只是切换到root,但没有把root的环境变量传过去,还是当前用户的环境变量,用su -命令将环境变量也一起带过去,就象和root登录一样)

for

  • for i in {1..10}; do ./elk_tester.py done

给重要文件加锁

只读权限示例:给重要文件加锁(添加不可修改位 immutable),以避免各种误操作带来的灾难性后果(例如 : rm -rf

1
2
3
4
5
6
7
8
$ chattr +i regular_file
$ lsattr regular_file
----i-------- regular_file
$ rm regular_file #加immutable位后就无法对文件进行任何“破坏性”的活动啦
rm: remove write-protected regular file `regular_file'? y
rm: cannot remove `regular_file': Operation not permitted
$ chattr -i regular_file #如果想对它进行常规操作,那么可以把这个位去掉
$ rm regular_file

主次设备号

主 (major)、次(minor)设备号的作用有不同。当一个设备文件被打开时,内核会根据主设备号(major number)去查找在内核中已经以主设备号注册的驱动(可以 cat /proc/devices 查看已经注册的驱动号和主设备号的对应情况),而次设备号(minor number)则是通过内核传递给了驱动本身(参考《The Linux Primer》第十章)。因此,对于内核而言,通过主设备号就可以找到对应的驱动去识别某个设备,而对于驱动而言,为了能够更复杂地访问设备,比如访问设备的不同部分(如硬件通过分区分成不同部分,而出现 hda1,hda2,hda3 等),比如产生不同要求的随机数(如 /dev/random/dev/urandom 等)。

locate省去打绝对路径

1
insmod `locate usbhid.ko`

GNU parallel

可以并行的处理Pipe

X windows Xsession 配置

/var/lib/AccountService/users/[username] 里面的xsession指定的,具体支持哪些xsession,查看这个目录/usr/share/xsessions/

systemd and upstart

  • "systemctl status networking.service" and "journalctl -xe" 可以查看服务启动的错误原因

upstart

upstart 没有 inittab, 所有的配置文件都在/etc/init/目录下,这些脚本是不可执行的,包含两种类型conf和override, rc-sysinit.conf是系统初始化的配置

  • man 8 init

find

  • find -maxdepth 1 -type f -exec ls -al {} \; 一个转译的;表示命令的结束,这个命令是针对每一个文件执行一次ls
  • find -maxdepth 1 -type f -exec ls -al {} + 这种情况文件只能加在命令尾部,被查到的文件被append到ls尾部,这个命令只执行一次ls

available memroy

Warning signs of a genuine low memory situation that you may want to look into:

  • available memory (or “free + buffers/cache”) is close to zero
  • swap used increases or fluctuates
  • dmesg | grep oom-killer shows the OutOfMemory-killer at work

How to force to release the cache

nice

top命令里有%ni,与此相关,nice命令可以修改进程的优先级,这样就可以让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤为有用。 nice值的取值范围是[-20,19],-20表示最高优先级,而19表示最低优先级。 Linux进程的默认nice值为0。使用nice命令(不带任何参数时)可以将进程的nice值设置为10。这样调度器就会将此进程视为较低优先级的进程,从而减少cpu资源的分配。

apropos

根据关键字找相关的指令

setuid, setgid

如果一个可执行文件setuid/gid那么他拥有可执行文件owner、group相同的权限, 如果文件是root,那么他具有和root一样的权限很危险

1
2
chmod u+s files
chmod g+s files

文件空洞

在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。
如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。