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

  1. 克隆最新代码,确定问题还存在

  2. 新建本地分支,修改要修改的部分

    git  add 修改的文件
    git commit -s commit-log
    《标题》:修改的大类:简短的patch主要描述
    《空行》
    《详细描述》
    git format-patch -1(可以在三小短线下写点东西)
    
  3. 使用get-maintainer获取当前文件的维护者,发给子系统(可以使用git自带的send-mail命令)

dpkg损坏修复

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用户重置

  1. 高级启动,修改grub,进入root终端
  2. 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

  1. 修改 /etc/selinux/config文件,将disable修改为permissive或者enforcing
  2. 在家目录下创建 .autorelabel文件,重启

08|编译

Msys跨平台编译ffmpeg

配置环境

  1. 安装Msys2,修改安装目录下的/etc/pacman.d/文件夹下的mirrorlist文件,切换为中科大源。
  2. 打开Msys2的MinGW64终端,执行 pacman -Syu更新软件包
  3. 使用 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本体

  1. ffmpeg官网下载相应版本的release压缩包,这里使用5.1.3
  2. 使用Msys2运行编译配置脚本configure,参数如下。
./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
posted @ 2025-01-06 15:33  Kyana  阅读(44)  评论(0)    收藏  举报