关于Debian的一些简记


设置console的分辨率

  1. apt-get install hwinfo vim
  2. hwinfo --framebuffer | grep --color 1280确认有1280x1024x24bit的分辨率
  3. vim /etc/default/grub,然后把GRUB_CMDLINE_LINUX=""这一行改成GRUB_CMDLINE_LINUX="vga=795",注意795是十进制的,hwinfo列出来的是十六进制的
  4. update-grub
  5. init 6

设置console的字体

  1. ls /usr/share/consolefonts看看有哪些支持的console字体
  2. echo "setfont Uni2-TerminusBold20x10" >> ~/.bashrc
  3. . ~/.bashrc

获取某个命令如(useradd)所在的包

  1. apt-get install apt-file
  2. apt-file update
  3. apt-file search useradd
  4. 如果已经知道了具体的路径,使用这个命令更快:dpkg -S /usr/sbin/useradd

获取源码包

  1. /etc/apt/source.list中加入deb-src http://ftp.cn.debian.org/debian jessie main,不过一般都不用加
  2. apt-get update
  3. apt-get install dpkg-dev
  4. apt-get source passwd

将光驱数据导成iso

  1. cat /proc/sys/dev/cdrom/info获得对应的设备名,如/dev/sr0
  2. blockdev --getbsz /dev/sr0获得块大小,如2048
  3. dd if=/dev/sr0 of=~/theCD.iso bs=2048导出iso文件,不过网上有人说不用bs参数也可以,不过这样导出的iso可能在最后会有空白,所以还是需要知道原iso文件大小再head -c比较好

列出一个包里安装的文件

  1. dpkg-query -L john
  2. apt-file list john
  3. dpkg -c some-pkg.deb
  4. 查看http://packages.debian.org/distro-name/all/package-name/filelist,如http://packages.debian.org/jessie/all/bash/filelist

添加32位库

  1. dpkg --add-architecture i386
  2. 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 addrip 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.1ip route add default via 192.168.1.1 dev eth0

网络连接

  • netstat -anp
  • sudo ss -lp,若仅查看监听状态的TCP套接字,则sudo ss -ltp,其中-p表示列出进程

网络流量

  • nload
  • sar -n DEV 1sar -n TCP 1sar -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载入内核模块:

  1. sudo cp my_mod.ko /lib/modules/$uname-r/extra/.,其中$uname-runame -r的执行结果
  2. sudo depmod -a

接着就可以通过modprobe my_mod来载入my_mod.ko了,也可以通过modinfo my_mod来查询信息

将内核模块在init运行后载入,可以修改/etc/modules加入my_mod这一行即可

在initrd.img里面载入:

  1. sudo vi /etc/initramfs-tools/modules,加入my_mod这一行
  2. sudo update-initramfs -u更新initrd.img
  3. 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下,缺省有blkiocpu,cpuacctcpusetdevicesfreezernet_cls,net_prio等,如果需要加上memory的cgroups,则需要修改/etc/default/grub,为GRUB_CMDLINE_LINUXGRUB_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

此外,可以通过libcgroupcgroup-tools自动安装)的/etc/cgconfig.conf定义控制组,通过/etc/cgrules.conf定义进程与用户所应属的控制组。

值得注意的是:

  • malloc之后如果没有使用,那产生的内存用量是很少的,例如先malloc1G内存,再每隔1M设置一个字节的值,产生的内存用量很少,必须要设置每个页(page)才能产生实际的内存使用,不然测试结果会让人迷惑
  • memory.soft_limit_in_bytes是在内存紧张的时候才让进程的内存尽量缩减到的值,在内存宽松时是没有效果的,可以实现弹性内存管理

开发可以基于libcgroup开发,当然其实也都挺简单的。可以使用的工具还有systemd.resource-controlcgmanager,不过后者已经于2016.6被Canonical放弃了。对于用户控制,还可以使用pam-cgroup

上述使用是基于cgroup v1的,v2的另有用法。

对于磁盘IO来说,可以使用blkio来限制进程的IO速度,主要可以通过blkio.throttle.read_bps_deviceblkio.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。

除此之外,也可以通过配置文件来做,步骤如下:

  1. apt-get install cgroup-tools
  2. 编写/etc/cgconfig.conf如下:
group browsers {
    blkio {
        blkio.throttle.read_bps_device = "8:0 4194304";
    }

    memory {
        memory.soft_limit_in_bytes = "1G";
    }
}
  1. cgconfigparser -l /etc/cgconfig.conf创建相应的cgroups组
  2. 编写/etc/cgrules.conf如下:
raphael:/opt/google/chrome/chrome    memory,blkio    browsers
  1. 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示例

你可能感兴趣的:(关于Debian的一些简记)