打造高效的工作环境 – Shell 篇
注:本文由雷俊(Javaer/Emacser)和我一起编辑,所以文章版权归雷俊与我共同所有,转载者必需注明出处和我们两位作者。原文最早发于酷壳微信公众号,后来我又做了一些修改,再发到博客这边。
程序员是一个很懒的群体,总想着能够让代码为自己干活,他们不断地把工作生活中的一些事情用代码自动化了,从而让整个社会的效率运作地越来越高。所以,程序员在准备去优化这个世界的时候,都会先要优化自己的工作环境,是所谓“工欲善其事,必先利其器”。
我们每个程序员都应该打造一套让自己更为高效的工作环境。那怕就是让你少输入一次命令,少按一次键,少在鼠标和键盘间切换一次,都会让程序员的工作变得更为的高效。所以,程序员一般需要一台性能比较好,不会因为开了太多的网页或程序就卡得不行的电脑,还要配备多个显示器,一个显示器写代码,一个查文档,一个测试运行结果,而不必在各种窗口来来回回的切换……在大量的窗口间切换经常会迷路,而且也容易出错(分不清线上或测试环境)……
除了硬件上的装备,软件上也是能够提升程序员生产力的地方,在软件层面提升程序员生产力的东西有一个很重要的事就是命令行和脚本,使用鼠标和图形界面则会 ...
记一次Kubernetes/Docker网络排障
昨天周五晚上,临下班的时候,用户给我们报了一个比较怪异的Kubernetes集群下的网络不能正常访问的问题,让我们帮助查看一下,我们从下午5点半左右一直跟进到晚上十点左右,在远程不能访问用户机器只能远程遥控用户的情况找到了的问题。这个问题比较有意思,我个人觉得其中的调查用到的的命令以及排障的一些方法可以分享一下,所以写下了这篇文章。
目录
问题的症状
问题的排查
问题初查
重新梳理
柳暗花明
总结
问题原因
其它事宜
问题的症状
用户直接在微信里说,他们发现在Kuberbnetes下的某个pod被重启了几百次甚至上千次,于是开启调查这个pod,发现上面的服务时而能够访问,时而不能访问,也就是有一定概率不能访问,不知道是什么原因。而且并不是所有的pod出问题,而只是特定的一两个pod出了网络访问的问题。用户说这个pod运行着Java程序,为了排除是Java的问题,用户用 docker exec -it 命令直接到容器内启了一个 Python的 SimpleHtt ...
Linux PID 1 和 Systemd
要说清 Systemd,得先从Linux操作系统的启动说起。Linux 操作系统的启动首先从 BIOS 开始,然后由 Boot Loader 载入内核,并初始化内核。内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程。它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。(注:PID 0 是内核的一部分,主要用于内进换页,参看:Process identifier)
目录
SysV Init
UpStart
Systemd
Systemd 争论和八卦
其它
延伸阅读
SysV Init
PID 1 这个进程非常特殊,其主要就任务是把整个操作系统带入可操作的状态。比如:启动 UI – Shell 以便进行人机交互,或者进入 X 图形窗口。传统上,PID 1 和传统的 Unix System V 相兼容的,所以也叫 sysvin ...
Docker基础技术:DeviceMapper
在上一篇介绍AUFS的文章中,大家可以看到,Docker的分层镜像是怎么通过UnionFS这种文件系统做到的,但是,因为Docker首选的AUFS并不在Linux的内核主干里,所以,对于非Ubuntu的Linux分发包,比如CentOS,就无法使用AUFS作为Docker的文件系统了。于是作为第二优先级的DeviceMapper就被拿出来做分层镜像的一个实现。
目录
Device Mapper 简介
Thin Provisioning 简介
Thin Provisioning Snapshot 演示
Docker的DeviceMapper
Device Mapper 行不行?
Device Mapper 简介
DeviceMapper自Linux 2.6被引入成为了Linux最重要的一个技术。它在内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,它包含三个重要的对象概念,Mapped Device、Mapping Table、Target device ...
Docker基础技术:AUFS
AUFS是一种Union File System,所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。UnionFS的一个最主要的应用是,把一张CD/DVD和一个硬盘目录给联合 mount在一起,然后,你就可以对这个只读的CD/DVD上的文件进行修改(当然,修改的文件存于硬盘上的目录里)。
AUFS又叫Another UnionFS,后来叫Alternative UnionFS,后来可能觉得不够霸气,叫成Advance UnionFS。是个叫Junjiro Okajima(岡島順治郎)在2006年开发的,AUFS完全重写了早期的UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS在使用上全兼容UnionFS,而且比之前的UnionFS在稳定性和性能上都要好很多,后来的UnionFS 2.x开始抄AUFS中的功能。但是他居然没有进到Linux主干里,就是因为Linus不让,基本上是因为代码量比较多,而且写得烂(相对于只有3000行的union mount和10000行的UnionFS,以及其它平均下来只有60 ...
Docker基础技术:Linux CGroup
前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离。也就是说,虽然你通过Namespace把我Jail到一个特定的环境中去了,但是我在其中的进程使用用CPU、内存、磁盘等这些计算资源其实还是可以随心所欲的。所以,我们希望对进程进行资源利用上的限制或控制。这就是Linux CGroup出来了的原因。
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。然后,其它开始了他的发展。
Linux CGroupCgroup 可让 ...
Docker基础技术:Linux Namespace(下)
在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD、IPC、PID、Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像。在这一篇中,主要想向大家介绍Linux的User和Network的Namespace。
好,下面我们就介绍一下还剩下的这两个Namespace。
目录
User Namespace
Network Namespace
Namespace文件
参考文档
User Namespace
User Namespace主要是用了CLONE_NEWUSER的参数。使用了这个参数后,内部看到的UID和GID已经与外部不同了,默认显示为65534。那是因为容器找不到其真正的UID所以,设置上了最大的UID(其设置定义在/proc/sys/kernel/overflowuid)。
要把容器中的uid和真实系统的uid给映射在一起,需要修改 /proc/<pid>/uid_map 和 /proc/<pid>/gid_map 这两个文件。这 ...
应该知道的Linux技巧
这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解。 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化。如果你看过《你可能不知道的Shell》以及《28个Unix/Linux的命令行神器》你就会知道Linux有多强大,这个强大完全来自于命令行,于是,就算你不知道怎么去做一个环保主义的程序员,至少他们可以让你少熬点夜,从而有利于你的身体健康和性生活。下面是一个有点长的列表,正如作者所说,你并不需要知道所有的这些东西,但是如果你还在很沉重地在使用Linux的话,这些东西都值得你看一看。 (注:如果你想知道下面涉及到的命令的更多的用法,你一定要man一点。对于一些命令,你可以需要先yum或apt-get来安装一下,如果有什么问题,别忘了Google。如果你要Baidu的话,我仅代表这个地球上所有的 ...
用Unix的设计思想来应对多变的需求
之前,@风枫峰 在“这是谁的错?”中说过开发团队对需求来者不拒,而@weidagang 也在“需求变更和IoC”中说过用IoC来最大程度地解决需求变更。今天我也想从Unix设计思想的角度来说说什么是好的软件设计,什么样的设计可以把需求变更对开发的影响降低。(注意:这并不能解决用户或是PM的无理需求,面对无理需求,需要仔细分析需求,而用技术的手段无法搞定这个事,但是可以减轻需求变更带来的痛苦) 我曾经在《Unix传奇》的下篇中写过一些Unix的设计哲学和思想(这里重点推荐大家看一下《The Art of Unix Programming》,我推荐过多次了),以前也发过一篇《一些软件设计的原则》,不过,这些东西都太多了,记不住。其实,这么多年来,我的经验告诉我,无论是Unix设计,还是面向对象设计,还是别的什么如SOA,ECB,消息,事件,MVC,网络七层模型,数据库设计,等等,他们都在干三件事——解耦,解耦,还是解耦!所谓解耦,就是让软件的模块和模块间尽量少地依赖起来。
现实当中的例子
让我先举几个现实生活中的例子:
1、现实社会中,制造灯具的工厂完全不关心制造灯 ...
GNU/Linux下有多少是GNU的?
一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》 – GNU/Linux下有多少是GNU的。他的这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析,其给了两个饼图。
第一个饼图如下,其指明了各种主流的开源项目组的分布情况。可见GNU只占了8%,当然,GNome也是GNU的,加起来也只有13%,只占整个分发包很少的比重。
第二个图,作者把GNU的部分拿了出来,再进行了分析:
在下面这个图中,我们可以看到主要是四大块——gcc, gdb, binutils 和 glibc,所以,作者说,这些东西都不是最终用户需要的,不是每一个用户都是需要搞开发的。所以,如果去除这些,再去除Gnome(这个桌面UI也不是很力),那么GNU的东西几乎没有了。
所以,作者以此来挑战Richard Stallman提到的 GNU/Linux的这个说法。好像更为好的说法应该叫——
GNU/KDE/java/xorg/Linux
我对这篇文章有下述一些感觉:
以代码行来衡量重要性,非常的不准 ...
Linux 2.6.39-rc3的一个插曲
2011年4月12日,Linux 2.6.39-rc3发布了,Linus Torvalds写了一个发布邮件,其中包含了一个长长的为这个版本做过贡献的人员名单,这个名单中有很多看上去应该是中国人的名字,我挺为他们感到骄傲的(不知道你是否还记得以前本站的”Linux是由谁写的“)。
不过,没过一会,发现了一个bug,经过大家的调查(2.6.38版没有发现这个问题),很快,找到了原因,是因为一个内存地址的问题,一个叫Yinghai Lu的人(看其名字应该是中国人,其邮件是@kernel.org)找到了原因—— radeon card使用了一个不正确的内存地址[0xa0000000 – 0xc000000]。Joerg Roedel跟贴说,这个地址超出了4GB的内存,然后他和Alex Deucher聊了一会,觉得不应该是这个问题,因为这个地址应该是GPU的,而不是系统内存的。
好像,Yinghai Lu没有理会他们说的不应该是这个问题,给出了个fix:
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/ape ...
Unix传奇(上篇)
【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】
了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。
Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。在技术更新如此迅速的计算机世界的今天,Unix始终保持它那神圣的光环,它那曲折和令人叹息的历史,以及由它引发的思想变革,对当今计算机文化造成的深远影响,这40年所产生的人和事,让它成为了一个传奇,不能不让人为之惊叹。
这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世 ...
Unix传奇(下篇)
【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】
<<<< Unix传奇(上篇)
Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。由它引发的思想变革,对当今计算机文化造成的深远影响。这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世界文化最具代表性的,它对整个计算机世界文化的影响也是最巨大,最深远的。他给人带来的不单单的对过去的回味,更为我们带来了计算机世界的新思潮。
下篇
Unix与黑客文化
Unix的历史教训
Unix 家族谱
Unix的特点
Unix的影响和哲学
Unix痛恨者手册
上篇
Unix起源
Unix分裂
Unix的法律纠纷
GNU开源组织
Linux横空出世
...
装完Ubuntu 9.10后要干的事
Ubuntu 9.10刚刚release,就有人在网上发表了贴子告诉大家在装完这个操作系统后,还需要去安装的一些开源免费软件,相当丰富。不过,这个贴子的链接被GFW干掉了,所以,你需要使用Tor的支持,或是使用Google Reader才能查看源文(RSS链接)。而这个贴子非常长,所以我无法作全文翻译,不过这个贴子的内容具有很强的指导意义,所以我在这里为大家总结一下该文所提到的那些诸多的东西。(关于那些如何翻墙的事情怎么做我就不多说了,网上有很多相关的文章,你自己搜索一下就可以找到)
目录
基本工作
受限软件
界面相关
桌面相关
音频/视频编辑器
多媒体Playback
网页浏览器
游戏
图片和发行物
文件分享
时间管理
沟通软件
安全和隐私
系统工具
基本工作
1)第一件事自然是下载那些Ubuntu的镜像站点表,以及更新操作系统的一些补丁。“系统”->“管理”-> “更新管理器”。
2)第二件事是设置文件目录共享。就是在文件夹上点右键,在菜单 ...
恢复Ext3下被删除的文件
下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件。
假设我们有一个文件名叫 ‘test.txt’
$ls -il test.txt
15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt
注意:: “-il” 选项表示显示文件的i-node号(15),如果你不知道Unix/Linux文件系统的“I结点”的话,你有必要先补充一下相关的知识。简单说来,i结点就是操作管理文件的一个标识号。
我们再看一下其内容:
$ cat test.txt
this is test file
好,现在我们开始删除文件:.
$rm test.txt
rm: remove write-protected regular file test.txt'? y</span></span></div> <h4>使用 Journal 和 Inode 号恢复</h4> 注意,如果你删除文件后重启了系统,那么,相 ...
你用Linux命令行吗?
想一想,如果你要把一个图片的尺寸改小一点,你会怎么办?当然,我一定会启动一个图形编辑软件,然后,打开图片文件,从菜单上选择相关的工具选项,更改大小,然后保存文件。就算是在Linux下,我可能也是这么干的,比如Ubuntu下也是这样,如下图:
但其实,如果你用命令行来更改图片大小的话,一条语句就可以搞定了。如:
convert -resize 300 profile.jpg profile_small.jpg
当然,如果你要使用这样的命令,你需要安装Imagemagick,你可通过apt-get install imagemagick来安装一下。
不管怎么说,很简单吧,下面还有几个:
1)给图片加阴影
给图片加阴影可以使用下面的这个命令:
convert screenshot.jpg
\( +clone -background black -shadow 60×5+0+5 \)
+swap -background white -layers merge +repage shadow.jpg
效果如下:
2)把两个MP3拼起来
cat 1.mp3 2.mp3 > ...
高级Unix命令
在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好。Do one thing, do it well。这是unix的哲学。而且Unix首创的管道可以把这些命令任意地组合,以完成一个更为强大功能。这些哲学到今天都在深深地影响着整个计算机产业。比如今天最流行的“云计算”——把一个软件以碎片方式部署,然后这些功能可以任意组合。
这篇文章罗列了很多Unix下比较高级的命令,当然,Unix/Linux下还有更多更多的命令,我们相信你可能见过其中的某些命令,也有可能有一些命令没有见过。不管怎么说,我们希望这些命令一方面可以让你知道怎么使用Unix/Linux操作系统,另一方面,我们也希望你能从中感到Unix的那种软件开发的哲学思想。
ACCTCOM
::
查看所有用户执行过的进程(命令)
acctcom | tail -20
查看指定用户执行过的进程(命令)
acctcom -u <username> | tail -20
使用一个正则表达式查找相关进程 ...
最完美的Linux桌面软件
下面是关于Linux桌面环境下,目前为止最完美的部分。之所以说他们完美,是因为他们不但很养眼,而且也使用最好的多媒体技术,有最好的可用性。在某些方面,他们甚至超过了Windows和Mac-OS。
基础
Debian 或是 Ubuntu。这两个分发包是目前使用最广泛的Linux桌面操作系统的分发包了。
软件包管理器
因为我们使用debian……所以apt 必然是软件包管理器中最不错的一个。
桌面环境
这可能是最难的一个了。
KDE4 是出色的,相当的出色。
QT, 基于Gnome建造,也非常出色。
而在稳重方面, Gnome 桌面则是桌面中更为出色的。
而且,许多的应用基本上来说都是基于 GTK 开发的,而GTK则是基于GNOME桌面环境的。
所以,我们在这里选择 Gnome 作为最完美的图形桌面。对于KDE,只能非常抱歉了。
快捷任务条(Dock)
也许你并不喜欢docks,不过其的确可以帮你更方便地使用图形界面。
CairoDock吗? 当然,非常不错。那么 AWN 呢? 也不错。它 ...
十个你可能不曾用过的Linux命令
下面可能是你不曾用过后十个Linux的命令。相当的有用。
1)pgrep
pgrep名字前有个p,我们可以猜到这和进程相关,又是grep,当然这是进程相关的grep命令。不过,这个命令主要是用来列举进程ID的。如:
$ pgrep -u hchen
22441
22444
这个命令相当于:
ps -ef | egrep '^hchen' | awk '{print $2}'
2)pstree
这个命令可以以树形的方式列出进程。如下所示:
[hchen@RHELSVR5 ~]$ pstree
init-+-acpid
|-auditd-+-python
| `-{auditd}
|-automount---4*[{automount}]
|-backup.sh---sleep
& ...
Linux 的僵尸(zombie)进程
可能很少有人意识到,在一个进程调用了exit之后,该进程 并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所 有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有 任何内存空间。
僵尸进程的来由,要追溯到Unix,Unix的设计者们设计这个东西并非是因为闲来无事想装装酷什么的。上面说到,僵尸进程中保存着很多对程序员和系统管理员非常重要的信息,首先,这个进程是怎么死亡的?是正常退出呢,还是出现了错误,还是被其它进程强迫退出的?也就是说,这个程序的退出码是什么?其次,这个进程占用的总系统CPU时间和总用户CPU时间分别是多少?发生页错误的数目和收到信号的数目。这些信息都被存储在僵尸进程中,试想如果没有僵尸进程,进程执行多长我们并不知道,一旦其退出,所有与之相关的信息都立刻都从系统中清除,而如果此时父进程或系统管理员需要用到,就只好干瞪眼了。
所以,进程退出后,系统会把该进程的状态变成Zombie,然后给 ...