Linux使用技巧
01|使用逻辑卷使存储空间可扩展
前排提示
小白在使用Linux虚拟机时,常在开始分配较小的硬盘空间,在后续使用中常出现硬盘空间不足的问题,轻则无法安装软件,重则无法更新。本文推荐使用逻辑卷方式安装操作系统,便于后续磁盘扩充。
在逻辑卷上创建文件系统流程:
层次(命令):|物理磁盘| (-fdisk-> |物理分区|) -pvcreate-> |物理卷| -vgcreate-> |卷组| -lvcreate-> |逻辑卷|-mkfs-> |文件系统|
释义(功能):|致钛SC001| (-建表-> |sda1、hdc2|) -物理卷-> |sdb1| -合并为组-> |(L)VG| -建逻辑卷-> |可建FS| -创建文件系统-> |EXT4|
使用命令在逻辑卷上创建文件系统(Ubuntu)
# 使用硬盘分区或直接使用硬盘均可建立物理卷,区别在于,使用硬盘分区前需要先将分区类型(Id)修改为“Linux LVM(8e)”。使用fdisk disk_partation命令,具体步骤此处不述。
fdisk -l physic_disk #查看可以创建物理卷的目标
pvcreate pvtarget #将目标创建为物理卷
pvdisplay #查看物理卷信息
# 创建逻辑卷组,可以将多个逻辑卷创建为一个卷组
vgcreate vg_name pv1...pvn
vgdisplay #查看逻辑卷组信息
# 在一个逻辑卷组上创建一个逻辑卷
lvcrate -L lv_size lv_name vg_name
lvdisplay #查看逻辑卷信息
# 在某一逻辑卷上创建文件系统即可使用
mkfs -t fs_type lv_name
# 后续维护:扩充逻辑卷组、扩容逻辑卷是增加容量的两种方式(当然物理硬盘要够大)。
# 1.逻辑卷组中还有空间可以添加给逻辑卷
lvextend -L +size lv_name #+添加,-移除/压缩
resize2fs lv_name #刷新lv的大小
# 2.给逻辑卷组添加新的物理卷
vgextend vg_name pv1...pvn
02|修的内核bug如何推进
发patch
- 
克隆最新代码,确定问题还存在 
- 
新建本地分支,修改要修改的部分 git add 修改的文件 git commit -s commit-log 《标题》:修改的大类:简短的patch主要描述 《空行》 《详细描述》 git format-patch -1(可以在三小短线下写点东西)
- 
使用get-maintainer获取当前文件的维护者,发给子系统(可以使用git自带的send-mail命令) 
03|Linux网络管理shell工具
# 查看网卡
lspci | grep -i ethernet
# 查看网卡具体信息
ethtool eth0
# 查看和配置网络设备
ifconfig
# 启动、关闭指定网络设备
ifup、ifdown
# 判断目标主机是否存活、获取ip、网络性能统计
ping
# 显示设置内核中网络路由表,设置静态路由
route
# 追踪数据包在网络上的传输时全部路径
traceroute
# 查询域名解析
nslookup
# 检测主机网络状况
netstat
# 深度挖掘域名解析的工具
dig
# 定义对网络上的数据包进行截获的包的分析工具
tcpdump
# 监控网卡实时流量
iftop
# 检测带宽运行状况
iptraf
# 监控当前系统的网速情况
nload
# 看服务器带宽流量统计
vnstat
# 查看接口统计报告
nethogs
常用端口
| 端口号 | 协议内容 | 
|---|---|
| 80、8080、3128、8081、9098 | HTTP | 
| 443 | HTTPS | 
| 21 | FTP | 
| 22 | SSH | 
| 23 | TELNET | 
| 25 | SMTP | 
| 110 | POP3 | 
| 1080 | SOCKS | 
| 1158 | ORACLE EMCTL | 
| 1521 | ORACLE DB | 
| 1433 | MS SQL SERVER | 
| 1434 | MS SQL MONITOR | 
| 2100 | ORACLE XDB FTP | 
| 3389 | WIN03REMOTE | 
| 8080 | TOMCAT、ORACLE XDB、JBOSS | 
| 8081 | Symantec AV、Filter for MSE | 
| 9080 | WEBSHPERE APP | 
| 9090 | WEBSHPERE TOOL | 
iptables常用参数
实现对网络数据包的转发
# 关闭防火墙
systemctl stopfirewalld.service
systemctl disablefirewalld.service
# 查看现有规则
iptables -L
# 清空所有默认规则
iptables -F
# 清空所有自定义规则
iptables -X
# 所有计数器清零
iptables -Z
# 允许来自IO接口的数据包本地访问
iptables -A INPUT -I io -j ACCEPT
# 指定开放22端口
iptables -A INPUT -p tcpdport 22 -j ACCEPT
# 禁止123.23.1.2地址访问
iptables -A INPUT -p tcp-dport 22 -j ACCEPT
# 开放固定IP 访问8080
iptables -I INPUT -s 111.101.90.110 -p tcp-dport 8080 -j ACCEPT
# 禁止ping
iptables -A INPUT -p icmp-icmp-type 8 -s 0/0 -j DROP
# 添加内网IP信任
iptables -A INPUT -p tcp -s innerIP -j ACCEPT
# 允许接受本机请求之后返回数据RELATED
iptables -A INPUT -m state-state RELATED ESTABLISHED -j ACCEPT
# 限制流量
iptables -A INPUT -l eth0-m limit --limit-burst 15 -j ACCEPT
# 特定时间内匹配
iptables -A INPUT -i eth0-m time --weekdays 1,3,5 -j ACCEPT
# 匹配符合规则的TTL数据包
iptables -A OUTPUT -m ttl-ttl-eq 51 -j ACCEPT
# 匹配指定状态数据包
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# 匹配带有指定mark值的数据包
iptables -t mangle -A INPUT -m mark --mark num -j DROP
# 匹配指定mac地址
iptables -A FORWARD -m mac --mac-source macdest
# 映射端口
iptables -t mangle -l PREROUTING -p tcp-dport portnum -j MARK --setmark origin
# 过滤所有非以上规则的请求
iptables -P INPUT DROP
# 保存iptables规则
service iptables save
# 自动开启iptables服务
systemctl enableiptables.service
Linux用户重置
- 高级启动,修改grub,进入root终端
- id查看用户,passwd更改密码
04|Linux信号量
不能恢复至默认动作的信号有:SIGILL,SIGTRAP
默认会导致进程流产的信号有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默认会导致进程退出的信号有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默认会导致进程停止的信号有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默认进程忽略的信号有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞。
可靠信号和不可靠信号:不可靠信号非实时,不支持排队
SIGHUP
终端结束,通知关联作业,重新读取配置;终止进程,终端线路挂断
SIGINT
程序终止,Ctrl+C,通知前台阻止进程;终止进程,中断进程
SIGQUIT
程序错误退出,吐核
SIGILL
执行了非法指令,文件本身错误、试图执行数据段,堆栈溢出;建立core,非法指令
SIGTRAP
断点指令或者其它trap指令,debugger使用;建立core,跟踪自陷
SIGABRT
调用abrot函数生成的信号
SIGBUS
非法地址,地址对齐错误;建立core,总线错误
SIGFPE
发生致命算数运算错误;建立core,浮点异常
SIGKILL
立即结束程序的运行,不能被阻塞、处理和忽略;终止进程,杀死进程
SIGUSR1/2
留给用户
SIGSEGV
试图访问未分配给自己的内存,试图往没有权限内存写数据;建立core,段非法错误
SIGPIPE
管道破裂,管道没打开或者意外终止就写;向一个没有读进程的的管道写数据
SIGALRM
时钟定时信号,计算实际时间或者时钟时间,alarm使用;计时器到时
SIGTERM
程序结束,可以被阻塞和处理,通常要求正常退出
SIGCHLD
子进程结束时候,父进程会收到。如果父进程没有处理,也没有等待,子进程仍会在内核进程表中占有,称为僵尸进程,应尽量避免。
SIGCONT
让一个停止的进程继续执行,不能被阻塞
SIGSTOP
暂停进程运行,不能被阻塞处理或忽略
SIGTSTP
停止进程运行,可以被处理和忽略,通常Ctrl+Z
SIGTTIN
后台作业从用户终端读数据,该作业所有进程都会收到
SIGTTOU
同SIGTTIN,在写终端时收到
SIGURG
有紧急数据或out-of-band到达socket时产生
SIGXCPU
超过CPU时间资源限制,由getrlimit/setrlimit操作
SIGXFSZ
进程企图扩大文件以致超过文件大小资源限制
SIGVTALRM
虚拟时钟信号,计算该进程占CPU时间
SIGPROF
类似SIGALRM/SIGVTALRM,计算的是包括该进程占用CPU和系统调用时间
SIGWINCH
窗口大小改变时发出
SIGIO
文件描述符准备就绪,开始IO
SIGPWR
power failure
SIGSYS
非法系统调用
05|Shell脚本
变量
# 创建变量,两边不准有空格
name="shell_test";
# 局部函数变量
local name="shell";
# 只读变量
name="test" -> readonly name;
# 使用变量
echo ${name};
# 删除变量
unset name;
字符串
- 单引号:原样输出,不可嵌套
- 双引号:变量有效,可以转义
- 拼接字符串:最外层两个对应,内部随意
- 获取字符串长度:name="shell";echo ${#name}
- 字符串切片:name="shell_test";echo ${name::4}
数组
# 只支持一维数组
# 定义数组,小括号边界,空格分离,单独定义下标不连续也许
array_test=(this is a test array)
# 取得元素个数
echo ${#array_test[@]};
echo ${#array_test};
# 获取单个元素长度
echo ${#array_test[3]};
运算符
# 加减乘除,*前必须用\进行转义
value=`expr2+2`
value=$[2\*2]
value=$((2\3))
# 关系运算符只支持数字,不支持字符串(如果字符串值是数字可以)
# 相等返回true
[$a -eq $b]
# 不等返回true
[$a -nq $b]
# 左边大于右边返回true
[$a -gt $b]
# 左边小于右边返回true
[$a -lt $b]
# 左边大于右边返回true
[$a -ge $b]
# 左边小于右边返回true
[$a -le $b]
# 字符串运算符
# 字符串相等返回true
[$a = $b]
# 字符串不相等返回true
[$a != $b]
# 字符串为0返回true
[-z $a]
# 字符串长度不为0返回true
[-n $a]
# 字符串为不空返回true
[$a]
# 布尔运算符
# 非运算
[!false]
# 与运算
[$a -lt 20 -a $b -gt 100]
# 或运算
[$a -lt 20 -a $b -gt 100]
# 逻辑运算符
- 逻辑与&&
- 逻辑或||
# 文件运算符
# 检测文件是块设备文件返回true
[-b $file]
# 检测文件是字符设备文件返回true
[-c $file]
# 检测文件是目录返回true
[-d $file]
# 检测文件是普通文件返回true
[-f $file]
# 检测文件设置了SGID位返回true
[-g $file]
# 检测文件设置了黏着位返回true
[-p $file]
# 检测文件是有名管道返回true
[-p $file]
# 检测文件设置了SUID位返回true
[-u $file]
# 检测文件可读返回true
[-r $file]
# 检测文件可写返回true
[-w $file]
# 检测文件可执行返回true
[-x $file]
# 检测文件为空返回true
[-s $file]
# 检测文件包括目录存在返回true
[-e $file]
流程控制
- 选择:
- if...then...
- if...elseif...then...
- if...else-if...then...
- case...in mode1...;;esac
 
- 迭代:
- for var in items do...done
 
- 循环:
- while...do...done
- ...until...
 
定义函数
06|堆腐败问题
Heap Corruption堆腐败
堆内存内容由于编程行为被修改,超出原始编程意图
内存腐败的根源和表现形式很难联系起来,难以持续产生错误
内存腐败产生原因
- 使用未初始化内存
- 使用非自有内存:通常出现在使用指针时,空指针、悬挂指针(野指针)或指向堆外内存,导致崩溃
- 使用分配内存以外的内存(缓冲区溢出):循环中使用数组,且终止条件不正确
- 堆内存错误管理:内存释放或者泄露错误
可能的表现和引起
- 程序试图释放内存
- 程序被释放后试图分配内存
- 堆在分配内存前损坏
- 故障发生在随后的内存上
- 使用连续内存块
- 多线程进程交错请求内存
- 内存分配策略改变
C++中具体原因
- 缓冲区溢出
- 未初始化的指针
- 强制类型转换
- 错误使用. & ->
- delete new不配套
- 缺少或者不完整的拷贝构造
- 指向已回收的内存
- 重复delete
- 多重继承但没有虚析构函数
表现形式
STATUS_HEAP_CORRUPTION
EXPECTION_RECORD:
ExceptionCode:c0000374
ExceptionCode:00000001
NumberParameters:1
Parameter[0]: 导致此异常的最终函数
0xC0000374
查看系统版本
lrb_release -a
cat /etc/issue
cat /proc/version
uname -a
07|安全机制(SELinux/AppArmor)
selinux is disable error
- 修改 /etc/selinux/config文件,将disable修改为permissive或者enforcing
- 在家目录下创建 .autorelabel文件,重启
08|编译
Msys跨平台编译ffmpeg
配置环境
- 安装Msys2,修改安装目录下的/etc/pacman.d/文件夹下的mirrorlist文件,切换为中科大源。
- 打开Msys2的MinGW64终端,执行 pacman -Syu更新软件包
- 使用 pacman -S gcc yasm make安装编译所需的依赖。
编译流程
编译x264库
从videolan官网下载x264代码的压缩包,使用如下参数配置编译,并安装。
./configure --prefix=out --enable-static --enable-shared
make -j8
make install
编译mp3lame库
从MP3代码存储库下载3.100代码包。使用如下参数配置编译,并安装。
./configure --prefix=out --enable-static --enable-shared
make -j8
make install
编译ffmpeg本体
./configure --prefix=Out --enable-x86asm --enable-network --enable-protocol=https --enable-optimizations --enable-gpl --enable-libx264 --enable-libmp3lame --enable-small --enable-static --disable-shared --disable-ffprobe --disable-doc --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
cl(VS ToolChain)编译ffmpeg
lame: ./configure --enable-shared --prefix=/mnt/Mp3/Out/ --host=x86_64-pc-windows CC=cl.exe
ffmpeg: ./configure --prefix=Out --toolchain=msvc --enable-w32threads --enable-x86asm --disable-doc --disable-ffprobe --enable-small --disable-runtime-cpudetect --disable-network --disable-debug
x264: ./configure --enable-static --enable-shared
lame: ./configure --prefix=/usr/local --enable-static --enable-shared
ffmpeg: ./configure --prefix=Out --enable-x86asm --enable-network --enable-protocol=https --enable-optimizations --enable-gpl --enable-libx264 --enable-libmp3lame --enable-small --enable-static --disable-shared --disable-ffprobe --disable-doc --extra-cflags=/usr/local/include --extra-ldflags=/usr/local/lib

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号