0%

Linux Commands

本文记录学习的 Linux 命令

dd

快速生成文件

1
2
3
4
5
// 生成 10M 的test文件
$ dd if=/dev/zero of=test bs=1M count=10

// 生成 10K 的test文件
$ dd if=/dev/zero of=test bs=1K count=10

上述命令是实际写入硬盘,文件产生速度取决于硬盘读写速度,如果想要产生超大文件,速度很慢。

在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘。则可以使用 seek

1
2
// count=0 表示读写 0 次,指定生成文件的大小为 0M
$ dd if=/dev/zero of=test bs=1M count=0 seek=1000
1
2
// count=50 表示读写 50 次,指定生成文件的大小为 50M
$ dd if=/dev/zero of=test bs=1M count=50 seek=1000

此时创建的文件在文件系统中的显示大小为 1000MB,但是并不实际占用 block,因此创建速度与内存速度相当

du (disk use):默认显示的是真正的磁盘占用

1
2
// 随机生成1百万个1K的文件
$ seq 1000000 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1

分割文件,合并文件

分割操作:

1
2
3
4
5
// 一个块为128K,跳过前18块
$ dd if=test.txt of=1.txt bs=128k skip=18

// bs=128k,表示一个块128k, 从文件头开始,读取18块
$ dd if=test.txt of=2.txt bs=128k count=18

合并操作:

1
2
// 1.txt 和 2.txt 合成 3.txt
$ (dd if=1.txt; dd if=2.txt) > 3.txt

合并后的 3.txt 文件和 test.txt 文件的 md5 一致

conv

将 testfile_1 文件中的所有英文字母转换为大写,然后转成为 testfile_2 文件

1
2
3
4
5
6
7
8
9
$ cat testfile_1
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
$ dd if=testfile_1 of=testfile_2 conv=ucase

$ dd conv=ucase
// 输入以上命令后按回车键,输入字符串,再按回车键,按组合键 Ctrl+D 退出

管道查看器 pv
$ sudo apt-get install pv
$ dd if=/dev/zero | pv | dd of=test


if (input file) 代表输入文件/目录,如果不指定 if,默认就会从 stdin 中读取输入
of (output file) 代表输出文件/目录,如果不指定 of,默认就会将 stdout 作为默认输出
bs 代表每次读入的 block 大小
count 代表读取的 block 个数
bs*count = 文件大小
/dev/zero 是Linux提供的一个特殊的字符设备,它的特点是可以永远读该文件,每次读取的结果都是二进制0
seek 跳过输出文件中指定大小的部分,并不实际写入
skip 跳过输入文件开头指定大小再开始复制

if=文件名:输入文件名,默认为标准输入。即指定源文件。
of=文件名:输出文件名,默认为标准输出。即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

conv=<关键字>,关键字可以有以下11种:
conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

block 块大小可以使用的计量单位:
字节 (1B) c
字节 (2B) w
块 (512B) b
千字节 (1024B) k
兆字节 (1024KB) M
吉字节 (1024MB) G

truncate

将文件缩减或扩展至指定大小。
选项 -s,即 size(大小)

  1. 指定文件不存在则创建。
  2. 指定文件超出指定大小则超出的数据将丢失。
  3. 指定文件小于指定大小则用0 补足。

注意点:
这种文件被称为“空洞文件”,文件的部分内容并没有实际存在于硬盘上
du (disk use):默认显示的是真正的磁盘占用

1
2
3
4
5
// 创建 2G 的 test 文件
$ truncate -s 2G test

// 修改 test 文件大小为 1G
$ truncate -s 1G test

fallocate

tc

模拟网络异常场景(丢包/延迟等)

模拟延迟传输

1
2
// 该命令将 eth0 网卡的传输设置为延迟 100 毫秒发送
$ sudo tc qdisc add dev eth0 root netem delay 100ms
1
2
3
// 带有波动性的延迟值
// 该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值) 发送
$ sudo tc qdisc add dev eth0 root netem delay 100ms 10ms
1
2
// 该命令将 eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送
$ sudo tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

模拟网络丢包

1
2
// 该命令将 eth0 网卡的传输设置为随机丢掉 10% 的数据包
$ sudo tc qdisc add dev eth0 root netem loss 10%
1
2
// 该命令将 eth0 网卡的传输设置为随机丢掉 10% 的数据包,成功率为 30%
$ sudo tc qdisc add dev eth0 root netem loss 10% 30%

// 查看网卡上面的相关配置

1
2
3
$ sudo tc qdisc ls dev eth0
//或者
$ sudo tc qdisc show dev eth0

// 删除网卡上面的相关配置

1
2
// 该命令将 删除 eth0 网卡的相关传输配置
$ sudo tc qdisc add dev eth0 xxxxxx(加的相关配置)

模拟包重复

1
2
// 该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包 
$ sudo tc qdisc add dev eth0 root netem duplicate 1%

模拟数据包损坏

1
2
// 该命令将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包(内核版本需在 2.6.16 以上)
$ sudo tc qdisc add dev eth0 root netem corrupt 0.2%

模拟数据包乱序

1
2
3
4
5
// 该命令将 eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒
$ sudo tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

// 新版本中,如下命令也会在一定程度上打乱发包的次序:
$ sudo tc qdisc add dev eth0 root netem delay 100ms 10ms