sysrq是linux的一种调试手段,经常是因为系统挂死,但内核并没有完全死掉的情况下,通过对内核下发组合按键,从而拿到必要的内核信息。
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
root@ywen233:~# sysctl -a | grep sysrq kernel.sysrq = 176
0 - disable sysrq completely 1 - enable all functions of sysrq >1 - bitmask of allowed sysrq functions (see below for detailed function description): 2 - enable control of console logging level 4 - enable control of keyboard (SAK, unraw) 8 - enable debugging dumps of processes etc. 16 - enable sync command 32 - enable remount read-only 64 - enable signalling of processes (term, kill, oom-kill) 128 - allow reboot/poweroff 256 - allow nicing of all RT tasks
通过alt+sysrq组合按键触发
通过echo /proc/sysrq-trigger触发
可触发类型
0-9 设定终端输出的内核 log 优先级 b 立即重启系统 c 内核live reboot,并输出错误信息 d 显示所有排它锁(显示所有被持有的锁) e 向除 init 外进程发送 SIGTERM 信号,让其自行结束 f 人为触发 OOM Killer (out of memory) g 当进入内核模式时,以 framebuttter 代替输出(kgdb(内核调试器)使用) h 输出帮助 i 向除 init 以外所有进程发送 SIGKILL 信号,强制结束进程 k 安全访问密钥(SAK)杀死当前虚拟控制台上的所有程序 l 显示所有活动cpu的堆栈回溯。 m 内存使用信息(将当前内存信息转储到您的控制台。) n 重置所有进程的 nice(优先级) o 关机 p 输出cpu 寄存器信息 q Display all active high-resolution timers and clock sources. r 把键盘设置为 ASCII 模式,使按键可以穿透 x server 捕捉传递给内核 s 同步缓冲区数据到硬盘 t 输出进程列表(将当前任务及其信息的列表转储到您的控制台。) u 重新挂载所有文件系统为只读模式 v 输出 Voyager SMP 处理信息 w 输出 block(d状态)进程列表
在看LDD3时发现可以通过TIOCLINUX的ioctl控制内核日志输出。其代码可以如下:
#include <stdio.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <string.h> int main( int argc, char **argv ) { char bytes[ 2 ] = { 11, 0 }; // 11 is the TIOCLINUX command-number if ( argc == 2 ) bytes[1] = atoi( argv[1] ); // console id-number else { fprintf( stderr, "%s: need a single argument\n", argv[0] ); exit(1); } int fd = open( "/dev/console", O_RDWR ); // <--- added if ( fd < 0 ) { perror( "/dev/console" ); exit(1); } // <--- added if ( ioctl( fd, TIOCLINUX, bytes ) < 0 ) // <--- changed { fprintf( stderr, "%s: ioctl( fd, TIOCLINUX ): %s\n", // <--- argv[0], strerror( errno ) ); exit(1); } exit(0); }
通过gcc编译
gcc setconsole.c -o setconsole
查看系统默认console上绑定的tty
cat /sys/devices/virtual/tty/console/active tty0
如果内核日志需要定向到其他tty上,可以如下运行
让内核日志在只在tty3上出现
./setconsole 3 # tty3上会出现内核日志,其他tty不会有内核日志
让内核日志在所有的tty上出现
./setconsole 0 # 所有可关联的tty都会出现内核日志
在装ubuntu的过程中,boot默认设置成了200M,不过200M对存放内核来说是不够用的,所以容易出现更新内核容量不够,更新initrd容量不够等问题
这里说明怎么扩容boot分区。
root@ywen233:~# lsblk sda 8:0 0 111.6G 0 disk ├─sda1 8:1 0 94M 0 part /boot/efi ├─sda2 8:2 0 191M 0 part └─sda3 8:3 0 111.3G 0 part / sdb 8:16 0 931.5G 0 disk ├─sdb1 8:17 0 193.4G 0 part ├─sdb2 8:18 0 403.6G 0 part ├─sdb3 8:19 0 513M 0 part ├─sdb4 8:20 0 2G 0 part /boot └─sdb5 8:21 0 332.1G 0 part
通过fdisk可以创建一个2G的分区
fdisk /dev/sdb n 4 /dev/sdb4 2048 4095999 4093952 2G Linux 文件系统 w
将原boot文件放到新的分区下
mkfs.ext4 /dev/sdb4 mount /dev/sdb4 /mnt cp -rf /boot/ /mnt
修改fstab为新的boot分区
root@ywen233:~# ls -lh /dev/disk/by-uuid/ | grep sdb4 lrwxrwxrwx 1 root root 10 3月 30 14:57 2ba486d2-9605-49dc-a8cf-4f27b1fcbc71 -> ../../sdb4 vim /etc/fstab UUID=2ba486d2-9605-49dc-a8cf-4f27b1fcbc71 /boot ext4 defaults 0 2
然后重启即可。
[name] --共享的名字 comment=this is Linux share directory --说明 path=/home/share --目录路径 public=yes --是否可见,no为看不到 read only=yes --是否只读 create mode=0700 --建立的文件默认的权限掩码 directory mode=0755 --如果有可写权限,建立的目录默认的权限掩码 guest ok = yes --来宾是否可见,和public是差不多的 browseable = yes--指定该共享是否可被浏览 writable=yes --是否允许用户在此目录下可写,no为不可些,如果可写,还需要目录具有w权限 [work] comment=this is Linux share directory path=/root/ public=yes read only=yes create mode=0777 directory mode=0777 guest ok = yes browseable = yes writeable = yes
sudo vim /etc/samba/smb.conf
在配置文件的“[global]”节的最后,加上下面三条设置:
follow symlinks = yes wide links = yes unix extensions = no
然后保存退出,最后重启下samba
sudo /etc/init.d/samba restart
sudo cp /usr/share/samba/smb.conf /etc/samba/
需要增加
security = user map to guest = Bad User
然后用 testparm smb.conf 测试conf是否正常
在平时调试过程中,经常会遇到编译的-O参数选择问题,作为这个小知识点,通过查阅资料,学习,总结如下:
总共的选项包括:-O/-O1, -O2, -O3, -O0, -Os, -Ofast, -Og, -Oz
-O/-O1 相对于O0,减少了代码体积,提升性能 代价是花费更多的编译时间和内存 -O2 相对于O1,花费较多的编译时间和内存空间,尽可能的提升代码的性能。增加的参数在参考链接可查 -O3 在O2上更进一步优化,花费更多的编译时间和更多的内存,但不保证代码因为优化导致的异常运行 -O0 默认选择的优化,其编译耗时最短,但也尽量开启了一下优化 -Os 在O2基础上,取消了对于空间换性能的参数,来追求二进制的体积 -Ofast 在O3上,启动更多的优化,比O3优化更不可靠 -Og 优化调试体验,在O1上去除了一些干扰调试的参数 -Oz 更加极致的优化空间,通过更多的指令才换取更小的二进制
参考: