404频道

学习笔记

在使用SSH或者telent远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

安装

CentOS下默认没有安装该命令,从screen的官方网站下载,下载地址:http://ftp.gnu.org/gnu/screen/。

  1. 解压后执行./configure
  2. 执行make命令。在执行make命令时会遇到错误pty.c:38:26: 错误:sys/stropts.h:没有那个文件或目录,在/usr/install/sys/目录下创建一个stropts.h的空文件即可。
  3. 执行make install,该命令并不会将screen命令复制到系统的PATH变量包含的路径下,即不能执行screen命令。
  4. 执行install -m 644 etc/etcscreenrc /etc/screenrc
  5. 执行cp screen /bin/
  6. 执行cp doc/man/man1/screen.1 /usr/share/man/man1/,即可以可使用man screen查看帮助。

实现原理

当关闭窗口或断开连接时,内核会将SIGHUP信号发送到会话期首进程,进程对SIGHUP的处理动作为终止。如果会话期首进程终止,则该信号发送到该会话期前台进程组。一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

为解决上述问题,Linux程序在设计时可设计成守护进程的方式启动。

另外也可以通过nohup 命令 &的方式启动来解决问题。

新建screen

  • 直接输入screen命令即可使用。
  • 输入screen -S kuring,这里给screen取了一个名字,方便辨认。
  • screen 命令直接在screen中执行命令,命令结束后screen退出。

分离与恢复

在screen窗口中执行ctrl + a d命令,screen会给出_[detached]_提示,并恢复到执行screen之前的bash。
查找之前的screen执行screen -ls,会列出当前打开的screen。

1
2
3
4
There are screens on:
8576.pts-3.localhost (Attached)
8449.kuring (Detached)
2 Sockets in /tmp/uscreens/S-kuring.

这里系统中打开了两个screen,一个为Attached,另一个为Detached。

重新连接执行screen -r kuringscreen -r 8449screen -r,当系统中仅有一个处于Detached状态的screen时就可以直接执行screen -r命令。

关闭窗口

在screen的shell中执行exit命令即可关闭screen。

也可以执行ctrl + a k,会杀死当前screen中的所有运行进程。

错误

在screen中执行vi命令时会提示_E437: terminal capability “cm” required_错误,执行echo $TERM查看发现打印值为_screen_,而未执行screen时的bash打印值为_xterm_,在screen中执行export TERM=xterm即可解决该问题。

参考文档

更多高级使用方法请参考以下文档:

linux 技巧:使用 screen 管理你的远程会话
linux screen 命令详解

trim函数在其他语言中比较常见,这里用C语言实现一个,不使用C语言的库函数。该例子中不需要额外的申请空间,算法的时间复杂度为O(1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>

char *trim(char * str)
{
char *buf1, *buf2;
int i;
if (str == NULL)
{
return NULL;
}

// 处理字符串前面的空格
for (buf1=str; *buf1 && *buf1==' '; buf1++);

// 将去掉前面空格的字符串向前复制
for (buf2=str, i=0; *buf1;)
{
*buf2++ = *buf1++;
i++;
}
*buf2 = '\0';

// 处理字符串后面的空格
while (*--buf2 == ' ')
{
*buf2 = '\0';
}
return str;
}

int main(int argc, char *argv[])
{
printf("trim(\"%s\") ", argv[1]);
printf("returned \"%s\"\n", trim(argv[1]));
return 0;
}

本文是VMWare下的CentOS操作系统将yum源更改为光盘的实例,光盘的iso文件存放在宿主机器上,通过VMWare的共享文件夹功能与CentOS系统共享文件。CentOS中共享文件夹的存放路径为/mnt/hgfs中。CentOS的光盘为两张,分别为CentOS-6.5-x86_64-bin-DVD1.iso、CentOS-6.5-x86_64-bin-DVD2.iso。注意LiveCD版的CentOS系统盘是不可以作为yum源的。

挂载光盘

  1. mkdir -p /media/cdrom;mkdir -p /media/CentOS,创建挂载两个挂载目录,分别挂载DVD1和DVD2。
  2. 执行mount /mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD1.iso /media/cdrom/ -o loop;mount /mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD2.iso /media/CentOS/ -o loop;,将iso挂载到创建的目录下。
  3. 执行df -h命令即可看到挂载的文件系统,输出如下:
    1
    2
    /mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD1.iso  4.2G  4.2G     0 100% /media/cdrom
    /mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD2.iso 1.2G 1.2G 0 100% /media/CentOS

设置本地yum源

在/etc/yum.repos.d目录下CentOS-Base.repo记录着yum通过网络更新的源,CentOS-Media.repo记录着通过本地文件更新的源。其中CentOS-Media.repo文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# CentOS-Media.repo
#
# This repo can be used with mounted DVD media, verify the mount point for
# CentOS-6. You can use this repo and yum to install items directly off the
# DVD ISO that we release.
#
# To use this repo, put in your DVD and use it with the other repos too:
# yum --enablerepo=c6-media [command]
#
# or for ONLY the media repo, do this:
#
# yum --disablerepo=\* --enablerepo=c6-media [command]

[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

其中已经包含了/media/cdrom路径和/media/CentOS路径,至此配置已经完毕。

安装软件需要通过命令yum --disablerepo=\* --enablerepo=c6-media [command],执行yum [command]命令时还是联网执行。

设置开启启动自动挂载iso文件

在/etc/fstab文件中的末尾增加如下内容:

1
2
/mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD1.iso /media/cdrom/ iso9660 loop 0 0
/mnt/hgfs/iso/CentOS-6.5-x86_64-bin-DVD2.iso /media/CentOS/ iso9660 loop 0 0

X Window的实现机制还是比较难以理解的,尤其是跟软件开发中的客户端-服务器模式不太一样。涉及到概念也比较多,甚至很对教程对概念的理解不一。最近深入学习了下X Window的原理,在此做一下整理。先上一个摘自维基百科的图:
X Window架构

常用快捷键
ctrl+alt+fn:切换到相应的虚拟控制台,n为1-12。默认情况下,linux操作系统会在1-6上运行6个虚拟控制台。
ctrl+alt+退格键:关闭X window系统。
在vmware环境下,ctrl+alt快捷键跟vmware冲突,需要先按住ctrl+alt,然后按一下空格键并松开,再按下相应的fn键才能使用。

X Server
负责硬件管理、屏幕绘制、字体,并接收输入设备(如键盘、鼠标等)的动作,并且告知X Client。
Linux下的X Server软件为Xorg,通过X(Xorg的链接文件)命令即可执行。
输入X命令后,会在第7个控制台启动X Server,将会出现一个什么都没有的漆黑界面,这是由于没有任何X client程序输入的原因。
可以在Linux下启动多个X Server软件,从0开始编号。如果再执行X:2命令会启动第二个X Server,此时X Server会在第8个控制台运行。如果第一次执行的是X:2命令则X Server会在第7个控制台运行。
在Windows操作系统下的Xming、Xmanager等可以远程连接Linux界面的软件其实就是X Server。

X Client
即X应用程序,运行在X Window下的窗口程序都属于X client。比如firefox就是一个X Client。接收来自X Server的处理动作,将动作处理成为绘图数据,并将绘图数据传回给X Server。X Client与X Server之间通过X Window System Core Protocol协议进行通讯。
xclock是一个简易的X Client的时钟程序,在:1上启动X Server后,执行xclock –display :1&命令将xclock输出到X Server后的画面如下:
xclock
该程序可以在X Server上执行,但是画面非常简陋,甚至没有窗口的菜单栏和最大化等按钮。

Window Manager
一种特殊的X Client,提供了窗口的样式。常用的Window Manager包括GNOME默认的metacity、twm等。
将metacity输出到:1上的X Server的命令为metacity –display=:1 &,效果如下:
Image Title
可以看到窗口多出了最小化、最大化、关闭按钮,并且窗口可以移动和缩放等操作。

Display Manager
提供用户登录画面、帮助X Server建立Session。
gnome采用的Display Manager为gdm,KDE采用kdm,还有tdm、xdm等。

Desktop Manager
X Server、X Client、Window Manager的一个集合。常用的Desktop Manager包括:KDE、GNOME等。

startx启动流程
在命令行下执行startx命令后,系统直接进入了桌面环境,并未出现登录界面。进程树如下:
Image Title

  1. startx会调用xinit命令,xinit命令的主要是启动一个X Server软件。
  2. 接着xinit命令会调用gnome-session启动gnome的环境所需要的软件。

init 5启动流程
在命令行下执行init 5,首先出现的画面为登录信息。进程树如下:
Image Title

  1. 执行/etc/rc.d/rc5.d中的daemon。
  2. 执行/etc/X11/prefdm文件,会选择启动gdm、kdm、xdm、tdm。
  3. 这里以gdm为例,gdm是一个shell脚本,会启动gdm-binary命令。

实战
Windows主机连接Linux的教程参见我的另外一篇文章《Redhat安装完成之后的设置》中的相关部分。
两台Linux机器之间通过XWindow实现连接的用法比较少见,通常情况下可以通过vnc代替。
Linux主机连接Windows的工具为rdesktop。

参考文章
《鸟哥的Linux私房菜》
《Linux操作系统之奥秘》
视频:RH033-ULE112-16-linux下X图形显示体系
视频:Xwindow详解

本文对Linux常用的网络命令进行整理和总结。

连通性测试

ping命令

最常用的网络诊断命令。

1
2
3
4
5
6
7
8
[kuring@localhost ~]$ ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=25.5 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=128 time=20.3 ms
64 bytes from 61.135.169.125: icmp_seq=3 ttl=128 time=25.0 ms
64 bytes from 61.135.169.125: icmp_seq=4 ttl=128 time=21.7 ms
64 bytes from 61.135.169.125: icmp_seq=5 ttl=128 time=23.4 ms
64 bytes from 61.135.169.125: icmp_seq=6 ttl=128 time=21.9 ms

通过上述输出可以看出,ping命令可得到DNS对应的IP信息、ping的数据包大小、网络延迟信息。

另外,可以通过-s参数指定ping的数据包大小。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kuring@ubuntu:~$ ping www.baidu.com -s 1024
PING www.a.shifen.com (61.135.169.125) 1024(1052) bytes of data.
1032 bytes from 61.135.169.125: icmp_req=1 ttl=55 time=22.6 ms
1032 bytes from 61.135.169.125: icmp_req=2 ttl=55 time=22.9 ms
1032 bytes from 61.135.169.125: icmp_req=3 ttl=55 time=53.0 ms
1032 bytes from 61.135.169.125: icmp_req=4 ttl=55 time=28.0 ms
1032 bytes from 61.135.169.125: icmp_req=5 ttl=55 time=54.7 ms
1032 bytes from 61.135.169.125: icmp_req=6 ttl=55 time=93.1 ms
1032 bytes from 61.135.169.125: icmp_req=7 ttl=55 time=26.9 ms
1032 bytes from 61.135.169.125: icmp_req=8 ttl=55 time=25.2 ms
1032 bytes from 61.135.169.125: icmp_req=9 ttl=55 time=25.4 ms
^C1032 bytes from 61.135.169.125: icmp_req=10 ttl=55 time=21.2 ms

--- www.a.shifen.com ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 45436ms
rtt min/avg/max/mdev = 21.225/37.350/93.149/21.966 ms

会发现ping命令的响应时间变长了,这正是由于ping发送数据包变大了。

traceroute

可以显示路由信息。

mtr

traceroute命令的升级版,可以动态刷新路由信息,可以显示路由上每个节点的丢包率和时间等信息,信息比较全面和直观。

arp相关

arping

可以通过该命令查看IP地址对应的mac地址。arping IP地址会立即发送一个arp广播,可以根据收到的arp回应的多少看局域网内是否中arp病毒、IP地址冲突等情况。

arp

跟arp协议相关,可以设置arp表、读取arp表等。

端口相关

telnet

可以利用该命令来测试某个端口是否打开。例如执行telnet localhost 881其中881为本机的未打开端口,会产生如下输出:

1
2
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

执行telnet localhost 22,其中22端口为本机的ssh服务端口且已经打开,会产生如下输出:

1
2
3
4
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.3

则表示本机的22端口已经打开。

netstat

查看本机网络端口命令,常用netstat -aunp

#DNS相关

host

1
2
3
4
kuring@ubuntu:~$ host www.google.com.hk
www.google.com.hk is an alias for www-wide.l.google.com.
www-wide.l.google.com has address 74.125.128.199
www-wide.l.google.com has IPv6 address 2404:6800:4005:c00::c7

nslookup

1
2
3
4
5
6
7
8
kuring@ubuntu:~$ nslookup www.google.com.hk
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
www.google.com.hk canonical name = www-wide.l.google.com.
Name: www-wide.l.google.com
Address: 74.125.128.199

dig

可以代替nslookup的命令,显示的域名信息更为详细。

其他

ab

Linux下的压力测试工具,可以模拟多个客户端发送多个请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
kuring@ubuntu:~$ ab -c 100 -n 100 http://kuring.me/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking kuring.me (be patient).....done


Server Software: Tengine/2.0.0
Server Hostname: kuring.me
Server Port: 80

Document Path: /
Document Length: 707 bytes

Concurrency Level: 100
Time taken for tests: 1.547 seconds
Complete requests: 100
Failed requests: 10
(Connect: 0, Receive: 0, Length: 10, Exceptions: 0)
Write errors: 0
Non-2xx responses: 90
Total transferred: 145330 bytes
HTML transferred: 126570 bytes
Requests per second: 64.64 [#/sec] (mean)
Time per request: 1546.990 [ms] (mean)
Time per request: 15.470 [ms] (mean, across all concurrent requests)
Transfer rate: 91.74 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 173 223 43.8 200 289
Processing: 167 340 301.5 236 1368
Waiting: 166 339 300.5 235 1364
Total: 345 563 295.4 438 1546

Percentage of the requests served within a certain time (ms)
50% 438
66% 555
75% 562
80% 597
90% 1108
95% 1474
98% 1484
99% 1546
100% 1546 (longest request)

参考

长期以来在使用gdb调试代码的时候都会因为调试代码的时候查看代码不方便而烦恼,gdb的list命令不够好用。而且网上的教程中也确实不容易发现可以替代gdb的好的终端下的调试工具,对于图形界面的集成开发环境(比如Eclipse CDT)和图形界面的调试工具(比如DDD)不在本文讨论的范围内,毕竟很多时候连接linux的时候还是终端方式的居多。

tui模式

直到后来偶然间发现了gdb的-tui参数,该参数通过文本用户界面模式进行调试代码,使用起来确实方便了许多,再也不用边调试边list代码了,该模式已经满足了我的边调试边查看代码的需求。另外,gdbtui命令也可完成相同的功能。一个tui调试模式的界面如下:

gdb -tui

虽然,tui模式大大的提供了调试的友好性,但是仍然有一些缺点。比如显示的代码无法语法高亮,虽然会很影响用户体验,但是我毕竟是一名后台开发的程序员,这点可以忽略不计。源码布局和gdb命令布局之间切换不够方便,这点也不要紧,毕竟可以切换,只是需要输入两个单词就可以切换了。最最有问题的就是,该命令使用的时curses库,当用ssh通过windows下的SecureCRT或者putty连接进行调试时,源码布局部分往往不能够自动刷新,需要手工输入CTRL+L来刷新,具体的原理我没有去深究。

cgdb

主要是本着解决gdb tui中的源码布局不能自动刷新的问题,本文的重点cgdb命令终于闪亮登场了。该命令不仅解决了源码布局自动刷新问题,同时也支持了语法高亮,同时源码查看支持vi的部分命令。功能基本跟vimgdb相近,但是安装更容易,在ubuntu下只需执行sudo apt-get install cgdb即可。

cgdb

下面是一些常用命令:

ESC:切换焦点到源码模式,在该界面中可以使用vi的常用命令

i:切换焦点到gdb模式

o:打开文件对话框,选择要显示的代码文件,按ESC取消

空格:在当前行设置一个断点

参考文章

Beej’s Quick Guide to GDB
cgdb

最近买了本新书《深度探索Linux操作系统》,在按照书中步骤学习的过程中,无奈在安装步骤中出错,于是只能到网上找书评。在浏览书评的过程中偶然看到LFS三个名词,google之,发现是手动安装Linux的官方学习手册,学习之。

解压命令

一直对解压命令的参数记不清楚,记录一下:
tar -Jvxf *.tar.xz
tar -zvxf *.tar.gz
tar -xvf *.tar.bz2

将一般用户可以使用sudo命令执行命令的方法

执行visudo命令来修改文件内容,将本用户添加到文本文件中。修改的文件为/etc/sudoers,该文件默认为只读的,但是可以通过visudo命令来修改。

login shell和non-login shell

login shell:shell会重新读取/etc/profile和/.bash_profile来应用新的环境变量。通过su - 用户名的方式登录为login shell方式。
non-login shell:此时shell不会读取/etc/profile和
/.bash_profile,而是读取~/.bashrc来应用新的环境变量。通过su 用户名登录的方式为non-login shell方式。

文中lfs用户下的~/.bash_profile的内容如下:

1
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash

而lfs用户下的~/.bashrc文件的内容如下:

1
2
3
4
5
6
7
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH

而最令人奇怪的是即使通过su - lfs命令登录也会执行到.bashrc文件的内容,不信可以通过在.bash_profile和.bashrc文件的开始地方打印内容来验证。之所以出现如此奇怪的问题,原因在于~/.bash_profile中的命令。其中exec命令和linux系统中的exec系列函数的含义是一致的,即在当前bash中直接执行exec后面的命令,而不用fork一个新的进程来执行。env命令会通过当前用户的HOME和TERM环境变量及自定义的PS1环境变量来执行新的/bin/bash,而新执行的bash为non-login shell方式,因此会执行lfs用户下的.bahsrc文件。

总结一下,就是~/.bash_profile文件中的env命令通过non-login shell方式执行了新的bash,exec命令的作用是不在当前bash中执行新的bash,而不是通过产生一个新进程的方式来执行bash。

POSIX && FHS && LSB

POSIX.1-2008,通过该网站来查询系统函数等非常方便。
Filesystem Hierarchy Standard (FHS)
Filesystem Hierarchy Standard (FHS),可以通过此标准来学习Linux的目录含义。
Linux Standard Base (LSB) Specifications

set +h

The set +h command turns off bash’s hash function. Hashing is ordinarily a useful feature—bash uses a hash table to remember the full path of executable files to avoid searching the PATH time and again to find the same executable.

虚拟终端PTYs

PTY 设备与终端设备(terminal device)相类似——它接受来自键盘的输入,并将文字传递给运行在其上的程序以备输出。PTY 被依次编号,且每个 PTY 的编号就是它在 /dev/pts 目录中对应设备文件的文件名。

devpts file system

远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。

specs文件

gcc 是一个驱动式的程序. 它调用其它程序来依次进行编译, 汇编和链接. GCC 分析命令行参数, 然后决定该调用哪一个子程序, 哪些参数应该传递给子程序. 所有这些行为都是由 SPEC 字符串(spec strings)来控制的. 通常情况下, 每一个 GCC 可以调用的子程序都对应着一个 SPEC 字符串, 不过有少数的子程序需要多个 SPEC 字符串来控制他们的行为.

查看当前shell

  1. 查看默认shell可以用命令:echo $SHELL
  2. 查看当前shell:ps | grep $$ | awk '{print $4}'
  3. 通过输入一个不存在的命令来查看,如输入tom,可显示bash: tom: command not found,说明当前的shell为bash。

expect

一种提供自动交互的脚本语言。

tee命令

重定向输出到多个文本文件命令。

pkg-config

configure脚本在检查相应依赖环境时(例:所依赖软件的版本、相应库版本等),通常会通过pkg-config的工具来检测相应依赖环境。

详细内容见:简述configure、pkg-config、pkg_config_path三者的关系

2013年在不经意间过去了,总结起来收获还是不小的。我的大部分业余时间用在了学习上,看书看书再看书。每个周五或周六晚上会玩上一晚上dota以放松,周末会抽一天时间出去散散心。

学习

学习上进步还算比较大,学习方式以看书为主,尤其是对Linux有了较深入了解。在年初的时候制定了深入学习Linux的计划,包括Linux内核,大约从五月下旬开始学习。

信息系统项目管理师

当时抱着该考试可以挂靠的心态来学习PM,从春节后开始学习,五月末考试,大约花了三个月时间。学习思路为从淘宝上买的YY讲课的培训视频,价格还算便宜,隔一天晚上上一课,一次讲课时间在一个半小时左右。听了几次课之后就发现老师废话挺多,但是如果自己看书复习又抓不住重点,因此还是硬着头皮听老师讲课,就当作休息了。参考图书共三本,加起来足够2000页的样子,还做了历年的部分真题。由于自己手懒,写作在考试之前没有写过一篇,只是在考试之前背了两篇范文,结果考试的时候写作没有压中,离分数线差了两分。

下半年考试没有报名,经过了一次考试后看清了PM的真面目,纯属搞理论,距离实际太远。如果为了挂靠去花费宝贵的业余时间来学习实在有点不得不偿失。现在回想起来多少有些后悔,但是不尝试怎么能知道PM到底是个啥东西呢。

Linux

Linux的系统知识今年进步挺大的,无论是在编码、对系统的理解还是内核方面都有非常大的进步。

《鸟哥的Linux私房菜–基础学习篇》

两年多前看过一次,利用工作中的空闲时间重新回顾了一边,收获还是挺大的。

《鸟哥的Linux私房菜–服务器架设篇》

两年前买的书,当时没有通读,感觉含金量跟基础学习篇太大。利用工作之余通读一遍,收获也还算可以。

《Unix环境高级编程》

Linux编程圣经,花了接近两个月时间看完,看完后收获很大。

《Unix网络编程》

Linux网络编程圣经,花了一个月时间看完,看完后对写TCP/IP通信的程序很有帮助,作为《Unix环境高级编程》的很好补充。

《Linux内核完全剖析》

该书花了我接近半年的时间来学习,现在看完了五分之四左右,还有文件系统章节没有学习。学习下来收获很大,后续会结合《Linux内核图解》一书来补充学习和归纳。

《程序员的自我修养》

通过学习对Linux的elf和windows的pe结构都有了较深入的了解,不过事隔半年之后已经全部忘记了,需要再温习一遍。

微信公共帐号

从年初开始,每天会花一定时间来阅读微信公共帐号的文章,初期订阅的文章基本都会阅读,后期订阅量大了有些就仅浏览标题了。我订阅的公共帐号里比较好的有:鬼脚七、道哥的黑板报、小道消息、Mac Talk等。鬼脚七写人生类的文章我比较喜欢看,也比较赞同作者的观点。

其他

###《30天自制操作系统》
从2012年年底开始读的图书,花了接近三个月的时间通读,读到中间部分还反过头来重读一遍。学习到三分之二的时候感觉对我用处不大,因为不会对我理解Linux或Windows操作系统有太大帮助,放弃之。

《Hadoop权威指南》

项目需要,对Hadoop没有足够的兴趣,理解了是怎么回事对我就足够了。同时还研究了Solr、HBase、MonogoDB等大数据软件。

《Git权威指南》

向对Git有进一步的理解,目前仅看完了一半,分支管理部分还没有学习。

###《浪潮之巅》
吴军博士的经典,我主要拿来在看书看累的时候消遣用,和《黑客与画家》的效果相当,很抱歉看了大半年了到现在仍然在看。

《深度探索C++对象模型》

之前曾一度要学习,无奈一直没有看进去,lippman写的和侯捷翻译的实在是诡异。这次边写博客记录边看,居然效果很不错。最后时间有限,留了个小尾巴没有看完。

工作

由于之前的公司经营不善,加上今年全国经济形式不好,公司持续几个月发不下工资来,考虑到个人经济状况换了一份工作。在济南这种小地方,找个理想的工作实在是不容易,甚至今年很多公司都不再招聘。我找工作以技术为导向,家附近一堆做电信BOSS的外包公司,一概不考虑。新工作还算可以,依旧加班较少,只是周六是间歇性上班,这个可以忍,还算有较充足的业余时间来学习。

工作中用到的技术以C、C++为主,兼涉及到Android、PHP等。从元旦之后上班第一天,自己单打独斗从零开始做了一个短信管家类项目,到五月份后终止,结果跟我预想的完全一致,以失败而告终。回想当初真该将我当时对项目的看法跟领导沟通一下,而不是盲目的接下公司安排的任务。当时领导对互联网、APP的理解完全是幼稚园水平,一家传统行业的软件企业想来玩转互联网行业困难可想而知,我作为唯一的项目成员在项目的开始已经看到了没有任何意外的结局。如果当初将这五个多月的时间用来做些Linux的东西,对我个人的成长将是相当巨大的。

生活

2013经济上不是很宽裕,没有旅游,仅有的一次市外旅游是南部山区的红叶谷。在济南这种地方,工资压得低,技术牛人又少,实在悲剧。生活虽然对我少了些许精彩,但过的还算比较充实。

博客

为了能够更好的总结学习经验,年初准备有写博客的计划。之前零零散散的也写过一些,没有坚持住,现在看来我的博客写作计划坚持的还算不错,从6月份到年底共写了40篇博客,大都是自己的学习经验总结。前期博客写了一些非技术类博文,后期觉得没有这个必要不再写非技术类博客。

为了搭建博客,又不想花钱买个不稳定的空间。我研究了Github上的jekyll、基于网盘(DropBox、Google Driver)的Farbox等搭建博客技术,参照了大量的jekyll主题,几乎将jekyll wiki上列出的主题都看了一个遍,也没有发现一个令我非常满意的主题,后挑选一个主题在Github上实验,不知是我markdown语法写的问题还是Github对markdown的解析问题,解析效果不够理想,但是我写的markdown在Farbox上却没有问题。最后采用了Farbox作为博客平台,并对Farbox的默认主题进行了少量修改。并从Godaddy上购买了kuring.me域名。

2014年计划

2014,除了工作之外,我也业余时间仍然会大部分奉献给阅读书籍,以Linux内核方向为主。趁着年轻,多读些书,永远是正确的。

在Virbutal Box下安装CentOS虚拟机,在安装完Virtual Box增强功能后在分辨率列表中,仍然没有适合屏幕的分辨率1600*900。本文将通过xrandr命令来修改当前屏幕的分辨率。

一. 执行xrand -q列出当前系统中已有的分辨率。显示内容如下:

1
2
3
4
5
6
7
8
Screen 0: minimum 64 x 64, current 1024 x 768, maximum 32000 x 32000
VBOX0 connected 1024x768+0+0 0mm x 0mm
1024x768 60.0*+ 60.0*
1600x1200 60.0
1440x1050 60.0
1280x960 60.0
800x600 60.0
640x480 60.0

需要特别注意的是VBOX0,代表显示器的名字,下面会用到。

二. 执行cvt 1600 900命令列出分辨率1600*900需要的参数,后面会用到。显示内容如下:

1
2
# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync

该命令列出的内容下文会用到。

三. 执行xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync命令,该命令中的参数是参考步骤2中的输出信息。

四. 执行xrandr --addmode VBOX0 1600x900_60.00来向系统分辨率组中添加分辨率1600*900。其中VBOX0为步骤1获取的显示器名字,1600x900_60.00为步骤3添加的分辨率模式。

五. 执行xrandr --output VBOX0 1600x900_60.00来应用刚才添加的分辨率。这样屏幕就可以更改为正确的分辨率了。

网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧。Linux下要配置网桥的方法有两种,一种是通过修改配置文件,另外一种是通过brctl工具。修改配置文件的方式是通过修改/etc/sysconfig/network-scripts/ifcgg-eth*文件来完成的,这种方式没有仔细研究。本文将编写两个脚本来完成网桥的创建和删除,脚本的功能为将机器上的网卡eth1和eth2桥接,而网桥本身未设置ip。

网桥创建脚本

本脚本利用brctl命令将网卡eth1和eth2桥接,可以通过brctl show命令查看结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 脚本作用为将两个网卡桥接

# 检测brctl命令是否存在
brctl > /dev/null
if [ $? != 1 ]; then
echo Command brctl not exist, please setup it. The setup execute command is \"yum install bridge-utils\"
exit 0
fi

# 检测网桥br0是否存在,如果存在首先删除
declare -i result=$(brctl show | grep eth0 | wc -l)
if [ $result > 0 ]; then
echo detect the bridge br0 have already exist, first delete it
ifconfig br0 down
brctl delbr br0
fi

ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 eth2
ifconfig br0 up
echo create bridge br0 success, you can use command : \"brctl show\" to check

网桥删除脚本

本脚本将桥接网卡br0删除

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 检测是否存在网桥br0
declare -i result=$(brctl show | grep br0 | wc -l)
if [ $result == 0 ]; then
echo "bridge br0 not exists, exit immediately"
exit 0
fi

# 删除网桥br0
ifconfig br0 down
brctl delbr br0
echo "delete bridge br0 success"

注意事项

brctl命令创建的桥接网卡在机器重启后会删除,最好将创建桥接网卡的命令放入到linux的开机启动脚本中,这样每次开机的时候都可以自动创建桥接网卡了。

参考网址

bridge命令介绍

0%