设置console的分辨率
apt-get install hwinfo vim
-
hwinfo --framebuffer | grep --color 1280
确认有1280x1024x24bit的分辨率 -
vim /etc/default/grub
,然后把GRUB_CMDLINE_LINUX=""
这一行改成GRUB_CMDLINE_LINUX="vga=795"
,注意795是十进制的,hwinfo列出来的是十六进制的 update-grub
init 6
设置console的字体
-
ls /usr/share/consolefonts
看看有哪些支持的console字体 echo "setfont Uni2-TerminusBold20x10" >> ~/.bashrc
- . ~/.bashrc
获取某个命令如(useradd)所在的包
apt-get install apt-file
apt-file update
apt-file search useradd
- 如果已经知道了具体的路径,使用这个命令更快:
dpkg -S /usr/sbin/useradd
获取源码包
- 在
/etc/apt/source.list
中加入deb-src http://ftp.cn.debian.org/debian jessie main
,不过一般都不用加 apt-get update
apt-get install dpkg-dev
apt-get source passwd
将光驱数据导成iso
-
cat /proc/sys/dev/cdrom/info
获得对应的设备名,如/dev/sr0
-
blockdev --getbsz /dev/sr0
获得块大小,如2048 -
dd if=/dev/sr0 of=~/theCD.iso bs=2048
导出iso文件,不过网上有人说不用bs参数也可以,不过这样导出的iso可能在最后会有空白,所以还是需要知道原iso文件大小再head -c
比较好
列出一个包里安装的文件
dpkg-query -L john
apt-file list john
dpkg -c some-pkg.deb
- 查看http://packages.debian.org/distro-name/all/package-name/filelist,如http://packages.debian.org/jessie/all/bash/filelist
添加32位库
dpkg --add-architecture i386
apt-get update
capabilities
通过capabilities可以不用setuid,让普通用户运行一个需要root权限才能运行的程序,而且不会用到他/她不需要的root权限。
比如/bin/ping
,它需要使用raw-socket,这是需要root权限的。
传统意义下,需要使用#chmod +s /bin/ping
将/bin/ping
设置为setuid程序才行,但是现在我们可以#setcap cap_net_raw+ep /bin/ping
即可,其中cap_net_raw
对应raw-socket权限,ep是effective/permission权限。
若配合pam_cap
与执行程序的+ei
权限,可为单独某个用户设置某个程序是否可执行某些特权功能,将非常灵活。
限制root写某文件
由于root用户对所有文件都有rw权限,因此chmod -w somefile
操作somefile后root仍然能改写此文件,但是可以通过chattr +i somefile
将somefile设置为immutable(不可变),这样root也就无法改写此文件了。
查询已安装的软件包
- 简单列举
dpkg-query -l
- 按照包大小排序
dpkg-query -W -f '${Package;-40}\t${Installed-Size}\n' | sort -k 2 -n
- 再加上状态
dpkg-query -W -f '${Package;-40}\t${Installed-Size}\t${Status}\n' | sort -k 2 -n
使用ip/ss命令代替ifconfig等
ifconfig已经有十多年没有维护了(最近又有人要开始维护了...),而且对infiniband、输出信息的编码、CIDR格式的地址处理都有问题。
总地来说,ifconfig/arp/route/iptunnel需要使用ip命令代替,netstat可以使用ss代替,iwconfig使用iw代替。
列举
ifconfig
ip addr
与ip link
ifconfig eth0
ip addr show dev eth0
启动关闭
ifconfig eth0 up
ip link set eth0 up
ifconfig eth0 down
ip link set eth0 down
管理IP
ifconfig eth0 192.168.0.77
ip addr add 192.168.0.77 dev eth0
ifconfig eth0 192.168.0.77 netmask 255.255.255.0 broadcast 192.168.0.255
ip addr add 192.168.0.77/24 broadcast 192.168.0.255 dev eth0
ip addr del 192.168.0.77/24 dev eth0
设置网卡别名
ifconfig eth0:1 10.0.0.1/8
ip addr add 10.0.0.1/8 dev eth0 label eth0:1
管理ARP
ip neigh
arp -i eth0 -s 192.168.0.1 00:11:22:33:44:55
ip neigh add 192.168.0.1 lladdr 00:11:22:33:44:55 nud permanent dev eth0
ifconfig -arp eth0
ip link set dev eth0 arp off
路由
ip route
ip route add 10.0.0.0/16 via 192.0.2.253
ip route del 10.0.0.0/16 via 192.0.2.253
ip route get 1.2.3.4
-
ip route add default via 192.168.1.1
或ip route add default via 192.168.1.1 dev eth0
网络连接
netstat -anp
-
sudo ss -lp
,若仅查看监听状态的TCP套接字,则sudo ss -ltp
,其中-p
表示列出进程
网络流量
nload
-
sar -n DEV 1
或sar -n TCP 1
或sar -n ALL 1
简单的TCP测试
- 服务器:
nc -v -l 23456
- 客户端:
echo "hello, world" | nc -v 127.0.0.1 23456
- 服务器:
socat tcp-listen:33381 EXEC:bash
- 客户端:
socat - tcp-connect:127.0.0.1:33381
从目录创建iso文件
$ sudo apt-get install genisoimage
$ genisoimage -JRV wuxia -o ~/wuxia.iso ./wuxia/
静态IP设置
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.23.23
netmask 255.255.255.0
gateway 192.168.23.1
在Debian 8上从源码包构建软件
- 参见
获取源码包
小节,但是这次获取shadow
包 - 进入shadow目录
./autogen.sh && ./configure --without-selinux && make
- 若希望仅修改某个源码与相应的构建脚本,如
userdel
,可以cd src && make clean && make userdel
,将对应的构建脚本抽取出来,修改后再运行
在CentOS 6上从srpm构建软件
- 创建
/etc/yum.repos.d/CentOS-Source.repo
,添加相应的内容(可参考同目录下的其它文件的内容),示例如下:
[base-source]
name=CentOS-$releasever - Base Source
baseurl=http://vault.centos.org/6.6/os/Source/
enabled=1
[updates-source]
name=CentOS-$releasever - Updates Source
baseurl=http://vault.centos.org/6.6/updates/Source/
enabled=1
[extras-source]
name=CentOS-$releasever - Extras Source
baseurl=http://vault.centos.org/6.6/extras/Source/
enabled=1
[centosplus-source]
name=CentOS-$releasever - Plus Source
baseurl=http://vault.centos.org/6.6/centosplus/Source/
enabled=1
- 以root身份执行
yum clean all && yum makecache
-
rpm -qf /usr/sbin/userdel
查找userdel
命令的包名为shadow-utils
-
yum list | grep --color shadow-utils
确认版本 -
yumdownloader --source shadow-utils
下载源码包 -
rpm -i shadow-utils-XXX.src.rpm
解开源码包 -
cd ~/rpmbuild/SOURCES
查看对应的源码tar.bz2包 -
bunzip2 shadow-XXX.tar.bz2
解开包 -
tar -xf shadow-XXX.tar
继续解包 -
cd shadow-XXX && ./configure && make
获得所有二进制程序
实际上,也可以不用设置源码仓库地址与使用yumdownloader
,直接wget http://vault.centos.org/6.6/os/Source/SPackages/shadow-utils-4.1.4.2-19.el6.src.rpm
就可以了。
如果需要加上额外的功能,例如加上对审计的支持,可以:
- 以root身份执行
yum install audit-libs-devel
./configure --with-audit
其它的步骤类似。
内核模块
使用modprobe载入内核模块:
-
sudo cp my_mod.ko /lib/modules/$uname-r/extra/.
,其中$uname-r
是uname -r
的执行结果 sudo depmod -a
接着就可以通过modprobe my_mod
来载入my_mod.ko
了,也可以通过modinfo my_mod
来查询信息
将内核模块在init运行后载入,可以修改/etc/modules
加入my_mod
这一行即可
在initrd.img里面载入:
-
sudo vi /etc/initramfs-tools/modules
,加入my_mod
这一行 -
sudo update-initramfs -u
更新initrd.img -
sudo lsinitramfs -l /initrd.img | grep my_mod
可以看到模块已经加入了initrd.img文件中
获取内核模块依赖的内核函数:
readelf -s abc.ko | awk '(NF == 8){ if ($7 == "UND") print $8 }'
cgroups (control groups,控制组)
现在的cgroups文件系统都是挂载到/sys/fs/cgroup
目录下的。
在Debian下,缺省有blkio
、cpu,cpuacct
、cpuset
、devices
、freezer
、net_cls,net_prio
等,如果需要加上memory的cgroups,则需要修改/etc/default/grub
,为GRUB_CMDLINE_LINUX
与GRUB_CMDLINE_LINUX_DEFAULT
加上cgroup_enable=memory
,然后sudo update-grub2
后,重启即可生效。
可以通过手工来控制,例如:
sudo mkdir /sys/fs/cgroup/memory/mygroup
sudo -R chown raphael:raphael /sys/fs/cgroup/memory/mygroup
echo 64m > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
- 运行一个会使用128M内存的程序
myprog
(通过getchar()
调用等待后再分配使用),将其pid加入mygroup控制组,即echo $mypid > /sys/fs/cgroup/memory/mygroup/tasks
- 程序会异常退出
也可以通过cgroup-tools
包提供的工具来使用,在启动程序的时候更方便些,下面是等效命令:
sudo cgcreate -a raphael:raphael -t raphael:raphael -g memory:mygroup
-
cgset -r memory.limit_in_bytes=64m memory:mygroup
# 貌似测试无效 cgexec -g memory:mygroup myprog
此外,可以通过libcgroup
(cgroup-tools
自动安装)的/etc/cgconfig.conf
定义控制组,通过/etc/cgrules.conf
定义进程与用户所应属的控制组。
值得注意的是:
-
malloc
之后如果没有使用,那产生的内存用量是很少的,例如先malloc
1G内存,再每隔1M设置一个字节的值,产生的内存用量很少,必须要设置每个页(page)才能产生实际的内存使用,不然测试结果会让人迷惑 -
memory.soft_limit_in_bytes
是在内存紧张的时候才让进程的内存尽量缩减到的值,在内存宽松时是没有效果的,可以实现弹性内存管理
开发可以基于libcgroup
开发,当然其实也都挺简单的。可以使用的工具还有systemd.resource-control
与cgmanager
,不过后者已经于2016.6被Canonical放弃了。对于用户控制,还可以使用pam-cgroup
。
上述使用是基于cgroup v1的,v2的另有用法。
对于磁盘IO来说,可以使用blkio
来限制进程的IO速度,主要可以通过blkio.throttle.read_bps_device
与blkio.throttle.write_bps_device
来限制。
假设/dev/sda
的主设备号与从设备号分别是8和0(可以通过ls -l /dev/sda
看到),则可以通过echo "8:0 1048576" > /sys/fs/cgroup/blkio/myblkio/blkio.throttle.read_bps_device
将进程从/dev/sda
(含其下的各分区,如/dev/sda1
等)设备读取数据的速率限制到1M bps。
除此之外,也可以通过配置文件来做,步骤如下:
apt-get install cgroup-tools
- 编写
/etc/cgconfig.conf
如下:
group browsers {
blkio {
blkio.throttle.read_bps_device = "8:0 4194304";
}
memory {
memory.soft_limit_in_bytes = "1G";
}
}
-
cgconfigparser -l /etc/cgconfig.conf
创建相应的cgroups组 - 编写
/etc/cgrules.conf
如下:
raphael:/opt/google/chrome/chrome memory,blkio browsers
-
cgrulesengd
启动对进程的运行监控
参考资料
- ifconfig vs ip
- Deprecated Linux networking commands and their replacements
- iproute2: Life after ifconfig
- Grub VGA Modes
- CentOS获取软件安装包源码
- CentOS 下 rpm包与 yum 安装与卸载
- Rebuild a Source RPM
- Docker背后的内核知识——cgroups资源限制
- Docker背后的内核知识——Namespace资源隔离
- Linux中使用cgroups控制内存
- Cgroups控制cpu,内存,io示例