关于Debian的一些简记
设置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
启动对进程的运行监控