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

Linux的 ls 命令

如果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

ncurses是字符终端下屏幕控制的基本库,在编译grub时出现如下错误:

1
2
3
/usr/bin/ld:can not find -lncurses

collect2: ld returned 1 exit status

首先安装ncurses。

Fedora/CentOS/RedHat

1
$ yum install ncurses-devel ncurses-static

Ubuntu:

1
$ apt-get install libncurses5-dev

Linux学习之道
http://www.linuxdiyf.com 看的。

做为中国人的特殊情况,学习linux对中国人来说要做的事情相对多了一些:

  1. 以linux为荣耀,以帮助他人了解和学习linux为己任。
  2. 坚持访问英文网站,尤其是一些大师的个人主页。坚持阅读英文文档,并尽量翻译你读过的文档发表到国内的社区上供他人阅读和整理
  3. 了解unix的历史,linux的历史和hacker的历史及文化
  4. 尽可能联系所以可以联系到Linux的爱好者,尽可能多的了解你能接触到的最了解linux的人对linux的看法。并于自己的观点相比较。
  5. 空闲时思索为什么自己喜欢linux,别人为什么喜欢linux。为什么你们喜欢的理由不同?
  6. 阅读各类的开源许可协议和商业的用户许可协议。对比他们各有哪些问题和优势。

以上使你了解开源文化,是作为一个合格的linux社区成员的前提。

  1. 安装一个linux的发行版本。
  2. 尽你最大的能力把你的学习、娱乐或者工作的环境转移到linux上来。尽量避免寻找linux功能类似的软件,而是寻找linux下解决同样问题的通用的方法。并且对比同windows下的解决方法哪种更加优越。
  3. 学会SHELL编程。SHELL几乎可以作为一个入门语言来学习。最低的要求是能够看懂你自己的版本的linux的配置脚本。理解为什么一些帖子中里提到的配置方法回起作用,并了解你的发行版本怎样从每个配置文件中把设置用环境变量的形式读取并让他生效的。
  4. 学会安装以各种方式发行的程序,并且让他们的安装同你系统的惯例一致。熟悉X windows的运作方式。熟悉你的发行版本的安全机制,并且学会定制他们按你的需求工作。

如果仅仅是作为用户并且部分体会unix的哲学,上面的几点就足够了。个人认为这几点足够成长为一个合格的Linux用户了。甚至只要再稍稍的扩充就可以制作自己的发行版本了!而对于不同的用户群体,比如办公用户或者科研人员等。第8条意味着不同的标准。

  1. 选择一门或几门语言社区常用的编程语言
  2. 搜集社区或者hackers推荐的图书或资料、网站、新闻组等。
  3. 选择一个较小的用你当前学习的语言开发的开源项目。阅读他的代码,并且对比他的代码和你形象的编写方式是否相同?哪种更加优越?
  4. 尝试按照TODO中的要求为这个软件编写代码,并且同他的作者联系。学习autoconf和automake等工具的用法。
  5. 你也可以不参与项目的开发,但仍然能从代码阅读中获益。如果项目是一种你没有接触到的技术或者标准的实现,那么搜集资料读懂它!
  6. 学会使用linux下的调试工具,如果软件还不太稳定,可以帮助找出BUG并且改正。并且学会制作patch发给作者。
  7. 如果曾是windows的程序员,尝试把开发环境转移到linux上来。或者开始在windows的开发工作中使用开源的开发工具和SDK。
  8. 如果是系统管理员,还要学会在linux部署更强的各类的安全方案。但这已经不属于学习linux的范畴了。

上面介绍了几条学习的要求,主要强调的是学习的态度。至于具体什么样的技术和自己应该在技术层次上的要求,按照上面介绍的方法应该会慢慢的体会到。

关于开发/编程工具

Refer from : http://www.zhihu.com/question/20302904

我认为开发编程工具分三类,需区别对待:

  1. 可以使用一辈子的工具,学习路径几乎没有尽头,值得在职业初期就好好考虑,仔细斟酌进行选择,并在整个生涯中不断努力力求学到更多,你的工作效率会因为这种努力不断提高。如:
  • 编辑器: vim / emacs
  • 基本操作系统环境:如shell
  • 基本编程语言: c / lisp
  1. 任何时候都需要掌握的工具,这类工具总是每隔一个周期就有新的产品出现,取代掉旧有的产品,但相对来说是值得学习的,能保持一个较长的时代的有效期,如:
  • 版本控制系统:git
  • 社交网络: stack overflow/github
  • 写作工具: markdown / latex / html
  • 通用编程语言: python / ruby / javascript
  1. 特定领域需要的工具,此类工具往往时效性较短,不断被新产品取代,一旦掌握,能在特定领域获得非常高的效率,但缺点是很快会过期,通常是几年之内
  • 各类编程框架: xcode / rails / backbone
  • 各类测试框架:xunit / rspec
  • 用户行为分析工具: ga
  • 各类设计工具: balsamiq
  • 各类项目管理,代码集成工具: github / trac / basecamp