0%

Linux 的 stat 命令

Linux stat 命令用于显示 inode 内容。

话说这个inode是个什么东西呢?对于存储在硬盘上的文件,特别是Linux的概念就是,一切皆文件。其最小的存储单元为512字节即一个扇区sector;在读取文件的时候,为了提高效率,是按照4KB的块block来读取的,所以这样看来每次读取了8个sector。而对于每个文件为了索引,其元数据的各种信息就是stat获取的,用于描述创建者、文件的各种日期、大小等等等等信息,这个元数据的id就可以认为是inode了,以上。

官方的定义为:

stat - display file or file system status

用法为:

1
$ stat [options] filename/directory

其中的参数为:

  • -L, --dereference : 不显示链接的原始文件

  • -f, --file-system :显示文件系统状态

  • --printf=FORMAT : 与C语言的类似,不过看着转义符更多一些

  • -t, --terse:超级简介的模式

最简单的使用

最简单的其实也是最有用的,直接跟上文件或者目录,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ stat text.txt 
File: ‘text.txt’
Size: 51 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1610934260 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-11 21:24:49.660510438 +0800
Modify: 2012-09-09 17:31:54.518005296 +0800
Change: 2012-09-09 17:33:09.670327180 +0800
Birth: -

$ stat dir
File: ‘dir
Size: 51 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1610934255 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-13 16:44:56.802331727 +0800
Modify: 2012-09-13 16:44:55.624342864 +0800
Change: 2012-09-13 16:44:55.624342864 +0800
Birth: -

各个段的解释为:

  • File:文件或文件夹名
  • Size:文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)或者directory文件夹
  • Device:设备的编号
  • Inode:Inode号
  • Links:链接数
  • Access:文件的权限
  • Gid, Uid:文件所有者的Gid和Uid
  • Access:文件的访问时间
  • Modify:文件的修改时间
  • Change:文件的状态时间

显示文件系统

参数-f将显示文件系统信息,可以看到Type:xfs这个信息。

1
2
3
4
5
6
7
$ stat -f text.txt 
File: "text.txt"
ID: fd0000000000 Namelen: 255 Type: xfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 244020823 Free: 182831648 Available: 182831648
Inodes: Total: 488280064 Free: 487587798

关于printf的那些格式化字符串

--printf=FORMAT选项可以跟的FORMAT有很多,较常用为:

格式化字符串 含义
%A 易读的访问状态
%B 每个块的大小(单位为字节)
%d 十进制的设备号
%F 文件类型
%G 所有者的组名
%i inode数字
%m 挂载点
%n 文件名
%s 总大小(单位:字节)
%U 所有者的用户名
%w 易读的文件生成时间(大写的为Epoch)
%x 易读的文件访问时间(大写的为Epoch)
%y 易读的文件修改时间(大写的为Epoch)
%z 易读的文件上一次修改状态时间(大写的为Epoch)

炫技 : 一个类似ls -l的用法

下面的这个命令可以实现类似ls -l的用法,可以扩展更多,也可以自定义使用,比如alias等等。

1
2
$ stat --print="%A. %U %G %s %x %n \n" text.txt 
-rw-rw-r--. user user 51 2012-09-11 21:24:49.660510438 +0800 text.txt

Linux 的 stat 命令

Linux stat 命令用于显示 inode 内容。

话说这个inode是个什么东西呢?对于存储在硬盘上的文件,特别是Linux的概念就是,一切皆文件。其最小的存储单元为512字节即一个扇区sector;在读取文件的时候,为了提高效率,是按照4KB的块block来读取的,所以这样看来每次读取了8个sector。而对于每个文件为了索引,其元数据的各种信息就是stat获取的,用于描述创建者、文件的各种日期、大小等等等等信息,这个元数据的id就可以认为是inode了,以上。

官方的定义为:

stat - display file or file system status

用法为:

1
$ stat [options] filename/directory

其中的参数为:

  • -L, --dereference : 不显示链接的原始文件

  • -f, --file-system :显示文件系统状态

  • --printf=FORMAT : 与C语言的类似,不过看着转义符更多一些

  • -t, --terse:超级简介的模式

最简单的使用

最简单的其实也是最有用的,直接跟上文件或者目录,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ stat text.txt 
File: ‘text.txt’
Size: 51 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1610934260 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-11 21:24:49.660510438 +0800
Modify: 2012-09-09 17:31:54.518005296 +0800
Change: 2012-09-09 17:33:09.670327180 +0800
Birth: -

$ stat dir
File: ‘dir
Size: 51 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1610934255 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2012-09-13 16:44:56.802331727 +0800
Modify: 2012-09-13 16:44:55.624342864 +0800
Change: 2012-09-13 16:44:55.624342864 +0800
Birth: -

各个段的解释为:

  • File:文件或文件夹名
  • Size:文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)或者directory文件夹
  • Device:设备的编号
  • Inode:Inode号
  • Links:链接数
  • Access:文件的权限
  • Gid, Uid:文件所有者的Gid和Uid
  • Access:文件的访问时间
  • Modify:文件的修改时间
  • Change:文件的状态时间

显示文件系统

参数-f将显示文件系统信息,可以看到Type:xfs这个信息。

1
2
3
4
5
6
7
$ stat -f text.txt 
File: "text.txt"
ID: fd0000000000 Namelen: 255 Type: xfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 244020823 Free: 182831648 Available: 182831648
Inodes: Total: 488280064 Free: 487587798

关于printf的那些格式化字符串

--printf=FORMAT选项可以跟的FORMAT有很多,较常用为:

格式化字符串 含义
%A 易读的访问状态
%B 每个块的大小(单位为字节)
%d 十进制的设备号
%F 文件类型
%G 所有者的组名
%i inode数字
%m 挂载点
%n 文件名
%s 总大小(单位:字节)
%U 所有者的用户名
%w 易读的文件生成时间(大写的为Epoch)
%x 易读的文件访问时间(大写的为Epoch)
%y 易读的文件修改时间(大写的为Epoch)
%z 易读的文件上一次修改状态时间(大写的为Epoch)

炫技 : 一个类似ls -l的用法

下面的这个命令可以实现类似ls -l的用法,可以扩展更多,也可以自定义使用,比如alias等等。

1
2
$ stat --print="%A. %U %G %s %x %n \n" text.txt 
-rw-rw-r--. user user 51 2012-09-11 21:24:49.660510438 +0800 text.txt

Mac 平台上 13 款实用的代码编辑器推荐

如今网络上有很多针对 Mac 平台的代码编辑器,因此要找到正确的、最适合你的代码编辑器可能需要一段时间。这里主要整理了 13 款实用的代码编辑器,一些是免费、开源的,也有一些收费的,但你可以免费试用.

Espresso

Espresso是一款功能强大的代码编辑工具,拥有专业检查与分类、语法高亮、优雅的导航、即时预览、同步功能等,具有惊人的可扩展能力和速度,支持代码折叠,还能以dom方式呈现。Espresso还整合了CSSEdit 3的功能特性。

TextMate

TextMate把苹果OS X操作系统体验带进了编辑器的世界,整合了UNIX内核和苹果GUI两者的优点。TextMate的设计使有经验的开发者和新用户都很受益。

Aptana Studio 3

Aptana Studio 3是一个用于Web开发的开源工具。它能够让开发人员使用单一环境来测试Web应用程序。Aptana支持HTML5、CSS3、JavaScript、Ruby、Rails、PHP和Python。它提供了非常多的功能,包括代码辅助编辑器、调试器、部署向导和IDE自定义。

Taco HTML

Taco HTML是Mac里首屈一指的HTML和PHP编辑器。作为一个HTML编辑器,Taco HTML使得用户能够快速创建自己的网站。它是专为Mac OS X设计的,并拥有许多先进功能,包括拼写检查、浏览器即时预览、PHP预览、语法检查等。

Tumult HyperEdit

Tumult HyperEdit是一个轻盈的HTML编辑器,当你在输入时,便可即时查看网页的预览效果。HyperEdit 打破了HTML代码编写的繁琐周期——储存文件、然后在浏览器中载入、观看页面、在浏览器及编辑窗口中切换调试。它实现了撰写、修改与预览的同步进行,加快了整个页面设计的进程。W3C验证会将错误的语法用红色的下划线标记出来。它内嵌了与Safari相同的渲染引擎,因此不仅符合标准而且速度还非常快。

Dreamweaver CS6

Adobe Dreamweaver CS6提供了一套直观的可视界面,供你创建和编辑网站。新的流体网格布局专为自适应网格版面创建网页,这个网格版面是跨平台兼容性设计的。在发布前,可以使用“多屏幕预览“来审阅您的设计。

Coda 2

Coda 2是Mac版网页编辑器,它整合了终端、文字编辑器、CSS编辑器、内容发布等整个Web开发流程所需工具。新版本的Coda 2增加了诸多新的特性和功能,进行了新的用户界面设计。新增了可实现快速导航的滚动标签栏,整合了CSS、用户函数/变量补全、智能缩进、代码折叠等特性,支持Git版本管理,内置了MySQL编辑器。

SkEdit

SKEdit编辑器使你更容易创建和维护网站,它拥有所有必要的功能,如代码提示、代码折叠、FTP / SFTP的集成、Subversion的集成,它支持HTML、CSS、PHP、Cold Fusion、Ruby、SQL等编程语言。它包括一个代码库,你可以用最喜爱的脚本语言来编写脚本,并随时跟踪最常用的代码片段。

Firebug

  • Firebug是最流行和强大的Web开发工具:
  • 实时查看HTML并修改其风格和布局。
  • 最先进的JavaScript调试功能,适合任何浏览器。
  • 准确地监视网络的使用和性能。
  • 扩展Firebug并增加新的功能,使Firebug更强大。
  • 获得你所需要的信息。

BareBones

使用磁盘或FTP浏览器来查看和打开本地或远程卷的文件。

在磁盘浏览器、多文件搜索结果窗口、项目窗口上编辑文件。可以在多窗口中编辑单一文件!

创建BBEdit项目组,并在一个单一的窗口编辑相关文件,不用管它们在磁盘上的位置。

可以使用内置的Open from FTP/SFTP Server和Save to FTP/SFTP Server命令在FTP/SFTP服务器上直接创建文件;也可以使用Interarchy、Fetch、Transmit或任何其他支持“BBEdit编辑”的文件传输客户端。

Open File by Name操作可以让你快速访问BBEdit项目(或Xcode项目)中的内容。

Text Wrangler

TextWrangler是一款全能的文本编辑器。与BBEdit的区别是它有丰富的专业功能集,包括Web创作功能和软件开发工具。

EditRocket

EditRocket提供了必要的工具和功能,允许开发者编辑、创建、调试,并且快速、方便地浏览源代码。

Komodo Edit

Komodo Edit可以在 Windows、Mac 和 Linux 上运行,并支持PHP、Python、Ruby、JavaScript、Perl、TCL、XML、HTML5以及CSS3。另有后台语法检测、颜色匹配、错误捕捉、自动补齐、Fast Open、远程文件编辑、Vi快捷键、shell命令集、宏指令和代码片段等特性。值得一提的是,该IDE为用户提供了丰富的可扩展功能,支持类似firefox的.xpi扩展。

Linux文件系统

Name 简介
ext2 老牌 Linux 文件系统,不支援 journaling。
ext3 当今各大 Linux 预设使用的文件系统。支援 journaling。
ext3 (data) 加上 journal_data 功能的 ext3。
ext4 ext3 的下一版本。已正式进入 kernel 2.6.28 中。
reiserfs 号称最快的 FS。Linux 上第一个支援 journaling 的文件系统。
reiserfs (data) 加上 journal_data 功能的 reiserfs。
reiser4 reiserfs 的下一版。(尚未进入 kernel 中)
jfs 由 IBM 所开发的 journaling 型文件系统。已停止开发。
xfs 由 SGI 所开发的 journaling 型文件系统。
vfat 古老 DOS/Windows 文件系统,不支援 journaling。
ntfs 现今 Windows 的主流文件系统。在 Linux 上是经由 fuse 来支援 ntfs。
zfs 由 Sun 所开发的终极文件系统。在 Linux 上是经由 fuse 来支援 zfs。
btrfs 下一代 Linux 预设使用的文件系统。已进入 kernel 2.6.29 RC1 的测试分支中。

ext3,ext4,xfs和btrfs文件系统性能对比

详情参考 : http://www.cnblogs.com/tommyli/p/3201047.html

应为原文:

http://www.ilsistemista.net/index.php/linux-a-unix/6-linux-filesystems-benchmarked-ext3-vs-ext4-vs-xfs-vs-btrfs.html?start=1

还有一篇相关介绍:

http://www.phoronix.com/scan.php?page=article&item=ext4_benchmarks&num=2

另一篇:http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=214&blogId=1

以下部分主要关于ext4:

Linux kernel 自 2.6.28开 始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

  1. 与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。
  2. 更大的文件系统和更大的文件。较之 Ext3 目前所支持的最大 16TB 文件系统和最大2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
  3. 无限数量的子目录。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。
  4. Extents。Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小 为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“ 该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。
  5. 多块分配。当写 入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据 块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。
  6. 延迟分配。Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。
  7. 快速 fsck。以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。
  8. 日志校验。日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。
  9. “无日志”(No Journaling)模式。日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
  10. 在线碎片整理。尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。
  11. inode 相关特性。Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳 或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes) 和 inode 保留(inodes reservation)。
  12. 持久预分配(Persistent preallocation)。P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失 败。Ext4 在文件系统层面实现了持久预分配并提供相应的API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。
  13. 默认启用 barrier。磁盘 上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录, 若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)

文章写在2012年,目前最新的很多操作系统发行版,比如CentOS,已经内置支持了xfs文件系统,大部分的操作均可省略了。

XFS 文件系统

XFS文件系统是SGI开发的高级日志文件系统,XFS极具伸缩性,非常健壮。

Linux环境下。目前版本可用的最新XFS文件系统的为1.2版本,可以很好地工作在2.4核心下。

XFS文件系统简介

主要特性包括以下几点:

  • 数据完全性

    采用XFS文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。

  • 传输特性

    XFS文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS查询与分配存储空间非常快。XFS文件系统能连续提供快速的反应时间。笔者曾经对XFSJFSExt3ReiserFS文件系统进行过测试,XFS文件文件系统的性能表现相当出众。

  • 可扩展性

    XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes

    XFS使用高的表结构(B+树),保证了文件系统可以快速搜索与快速空间分配。XFS能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。

  • 传输带宽

    XFS 能以接近裸设备I/O的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达7GB每秒,对单个文件的读写操作,其吞吐量可达4GB每秒。

XFS文件系统的使用

1.下载与编译内核

下载相应版本的内核补丁,解压补丁软件包,对系统核心打补丁。

下载地址:ftp://oss.sgi.com/projects/xfs/d … .4.18-all.patch.bz2

对核心打补丁,下载解压后,得到一个文件:xfs-1.1-2.4.18-all.patch文件。

对核心进行修补如下:

1
2
# cd /usr/src/linux
# patch -p1 < /path/to/xfs-1.1-2.4.18-all.patch

修补工作完成后,下一步要进行的工作是编译核心,将XFS编译进Linux核心可中。

首先运行以下命令,选择核心支持XFS文件系统:

1
#make menuconfig

在“文件系统“菜单中选择:

<*> SGI XFS filesystem support ##说明:将xfs文件系统的支持编译进核心或 SGI XFS。 filesystem support ##说明:以动态加载模块的方式支持XFS文件系统。

另外还有两个选择:

  • Enable XFS DMAPI ##说明:对磁盘管理的API,存储管理应用程序使用。

  • Enable XFS Quota ##说明:支持配合Quota对用户使用磁盘空间大小管理。

完成上工作后,退出并保存核心选择配置。之后,然后编译内核,安装核心:

1
2
3
4
# make bzImage
# make module
# make module_install
# make install

如果你对以上复杂繁琐的工作没有耐心或没有把握,那么可以直接从SGI的站点上下载已经打好补丁的核心,其版本为2.4.18。它是一个rpm软件包,你只要简单地安装即可。SGI提交的核心有两种,分别供smp及单处理器的机器使用。

2.创建XFS文件系统

完成对核心的编译后,还应下载与之配套的xfsprogs工具软件包,也即mkfs.xfs工具。不然我们无法完成对分区的格式化:即无法将一个分区格式化成XFS文件系统的格式。要下载的软件包名称:xfsprogs-2.0.3。

将所下载的xfsProgs工具解压,安装,mkfs.xfs自动安装在/sbin目录下。

1
2
3
4
5
# tar –xvf xfsprogs-2.0.3.src.tar.gz
# cd xfsprogs-2.0.3src
# ./configure
# make
# make install

使用mkfs.xfs格式化磁盘为XFS文件系统,方法如下:

1
# /sbin/mkfs.xfs /dev/sda6 #说明:将分区格式化为`XFS`文件系统

格式化磁盘时,如果mkfs.xfs提示你分区原本已被格式化为其它文件系统,可以使用参数 –f 强行格式化:

1
#/sbin/mkfs.xfs –f /dev/sda6

3.加载XFS文件系统

1
#mount –t xfs /dev/sda6 /xfs ##其中/xfs是主分区/下的一个目录。

最后,为了让系统启动后就自动加载,应该更改/etc/fstab,这样系统启动后就会自动加载XFS分区而不必每次都手工加载。

要说明的一点是目前的XFS由于受Linux内存页限制,在x86版本中,只能实现文件系统的块尺寸为4K。另外,XFS文件系统可以不同的方式 mount,即允许文件系统以读方式加载,也允许以读写方式加载。这是因为XFS文件系统用作根文件系统时,为了安全要以只读方式加载。

网络中不中,先看ping行不行

linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了。

官方定义为:

ping - send ICMP ECHO_REQUEST to network hosts

ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性。

ping使用ICMP传输协议,通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示返回的相应情况,根据这些信息就可以判断目标主机是否可以访问,在发送的过程中还会有一个时间戳用来计算网络的状态。

不过有些服务器为了防止通过ping探测到,可能会在防火墙或者内核参数中禁止ping命令,这样的话,可能虽然目标主机可以访问,但是无法ping通,所以并不能说ping不通的网络就是不能访问的。

需要注意linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。

语法

ping的使用说实话挺复杂,挺多的,不过常用的这篇短文基本就够了。

详细如下:

1
2
3
4
5
# ALL
$ ping [-aAbBdDfhLnOqrRUvV46] [-c count] [-F flowlabel] [-i interval] [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N node‐info_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination

# 较常用的选项如下:
$ ping [-c count] [-i interval] destination

参数说明

  • -c <完成次数> 设置完成要求回应的次数。

  • -i interval 指定收发信息的间隔时间。

不加任何参数

如果不加任何参数,查看是否ping

1
2
3
4
5
6
7
8
9
10
11
12
$ ping www.baidu.com   
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=52 time=6.06 ms
64 bytes from 115.239.210.27: icmp_seq=2 ttl=52 time=5.56 ms
64 bytes from 115.239.210.27: icmp_seq=3 ttl=52 time=5.67 ms
64 bytes from 115.239.210.27: icmp_seq=4 ttl=52 time=5.82 ms
64 bytes from 115.239.210.27: icmp_seq=5 ttl=52 time=5.70 ms
64 bytes from 115.239.210.27: icmp_seq=6 ttl=52 time=5.79 ms
^C # 此处输入了Ctrl+C强制退出
--- 192.168.1.123 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.152/0.159/0.172/0.017 ms

可以看到可以pingwww.baidu.com,时延还算比较OK,几个毫秒量级。

这里看一下几个字段的含义,其中:

56(84) bytes of data:表示默认的数据包长度为56字节;

time=5.56ms:表示响应的时间,值越小,证明连接越快;

TTL=52:TTL是Time To Live的缩写,表示DNS记录在DNS服务器上存在的时间,是IP协议包的一个值,告诉路由器啥时候抛弃这个数据包,(大体上可以通过这个值来判断目标类型的操作系统。)

发送指定数目

可以通过 参数-c 来发送指定数目的包后停止

1
2
3
4
5
6
7
8
9
10
11
$ ping www.baidu.com -c 5
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=52 time=6.03 ms
64 bytes from 115.239.211.112: icmp_seq=2 ttl=52 time=5.96 ms
64 bytes from 115.239.211.112: icmp_seq=3 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=4 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=5 ttl=52 time=6.21 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 5.791/5.958/6.215/0.186 ms

此时将在发送5次数据包以后自动停止,在Linux里面,如果不加这个参数,是会一直发送运行的。

设定发送时间间隔

可以通过 参数 -i N指定每个N秒发送一次信息,如下将每隔3秒发送一次ping信息。

1
2
3
4
5
6
7
8
9
10
11
12
$ ping www.baidu.com -i 3
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=5 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=6 ttl=55 time=28.6 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 15041ms
rtt min/avg/max/mdev = 28.650/28.670/28.697/0.139 ms

如上,每隔3秒会发送一次,对于需要持续检测或者记录的可以考虑适当加大这个时间间隔。

注意,只有管理员可以设置小于0.2秒的时间间隔。所以这个数值可以是浮点数~

组合使用

上面的几个例子是可以配合使用的,比如

1
2
3
4
5
6
7
8
9
10
11
$ ping www.baidu.com -c 4 -i 5 
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=29.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=55 time=29.4 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 20045ms
rtt min/avg/max/mdev = 29.396/29.428/29.461/0.110 ms

这个例子为:每个5秒查询一次,一共查询4次,然后退出。

Linux网络入门ping

linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了。

官方定义为:

ping - send ICMP ECHO_REQUEST to network hosts

ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性。

ping使用ICMP传输协议,通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示返回的相应情况,根据这些信息就可以判断目标主机是否可以访问,在发送的过程中还会有一个时间戳用来计算网络的状态。

不过有些服务器为了防止通过ping探测到,可能会在防火墙或者内核参数中禁止ping命令,这样的话,可能虽然目标主机可以访问,但是无法ping通,所以并不能说ping不通的网络就是不能访问的。

需要注意linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。

语法

ping的使用说实话挺复杂,挺多的,不过常用的这篇短文基本就够了。

详细如下:

1
2
3
4
5
# ALL
$ ping [-aAbBdDfhLnOqrRUvV46] [-c count] [-F flowlabel] [-i interval] [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N node‐info_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination

# 较常用的选项如下:
$ ping [-c count] [-i interval] destination

参数说明

  • -c <完成次数> 设置完成要求回应的次数。

  • -i interval 指定收发信息的间隔时间。

不加任何参数

如果不加任何参数,查看是否ping

1
2
3
4
5
6
7
8
9
10
11
12
$ ping www.baidu.com   
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=52 time=6.06 ms
64 bytes from 115.239.210.27: icmp_seq=2 ttl=52 time=5.56 ms
64 bytes from 115.239.210.27: icmp_seq=3 ttl=52 time=5.67 ms
64 bytes from 115.239.210.27: icmp_seq=4 ttl=52 time=5.82 ms
64 bytes from 115.239.210.27: icmp_seq=5 ttl=52 time=5.70 ms
64 bytes from 115.239.210.27: icmp_seq=6 ttl=52 time=5.79 ms
^C # 此处输入了Ctrl+C强制退出
--- 192.168.1.123 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.152/0.159/0.172/0.017 ms

可以看到可以pingwww.baidu.com,时延还算比较OK,几个毫秒量级。

这里看一下几个字段的含义,其中:

56(84) bytes of data:表示默认的数据包长度为56字节;

time=5.56ms:表示响应的时间,值越小,证明连接越快;

TTL=52:TTL是Time To Live的缩写,表示DNS记录在DNS服务器上存在的时间,是IP协议包的一个值,告诉路由器啥时候抛弃这个数据包,(大体上可以通过这个值来判断目标类型的操作系统。)

发送指定数目

可以通过 参数-c 来发送指定数目的包后停止

1
2
3
4
5
6
7
8
9
10
11
$ ping www.baidu.com -c 5
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=52 time=6.03 ms
64 bytes from 115.239.211.112: icmp_seq=2 ttl=52 time=5.96 ms
64 bytes from 115.239.211.112: icmp_seq=3 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=4 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=5 ttl=52 time=6.21 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 5.791/5.958/6.215/0.186 ms

此时将在发送5次数据包以后自动停止,在Linux里面,如果不加这个参数,是会一直发送运行的。

设定发送时间间隔

可以通过 参数 -i N指定每个N秒发送一次信息,如下将每隔3秒发送一次ping信息。

1
2
3
4
5
6
7
8
9
10
11
12
$ ping www.baidu.com -i 3
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=5 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=6 ttl=55 time=28.6 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 15041ms
rtt min/avg/max/mdev = 28.650/28.670/28.697/0.139 ms

如上,每隔3秒会发送一次,对于需要持续检测或者记录的可以考虑适当加大这个时间间隔。

注意,只有管理员可以设置小于0.2秒的时间间隔。所以这个数值可以是浮点数~

组合使用

上面的几个例子是可以配合使用的,比如

1
2
3
4
5
6
7
8
9
10
11
$ ping www.baidu.com -c 4 -i 5 
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=29.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=55 time=29.4 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 20045ms
rtt min/avg/max/mdev = 29.396/29.428/29.461/0.110 ms

这个例子为:每个5秒查询一次,一共查询4次,然后退出。

Linux的静态库和动态库

编写库

如果有很多的函数要连接,这些函数可能来自不同的源文件,而且这些函数对于将来要编写的程序可能有用,那么可以直接创建一个库(就是一个存档文件)。库文件分为两种:当编译调用静态库中函数的代码时,那些函数编程最终可执行文件的一部分,另一方面,如果库是动态的,那么直到实际执行了程序,这些函数才会真正附加到调用代码上。

创建静态库

1
2
$gccg –c a.c
$ar rc liba.a a.o

这样就可以创建一个库文件liba.a,编译主程序时:

1
$gccg main.c –la

其中-la即为liba.a的缩写,两者含义相同。如果该库文件与源码不在一个目录,比如在lib目录,则需要L选项,即-Llib就可以将lib文件夹添加到搜索库文件的环境变量中。

这种方法的缺点就是如果很多程序使用同一个库,那么每个程序都会在磁盘上包含该库的独立副本,这样比较浪费空间。可以使用动态库解决这个问题(代价是需要一点额外的加载时间)。

创建动态链接库

1
2
$gcc –fPIC –c a.c
$gcc –shared –o liba.so a.o

这段代码创建了动态库liba.so,(Unix中命名动态库的惯例是使用后缀so,表示shared object,后面可能会跟着版本号。)与连接静态库一样地连接到这个动态库。(其中选项fpic:产生位置无关码

解释一下,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用。)

1
$gccg main.c –la

开源软件中库的用法

开源软件现在很流行,尤其是在Linux用户之间。然而有时会出现一个问题,即与源代码配套的构建脚本(通常称为配置文件)找不到某些必须的库。试图通过设置LD_LIBRARY_PATH环境变量可能会失败。

这种问题的根源常常在于配置文件调用的名为pkgconfig的程序,这个程序会从某些元数据文件处接收库的信息,这样的文件爱你后缀为.pc,前缀是库的名称,例如,文件爱你libabc.pc中包含库文件libabc.so*的位置。

curses库

这个库简单到很多人根本没有把它当成GUI。

程序员可以使用curses库编写让光标在屏幕上移动的代码,改变字符的颜色,或者改成反白显示,插入以及删除文本等。

例如,像Vim和Emacs这样的文本编辑器就是用curses编写的。

通过直接添加或者手动编译添加库,解决 library not found for -lxxx 等的问题

本文基本上能完美解决这种库文件无法找到问题,一般保存为library not found for -llxxx。

这个问题是说链接器在链接的时候找不到 Ixxx 这个库,那我们就告诉它(添加库的路径),让它找到就好啦!

扩展:

  • 静态库无法链接报错:
1
library not found for -lxxx
  • 动态库无法装载报错:
1
dyld: library not loaded …/libxxx.dylib

解决办法

方法一:直接添加库

通常解决办法是:库存在,直接添加路径。

也就是通常遇到这个问题的时候,库是已经编译安装好了的,但是 IED 不能找到。这样的话就直接添加库的路径就好了。

第一步:找库

第一步,自己找到这个库。

库一般放在系统默认处或者安装到特定地方。

Linux 系统默认库放在:

1
2
3
4
/lib
/usr/lib
/usr/local/lib
...安装到特定地方,如我 Mac 的用 Homebrew 安装到:
1
/usr/local/Cellar/ice/3.7.0/lib
第二步:添加路径

添加库一般以下三种方法任选其一:

  1. 系统环境变量添加

  2. 系统级:修改/etc/profile或者/etc/bashrc

  3. 用户级:修改~/.bashrc或者~/.bash_profile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
###添加库的bin文件夹路径
export PATH =$PATH:$HOME/bin

###添加到gcc头文件
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/MyLib

###添加到g++头文件路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/MyLib

###添加到动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib

###添加到静态库
export LIBRARY_PATH=$LIBRARY_PATH:/MyLib
1234567891011121314
  1. IED 编译环境添加

    因 IDE 不同而不同,如 Qt 在项目-构建设置-构建环境处添加

  2. 代码添加

1
2
3
 # 如 Qt pro 文件添加
LIBS += -L/the/library/path/ -llxx
12

这样,IDE就能找到库啦!

Linux的 od 命令

od - dump files in octal and other formats
顾名思义是查看八进制,可以通过指定参数为查看十六进制

  • -A 指定左边侧栏显示的地址基数,默认为八进制
  • -t 指定输出单元的进制格式和字节数
  • -x = -t x2 输出单元为双字节(注意:每单元内排列顺序从左到右为 [高字节|低字节])

例:

1
2
3
4
5
6
7
8
9
$  od -t x1 filename | less
0000000 ed de ad ab 76 00 00 00 76 89 00 59 e6 f3 75 14
0000020 f9 37 34 1b f7 b8 d3 4d ab 2d f1 ef f0 66 f5 12
0000040 2f 33 cf 40 e4 c2 cd 3f 5e 30 00 93 41 a1 0b 0c

$ od -A d -t x2 filename| less
0000000 deed abad 0076 0000 8976 5900 f3e6 1475
0000016 37f9 1b34 b8f7 4dd3 2dab eff1 66f0 12f5
0000032 332f 40cf c2e4 3fcd 305e 9300 a141 0c0b

最常用的且没有之一的 ls

.. note::
寻寻觅觅,冷冷清清,凄凄惨惨戚戚。
宋 李清照《声声慢·寻寻觅觅》

如果linux命令来个排名,ls命令应该是最常用的命令,除非你像黄蓉的母亲,有过目不忘的本领,惹得黄药师抱憾终身。

ls命令是list的缩写,通过ls命令,我们可以查看目录的内容,确定各种重要文件和目录的属性。

命令格式

1
$ ls [参数] [路径]

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

1
2
3
4
5
6
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

1
2
3
4
5
6
7
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

1
2
3
4
5
6
7
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

1
2
3
4
5
6
7
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

1
2
3
4
5
6
7
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4

使用-a显示所有文件

1
2
3
4
5
6
$ ls -la test/
.vs/
.vscode/
.git/
.gitignore
test.txt