tingxueren.com

reading && thinking


  • 首页

  • 归档

  • 标签

为 blog 添加 https 证书

发表于 2016-11-05   |  

静极思动,今天小小的折腾了一下,给 blog 添加了 https 证书。

  • 证书:Let’s Encrypt
  • 教程:Let’s Encrypt,免费好用的 HTTPS 证书

过程并不复杂,学些了一定 https 的申请、签发、鉴权的流程与原理,也算有点收获。

Blog 迁移

发表于 2016-10-09   |  

just test

  • 尝试下新变化
  • 从 octopress 迁移 hexo
  • 万年不更新的诈尸

杂记

发表于 2014-04-20   |  

blog已经荒废日久,距上一次更新又过了整整3个月,1/4年就这么过去了。在过去的这段日子里,生活已经悄然发生了重大的改变,我也迈上了人生的另一段旅程。从校园走向社会,从熟悉的城市走向陌生的地域,从南方到北方,一切都变了,场景的转换如此的快以至于容不下片刻的思考。那些喜悦、那些悲伤、那些留恋、那些不舍都值得在心底珍藏。

毕业

突然就毕业了,虽然一直都盼望这这一天,但是这一天真的来到的时候却有点恐惧,对未来的恐惧。未来将不再是简单的校园生活,再也没有那么多的自由的时间,也很难再有单纯而真挚的友谊,进入社会人们都会变的不一样,人们都在面具的后面小心翼翼的活着,在社会的这个大染缸中不知道自己是不是会变成自己曾经讨厌的那种人。毕业了,两年多的时间就这么过去了,朝夕相处的各位兄弟姐妹都要天各一方了,告别的日子里大家举杯共饮,喝醉了一次又一次,离别后再难相见绝对不是句空话。祝福兄弟姐妹们,希望你们都能活出自己的精彩。

迁徙

毕业的第二天就踏上了北上的路,从秀丽杭城来到了喧嚣的帝都。杭城就是个温婉的姑娘,典雅,含蓄,内敛,真的很喜欢杭州的绿树,街边的公园,静谧的小河,还有大街上闲适的行人,真的很适合生活。来到帝都的第一印象就是灰蒙蒙的天,裸露的土地,突然刮起的大风吹起漫天的沙子打在人的脸上,厚重的雾霾,突然感觉像来了到一个大工地似的,没有草坪,仅有的几个小草半死不活的,没有流水,路边的树一副苦大仇深营养不良的样子,叶子上还落这一层灰。看到这个糟糕的环境突然感觉来到帝都可能是个错误,既来之则安之吧,这么多人都在北京飘着,我应该也可以。

渐渐的发现帝都还是有自己的优点的,首先帝都很大,与杭城的精致纤细不同,有一种大气的感觉,千年古都自有其神韵,地方大了也就有了优劣之分,可爱的优美的地方帝都还是不少的,这个需要慢慢的去发掘。其次,帝都的交通很便利,也很便宜,地铁网络密集,公交四通八达,只要坐上地铁基本上距离不再是个问题,嗯,拥挤永远是个问题。帝都的人很热情,不论是超市里的大妈还是路上行色匆匆的白领,当你向他们求助的时候还是能得到热心的帮助的。

生活&工作

离开了学校,解锁了很多的技能。第一次租房,第一次与中介打交道,第一次独立的做饭……,一项项的第一次都是一种宝贵的人生财富。终于开始了人生中的第一份的正式的工作,发现和现象中的完全的不同,感觉工作的节奏与压力比在学校中大的多,实际工作中需要的技能和学校中学习到的知识是两码事,自己的知识储备严重的不够用了,开始工作也就开始了另一种学习。前路还长,新生活刚刚开始,慢慢走,慢慢看,且行且珍惜!

简易http proxy搭建

发表于 2014-01-10   |  

最近学校的网络超级的不爽,原来上下行都能达到几十M的网速被生生的限制为下行3M,上行0.3M不说而且屏蔽了很多网站,使用的手段相当的龌龊,直接在出口路由上将网站直接指向了127.0.0.1,十分的郁闷。我的迅雷会员算是废了,无法在线看视频了,WTF。

还好最近申请到了Windows Azure的试用名额,除了开着Boinc做WCG任务获取点XRP就是在闲着,就想着用这服务器搭建个http proxy脱离学校的魔掌,使用正常的网络。但是普通的http proxy无法访问那些“不存在”的网站,因此需要该http proxy自动的处理正常网站和被封锁网站之间的关系。基本的思路是做个路由表使得正常的网站走国内网络,“不存在”网站走国外的代理。

基本需求

硬件

国外vps一台(Digitalocean)

国内vps一台(Windows Azure)

上述两台服务器使用的都是ubuntu 12.04.3 LTS

软件

shadowsocks

obfsproxy

privoxy

squid3

步骤

shadowsocks和obfsproxy

在国外vps上运行shadowsocks和obfsproxy,shadowsocks提供socks代理服务,obfsproxy负责将流量进行混淆,使得代理更加的安全,不使用obfsproxy也可以。这两个软件的安装配置都比较简单,在各自的官方网站上都有详细的介绍。这样国外的vps上的工作已经做完了,重点在于国内vps上的配置。

国内vps上同样也要先安装shadowsocks和obfsproxy,不同的是国外安装的都是服务器版本,国内安装的都是客户端版本不要搞混淆了。配置好后国内的vps上就有了一个可以用的socks代理,通过这个代理可以访问自由世界的互联网,没有伟大的GFW的干扰了。但是很多的服务不支持socks代理,http代理支持的范围比较广泛,幸好socks代理转化为http代理还是比较容易的,使用privoxy就可以了。

安装privoxy

1
$ sudo apt-get install privoxy

privoxy的配置比较简单,只需要指定socks代理的端口和转化出来的http代理的端口就好,配置文件为/etc/pvivoxy/config,下面是简单的例子:

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
# /etc/privoxy/config
user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
#actionsfile block.action
filterfile default.filter
#filterfile user.filter
logfile logfile
forward-socks5 / 127.0.0.1:1234 . #socks代理的端口1234
listen-address *:5678 #转化的http代理端口5678
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 5120
#connection-sharing 0
forwarded-connect-retries 3
accept-intercepted-requests 0
allow-cgi-request-crunching 0
activity-animation 1
split-large-forms 0
keep-alive-timeout 0
socket-timeout 120
handle-as-empty-doc-returns-ok 1

privoxy安装好后我们就有了一个http代理,这个代理可以自由的访问所有的网络,所有的请求都会转到国外的vps上执行然后将执行的结果回传,所有的流量都要在国外转一圈,这样访问国内的网站是很慢的,而且有些国内网站屏蔽了国内ip,这样的网络体验并不好。下一步骤就该squid大显身手的时候了,squid是一个代理和缓存服务器,可以指定规则使得不同的网络请求走不同的路径,还有缓存加速的功能,可以加速网络的访问,squid的安装比较简单。

安装squid

1
$ sudo apt-get install squid

squid的配置文件位于/etc/squid3/squid.conf,下面是我使用的配置,稍后我会简单的介绍下:

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
#代理服务器的监听端口
http_port 9999
##########################
cache_peer localhost parent 5678 0 no-query
# 默认走shadowsocks, 国内ip走国内
acl chinaip dst "/etc/squid3/chinaip"
always_direct allow chinaip
acl ALL src all
never_direct allow ALL
##########################
#内存缓冲区的大小
cache_mem 2048 MB
#设置硬盘缓冲区最大4096MB,16个一级目录,256个二级目录。
cache_dir ufs /var/spool/squid 4096 16 256
#设置访问日志文件
cache_access_log /var/log/squid3/access.log
#设置缓存日志文件
cache_log /var/log/squid3/cache.log
#设置网页缓存日志文件
cache_store_log /var/log/squid3/store.log
#定义允许名称为all的http请求。
http_access allow all

squid支持父代理,而且指定了父代理后默认的全部流量都从父代理走,由于GFW的威力日益强大,为了一劳永逸,配置中使用了比较暴力的手段,找出了所有的中国ip,将ip段放在/etc/squid3/chinaip这个文件中,使国内ip直连,国外ip都通过shadowsocks代理。虽然会使得有些未被墙掉的网站访问变慢,但是照着GFW这样疯狂的势头这个方案还是比较行得通的,不用蛋疼的手动添加被墙的网站了。

/etc/squid3/chinaip中的条目都是形如192.168.1.0/24或者192.168.1.0/255.255.255.0,每行一个网段,squid同时支持这两种网络的写法。获取国内的ip地址可以访问该网站,下载后的文件一般需要使用sed、awd等工具修改成满足squid需求的格式。这样就得到了一个全能的http proxy,国内国外网站随意遨游了。

参考资料

  1. 简易 APN Proxy (APN代理)的搭建
  2. 简易apn代理搭建
  3. GFWList 兼容 Squid
  4. Squid中文权威指南

最近折腾笔记

发表于 2014-01-01   |  

最近论文写完了,不安分的心总是静不下来,又开始了一轮新的折腾。最近忙活的事情乱七八糟的,主要有下面的几件事:安装Arch, 重新投奔Arch旗下;申请到了Windows Azure的试用帐号,尝试国内的云服务;加入了WCG计划,开挖ripple币,貌似挖了那么久还不够电费的。

安装Arch

Arch是一个很优秀的发行版,哲学就是KISS,一切都遵循着最大的定制化的准则,像搭积木似的可以搭建出自己满意的一个实用的系统。和我常用的ubuntu不同的是不提供一个开箱即用的桌面环境,一切都要自己来搭建。Arch的包管理是很激进的,向来追求最新的软件,而不太考虑软件的稳定性,而且是滚动发行的版本,不是像有些发行版那样有个稳定的开发周期,如果系统关键部件调整而没有按照wiki的方法做好调整就升级的话常常造成系统损坏无法开机的悲剧。

曾经使用过Arch四个月,大概是2012.04-2012.07,当时的安装有一个自动化的脚本,安装起来比较简单,使用起来还好,就是笔记本无法正常的休眠和唤醒,这个比较头大,一直没有解决。最后在有一次升级的时候没有注意一些警告强行升级导致了GRUB的引导出错了,Windows 7和Arch 都找不到了,当时也用Arch烦就彻底的删除了Arch,装回了ubuntu了,还是它省心。最近ubuntu越来越慢,很臃肿,用时间长了又想尝试新的东西,加上笔记本的分区很不合理,C盘只有500M的剩余空间了,索性全部格掉重新安装成 Windows 7 + Arch 双系统。Widonws的安装没什么可说的,Arch的安装倒是有些需要注意的地方,Arch的wiki是很好的资料,基本上所有的操作都是参照着wiki的介绍。

分区

本次使用的安装介质是archlinux-2013.12.01-dual.iso,使用dd命令烧录到了u盘中安装的。从u盘启动后进入了Arch的live cd模式,第一步就是分区,因为是双系统,Windows已经安装好了,需要多重引导,分区方面需要特别的留意,双系统引导最好使用MBR引导,使用了cfdisk的分区工具,这个工具很直观,比fdisk好用。

1
2
3
4
5
6
7
8
9
Name Flags Part Type FS Type [Label] Size (MB)
-----------------------------------------------------------------------------------------------------------------------------------------------
Primary Free Space 2.10 *
sda1 Boot Primary ntfs [Windows-7] 85901.45 *
sda5 NC Logical ntfs [D-Disk] 85899.35 *
sda6 NC Logical ntfs [E-Disk] 85899.35 *
sda7 Logical swap 4096.19 *
sda8 Boot Logical ext4 20480.95 *
sda9 Logical ext4 37793.57 *

sda8挂载在/上,sda9挂载在/home上,注意要将挂载到根的分区设置为可引导的。然后格式化各个分区,并挂载swap。

1
2
3
4
5
# 根据自己的实际情况进行修改
mkfs.ext4 /dev/sda8
mkfs.ext4 /dev/sda9
mkswap /dev/sda7
swapon /dev/sda7

安装基本系统

这部分基本上按照wiki的操作就可以了:

1
2
3
4
# 挂载分区
mkdir /mnt/home
mount /dev/sda8 /mnt
mount /dev/sda9 /mnt/home

设置网络和安装源,这点不同人的情况不同,要按照自己的实际情况进行设置

安装基本系统

1
2
3
4
#pacstrap /mnt base base-devel
Generate an fstab
# genfstab -U -p /mnt >> /mnt/etc/fstab
# nano /mnt/etc/fstab

chroot 并配置基本的系统

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
# 使用bash
# arch-chroot /mnt /bin/bash
# 设置hostname
# echo myhostname > /etc/hostname
# 设置时区
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置locale
# nano /etc/locale.gen
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
# locale-gen
# 设置硬件时钟为UTC
# hwclock --systohc --utc
# 设置网络,启用dhcpcd
# systemctl enable dhcpcd.service
# 设置无线网络
# pacman -S iw wpa_supplicant
# Make initramfs (RAM Disk)
# mkinitcpio -p linux
# 设置 root 密码
# passwd
# 安装GRUB引导,现在GRUB有bug,这个bug导致了我尝试了5遍都没有正常的引导起来
# 解决方案很简单,具体参见这个[网页](https://bugs.archlinux.org/task/38041?project=1&cat%5B0%5D=31&string=grub)
Known issue with known workaround: add the following to /etc/default/grub
# fix broken grub.cfg gen
GRUB_DISABLE_SUBMENU=y
# 双系统引导还需要附加软件
# pacman -S os-prober
# grub-mkconfig -o /boot/grub/grub.cfg
# grub-install /dev/sda
# 退出chroot,卸载磁盘,然后重启
# exit
# umount -R /mnt
# reboot

安装gnome3桌面

一直用着gnome3的桌面,虽然说KDE桌面更漂亮,也用了一段时间,但是依然不习惯,gnome3看来更符合我的口味。Arch中安装起来也很简单,继续copy wiki:

安装X

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基本X组件
# pacman -S xorg-server xorg-server-utils xorg-xinit
Install mesa for 3D support:
# pacman -S mesa
# 安装显卡驱动,我的是Nvidia
# pacman -S nvidia
# 触摸板驱动
# pacman -S xf86-input-synaptics
# 测试X系统
# pacman -S xorg-twm xorg-xclock xterm
# 应该能看到图形界面了
# startx
# exit

安装gnome3

1
2
3
4
5
6
7
# pacman -S gnome gnome-extra gdm
# 开机启动gdm,不使用startx
# systemctl enable gdm
# 建立常用的用户
# useradd -G wheel -m -s /bin/bash user_name
# passwd user_name
# usermod -G adm -a user_name

字体与输入法

Arch默认的字体配置是惨不忍睹的,gnome绑定的ibus输入法也不怎么样,准备都要重新调整,换成自己常用的,准备安装的输入法是fcitx,字体配置方案向ubuntu看齐,感觉ubuntu的字体配置相当的不错。

1
2
3
4
5
6
7
8
# pacman -S fcitx-im fcitx-config
# 在~/.xprofile和~/.xinitrc中加入下面三行
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
# 重新登录应该就能用了
# 推荐sunpinyin
# pacman -S fcitx-sunpinyin

字体的配置可以参考Archlinux 字体配置。

杂项

双系统设置时钟的问题,参考archlinux入门–设置时钟。

使用octopress的问题,参考Octopress 在 Arch Linux 下的一些問題。

Windows Azure

Windows Azure是微软家的云服务,由于天朝的特殊环境,分成了国际版和中国版,我试用的是中国版,由世纪互联公司运营。还是蛮幸运的,在v2ex上看到了可以免费试用的消息就填了个邮箱,写了个申请,就很快的得到了试用的机会。

试用的配置还是很不错的,最多可以用4个核心,磁盘空间上面Windows虚拟机有120+G的C盘,还有100+G的D盘,据说是临时的盘,但是我没有发现什么区别,Linux的磁盘空间少了点,/有29G,/mnt有135G,为NTFS的盘。我在上面建立了一个ubuntu 12.04的虚拟机和一个Windows Server 2012虚拟机,正好把cpu分配的额度用完。

Windows的服务器是使用远程桌面登录的,Linux可以正常的使用ssh登录管理。Azure自带的有防火墙,上面可以指定相应的端口的策略,看文档上写的暂时不支持iptables的设置,所以Linux的机器上就没有开防火墙,只是在管理界面上开了必要的端口。管理界面是比较清爽的,看起来很错,但是不清楚如何通过web直接访问机器,比如防火墙配置错误,无法ssh登录了,或者ssh挂掉了如何修复。管理界面上只有关闭、重启等寥寥几个选项,不知道遇到这种情况怎么办,是不是只有重装了,原来的数据又怎么办?

Windows Azure的虚拟机的带宽还是不错的,虽然不能和国外的VPS的100M或者1G的带宽相比,但是至少不差。据说是共享的带宽,在服务器中下载速度能达到5MB/s,出口带宽感觉也能达到4M。还有点不爽的是服务器禁止ping,无法在服务器内部使用ping,在外面也无法ping通服务器,有一个替代的方式是使用tcpping,Windows下的具体的使用方法可以参见这篇文章, Linux的使用方法在此。

由于blog架设在Digitalocean上了,科学上网的服务也无法在国内服务器上部署,因此Windows Azure的服务器在我的手上基本上在浪费,只用来当个迅雷下载工具了,学校最近封锁了迅雷,还限制了网速,有个不限速的服务器用着也很爽。

ripple矿工

下介绍下WCG,因为XRP是通过在WCG上做贡献才能换到的。下面是WCG的官方介绍:

我们的任务、工作以及志愿者
World Community Grid 的任务是创建世界上最大的公共计算网格,以执行能够造福人类的项目。

我们已经开发了技术基础结构,该结构可作为用于科学研究的网格的基础。我们的成功依靠大家共同贡献各自空闲的计算机时间,让世界变得更美好。

World Community Grid 仅将这项技术用于公共非盈利组织的人道主义研究,如果没有公共网格,这些研究就会因高昂的计算机基础结构成本而无法完成。作为我们对促进人类福祉的承诺,所有的研究结果都将公开,以供全球的研究团体共享。

至于ripple是什么就不介绍了,想知道干什么的,请google。

首先去WCG官网注册个帐号,官网在此,然后你需要关联你的ripple帐号与WCG帐号,这样你在WCG上做的贡献才能获得ripple官方的奖励,关联的网站在此。

在网站下载WCG软件,Windows下和Linux下的图形界面基本类似,Linux下的字符界面的操作略有不同,下面简要介绍下步骤。

全命令行进行挖矿教程如下:
最好用包管理器安装boinc相关软件,Ubuntu、Debain系统安装命令:

1
2
3
4
5
6
7
8
sudo apt-get install boinc-client boinc-manager
安装完成之后boinc-client已经启动,现只需运行wcg项目,命令如下
sudo boinccmd --project_attach http://www.worldcommunitygrid.org/ 弱账户密钥
其中弱账户密钥在 https://secure.worldcommunitygrid.org/ “setting” -> “我的概要文件”
关于BOINC客户端的命令详情参考:http://www.equn.com/wiki/Boinccmd

关于收益,貌似比较少,最近的行情是300个贡献点数能换1个XRP,1个XRP成交价大概是0.16RMB左右。一般一天一台普通的电脑的贡献点数是5000点左右,不到3块钱,不过聊胜于无,也算是为世界做出点贡献,毕竟计算机闲着也是闲着。

百度运维面试全记录

发表于 2013-10-22   |  

今天终于功德圆满了,上午和百度的 HR 谈了会,因为三方还没到,就和百度签了 2 方,也算是给自己一个交代。基本上结果还是满意的,能去做自己想做的东西本身就是一种幸福,回想起来这几天的笔试面试,心情像过山车似的上下起伏,有兴奋,有紧张,有焦虑,有欣喜。一段经历往往就是这么令人印象深刻。

2013.10.13 百度笔试

在参加笔试前还是没有信心的,可能阿里给我的打击比较严重。当时的岗位貌似还投的有问题,开始的时候不知道自己到底想要做什么投的职位是研发工程师,但是后来发现更喜欢做运维,临时的改成了运维。百度还是比较有气度的,欢迎霸笔,欢迎霸面,只要你有实力,就有你展现实力的舞台,临时改职位就相当与霸笔了。题目还是有一定的水准的,比较均衡,自己尽了最大的努力做,当时的感觉是如果不给面试机会的话也不会后悔。

2013.10.14 百度一面

十分幸运的是昨晚10点多接到了面试的通知,第二天早上 9:30 面试。是在一个酒店里面面试的,很奇怪的是没有 HR, 前台也没有任何的接待人员,每个人都是到各个面试官的房间里面去面试的。

我大概在 9:20 多去房间面试的,面试官是个很和蔼的,微微有点胖的人,很年轻,感觉和我差不多大。没有自我介绍之类的,开始的时候聊聊笔试的程序设计的题目,题目说的是在长距离的传输中明明带宽很大,但是传输速度却很慢的问题。我首先回答了我的理由:

1.路由设置有问题,可能分配到了很拥堵的线路,造成的传输很慢;

2.发送的时候包分的过大,导致有些中间的路由节点会分片,然后到了接受端再进行数据的合并,会造成很大的损失。

面试官友好的和我讨论了这些东西,他说我说的这些理由都对,但不是影响传输速度最大的因素。还给了提示,汽车在高速上开的很快,但是在城市中就开的很慢,这是为什么? 但是我确实没想清楚这问题应该怎么去回答。然后他给了一个他认为的原因,因为路径太长,在一路上会有很多的节点进行数据的转发或者是信号增强之类的,信号从线路上到进入节点的cpu中进行处理,速度就会降低,节点越多速度下降的越多,虽然他是这么解释的的,但是我感觉我还是无法赞同他的观点。

然后是下一步的考察些基本的 linux 命令什么的,ls, ls -al 等等, vi 中的替换命令,还让我替换掉一个 c 程序中的一个写错的变量名,我感觉这个可以用 sed,还需要用正则表达式来匹配避免误伤,但是当时正则表达式好像没有写出来。我说还用过 vsftp 搭建过 ftp 服务,他就问了下,ftp 的验证方式有那几种?我不太清楚,只回答了匿名的帐号,和系统帐号,其实还有手动的验证的,将用户名和密码分别写在不同的文件中进行验证,原始的数据库形式的,还有一种就是需要有 mysql 的数据库的支持了,基本上就是这些验证方式了。

在我的简历上还写了编写 shell 脚本分析日志,然后他就让我举个例子,我就说对 apache 的日志进行切割找出访问量最大的ip出来,貌似我当时些的是这个样子的,cat log | awk ‘{print $1}‘| sort| uniq -c | sort -nr ,然后他问了不用 cat 怎么办?我写成了这个样子,awk ‘{print $1}’ < log | sort | uniq -c | sort -nr , 然后问还有没有什么办法,我说用 less,more 都可以吧,其实可以直接写成 awk ‘{print $1}’ log | sort|uniq -c | sort -nr, 这样感觉更好看一些,但是当时没想到。

最后还考了点 IO 重定向的问题。比如 2>1 什么意思,我说基本没见过这么写的,我见过的是 2>&1, 错误输出也输入到标准输出里面去,不知道对不对。然后他写了两个看起来比较容易混淆的命令 2>&1 >log 和 >log 2>&1 有什么区别,我说第一种应该是错误的输出也重新定向到了 log 了,第二种应该是错误的输出没有定向到 log 中,回来实验了下,貌似恰好回答反了,看了记忆是不靠谱的。最后大概还问了平时在公司如何管理那么多台的服务器,用些什么工具进行管理,是自己写的工具还是别人做的? 可能我面试的时间长了, 为了不耽误下一个同学的面试, 他只是很简要的敷衍的和我说了句: “你以后来公司就知道了”。希望如他所愿。

一面的感觉还好,感觉应该有希望进入二面的,回来就慢慢的期待二面点电话通知了。

2013.10.15 百度二面

大概和一面的情况差不多,也是10点多接到二面的,第二天进行二面。二面开始的时候简单的自我介绍了下了,发现这就是个引入话题的方式,当我介绍到在实验室搭建了 nfs 服务的时候,他貌似很感兴趣,开始让我画一下 nfs 的架构,当时有点蒙,不是很清楚这个到底是个什么样子的,只是简单的画了下, 有个 nfsd 的服务,貌似还有个控制端口的服务什么的。然后就开始对这这个 nfs 的架构进行发问了,你感觉 nfs 有什么缺点,我说这个不怎么了解,但是发现如果服务端挂掉后,客户端是无法正常的卸载掉挂载的数据的,其实还有很多的缺点,回来后上网查找了下。

然后问,有机器 0~4, 0 为 nfs 服务器,1~4 挂载着 0 共享出来的文件,现在机器 0 down 掉了,问用 wget 可以从 4 中取出共享的文件吗?我说是不可以的,因为文件只有一份,服务器挂掉后就挂掉了,问我有什么解决方案没有,我说既然这个单机的不靠谱,就直接上 hadoop 吧,至少这样会保证数据安全,冗余度高。然后简单的画了下 hadoop 的架构图,然后和他扯了 hdfs 的基本原理和它存储的策略。在说到数据是按照 64M 一块来存储的时候,他问了下你知道 linux 的文件系统一般是多大的一块的吗?我说是 4K,他就问为什么 hadoop 要用 64M 这么大的块做存储,我说原因主要是考虑到效率问题,hadoop 是主要处理大数据的,将数据块分的大一点,系统一下就可以预读很多的东西,太大的块会造成浪费,太小的块会造成系统的效率低下。系统采用 4K 的块主要是为了避免浪费,因为文件即使没有占用一个块,那么这个块中的其他的空间也无法利用了。4k 主要是避免小文件造成的损失,从这里开始问到了文件系统,我大致的把文件系统的结构图画了出来,超级块,组的描述块,块占用的位图描述,inode的占用描述,inode节点,数据块。

然后说用 vi 打开个文件,然后删除,再保存会有什么情况,我说原来的文件还是会回来的,因为在删除的时候只是把文件名与具体的 inode 节点脱钩,原来的 vi 打开的是以 inode 作为标识符的,文件名字无所谓,随便删除,保存后会生成新的文件名与 inode 的对应关系。然后的问题是 vfs 的东西,虚拟文件系统,他说 linux 支持很多的文件系统,但是这些文件系统很不一样,但是用户操作起来却是一样的这个是什么原因,我说是因为 linux 实现了虚拟的文件系统,这个 vfs 屏蔽了下层的各种文件系统的差别,对上层的应用提供了一个统一的接口,所以说用户感觉操作起来的习惯是一致的。然后问了下 /proc 文件夹是干嘛的,我说里面是各个进程的数据,有占用cpu,内存,打开的文件,程序的文件夹等等信息,然后问这个是不是也是通过 vfs 进行读取的,我的回答是是的。

然后开始问了点命令,如何查看当前的网络状况,流量什么的,我说可以使用 iftop , 他说还有没有别的方案,我说可以监控 ifconfig ,每秒刷新一次,具体用什么命令我是忘记了, 回来查询了下用 watch ifconfig 即可。然后问怎么查看网络各个端口状况,我回答用 netstat ,他说有什么问题没有? 我说有,感觉就是太慢了,他问我有什么改进方案,没想出来, netstat 就是从 /proc 里面读取的数据,还有什么特别的解决方案。然后我问他有什么办法,他说了下,说是有个 ss 的命令,貌似很牛逼,说是速度很快,我记下了,回来查查看,确实牛逼,当时还用过过,但是就是没有什么印象,太他妈的坑爹了。

问完了这个貌似又有个问题,在多进程或多线程的时候同时处理一个 url,如果有 url 过来了,在阻塞状态的进程或线程会同时醒来响应,造成了竞争,问我有什么方案?我想了想说主要是这些进程同时响应了,可以指定一个进程处理 url,其他的不响应,我想的方案是下面的三种,最后面试官告诉我这个是“惊群”现象,回去可以查查。

  1. 设置一个空闲进程队列,每个空闲的进程入队,来一个 url,队首的进程进行处理,其他的不动。
  2. 根据 url 的 ip 来划分,指定这些进程只响应指定 ip 段的请求。
  3. 可以对 url 做 hash,然后分配到不同的进程中去工作。

下面是写程序的阶段,一个是求 m 个数中的前 k 最大值,这个是《剑指 offer》 上面的原题。我用 c 写的,悲剧的是很久没在纸上写代码,感觉在纸上写代码就是很诡异的感觉,一点都不习惯。先讲述了下思路,利用了快排的一个阶段,求 partition 的阶段,这个就是将原来的数组分成了 2 个部分的,遗憾的是老是想不清楚,代码写的很烂,还没写完。虽然思路对了,但是就是很烂。下一个是要写个小脚本,a,b两个文件,将a,b中的行做交叉,这个他妈的我写过的,但是当时写出来还是很烂,感觉都要崩溃的感觉。下面是回来写的代码,虽然还是很烂,但是能工作了。

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
#!/bin/bash
# 读入两个文件,逐行读入,并交替打印出来
testfile1=$1
x1=`wc -l $testfile1 |awk '{print $1}'`
testfile2=$2
x2=`wc -l $testfile2 |awk '{print $1}'`
if [ $x1 -le $x2 ]; then
x=$x1
elif [ $x2 -lt $x1 ]; then
x=$x2
fi
i=1
while [ $i -le $x ]
do
echo "`head -$i $testfile1 | tail -1`"
echo "`head -$i $testfile2 | tail -1`"
i=`expr $i + 1`
done
if [ $x1 -gt $x2 ]; then
i=`expr $x2 + 1`
while [ $i -le $x1 ]
do
echo "`head -$i $testfile1 | tail -1`"
i=`expr $i + 1`
done
fi
if [ $x2 -gt $x1 ]; then
i=`expr $x1 + 1`
while [ $i -le $x2 ]
do
echo "`head -$i $testfile2 | tail -1`"
i=`expr $i + 1`
done
fi

再然后就是随便聊聊项目,将项目扯蛋了一遍,然后问了和一面同样的问题,这次面试官给了个正面回答,总的来讲运维管理是个很复杂的系统。主要侧重于应用的维护,而不在于一个个机器的管理,更底层的机器管理的工作一般都包给了机房让机房去做了,他们只要管理好在上面跑的应用就好,做负载均衡,机器优化,性能调优等等,对各种突发情况的处理,做处理的预案等等。感觉二面的感觉不是很好,但是内心感觉应该还是有点机会的。

2013.10.16-17 煎熬

按照以前的节奏,应该 16 号就应该三面了,但是二面回来后彻底的没有消息,看这周围的同学有些就去三面了,当时心里十分的纠结,怀着希望,又带着绝望。在 17 号终于决定不去想这档子事情了,去市区,准备去霸面华为,心情十分的低落。华为不给机会,折腾到了 3 点还没有吃到午饭,好不容易找到了个店刚点好菜,百度的电话到了,让我明天去三面。当时的心情无法形容,感觉有点泪流满面的感觉。

2013.10.18 百度三面

三面是 boss 面,感觉还是不错的,就是随便谈谈。基本上不聊技术,聊人生,聊规划,这时的重点不在于技术,而在于人了。就是 boss 考察你这个人,适合不适合他的团队,每个人的经历各有不同,展现自己的真实的一面就好。

2013.10.19-21 纠结

面试完了,剩下的时间就是纠结了。毕竟很在乎这份工作,加上手里没什么 offer,表现的对这份工作特别的渴望,在 19 号有人收到 offer 后,感觉常常的否定自己,忐忑不安的感觉。这样折磨了 3 天后 21 晚上终于接到了 HR 的电话,尘埃落定了。

后续

帝都,我来了!!!

找工作结束了

发表于 2013-10-22   |  

转眼 blog 又快四个月没有更新了,一方面原因是因为懒惰,另一方面原因是确实很忙感觉写个 blog 都没心情了。其实这几个月也发生了很多事情,blog 所用的 vps 也由yardvps 迁移到了 DigitalOcean, blog 的架构也由 LAMP 换成了 LNAMP, 其实就是瞎折腾。 不得不说 Digitalocean 的线路确实要比 yardvps 的线路强的多了,原来的半价买的 yardvps 平均来说一个月要抽风个一周,实在是烦了,转移到了 Digitalocean, 确实很不错,操作方便,也够便宜,最重要的是网络很稳定,不得不赞一个。

从7月到10月基本上都是找工作的节奏,到今天终于结束了,终于签了一个还比较满意的公司,准备去做我喜欢做的东西了,感觉很开心!以后就投入度娘的怀抱了,百度的平台还是不错的,希望以后有更好的发展。

基本情况

本科数学专业,非名校计算机小硕

未接受完整的计算机基础教育

对 Linux 比较熟悉,喜欢折腾点东西

算法功底比较薄弱

编程语言只用过 c/c++,shell,python, 且谈不上精通

基本无实际工程项目经验

研究生阶段做的东西偏学术

求职意向

互联网公司运维或系统工程师

主要理由:

  1. 我看好服务端的发展,随着互联网的发展,传统的桌面软件势微,现在更多的是使用 web 和移动 App,但是孱弱的 web 和 App 无法承受用户对数据和资源的需求,更多的请求被压在了服务端,Web 和 App 的繁荣也意味着服务端的繁荣。做服务端,后台方面的工作是很有前途的。

  2. 自己的爱好兴趣吧,感觉自己挺喜欢折腾这些系统服务器什么的,管理这些机器正常的工作有点像牧羊人看着自己的羊羔都慢慢长大的那种喜悦的感觉。

  3. 感觉自己的知识结构基本上还是符合做这份工作的基本要求的。

准备情况

基本上从7月份开始准备,从基本的 c/c++ 语法看起,虽然说都用过,但是都没有特别深入的了解,有些语言特性也是是是而非的,必须要过一遍,要不大部分的笔试基础题目是不会做的,当时主要是把《c 程序设计语言》和 《c++ primer》重新看了下。然后就是算法的准备了,感觉算法可能是我最弱的一方面,没有经过严格系统的训练就是搞不懂这些玩意,记得看的书也很杂乱无章,《数据结构》,《c 算法》之类的,但是看的不是很系统。最后是些常考的笔试题目,主要把《剑指 offer》和《编程之美》看了看,《剑指 offer》感觉挺好的,里面都有所有解决方案的源代码,还有测试用例,可以学习下比较严谨的代码风格。《编程之美》主要是些数学题目,可以开阔下眼界,拓展下思路。

求职过程

阿里巴巴实习面试

2013.05.04 应聘阿里巴巴系统工程师实习生

人生中第一次的电话面试,电话面试表现的还好,但是到了淘宝进行 boss 面的时候,缺乏面试经验的缺点暴露无疑,面试了总共不到半小时就结束了,实习计划破灭。

华为

2013.08.04 华为机试

2013.08.07 华为座谈

2013.09.01 华为性格测试

测试后我的华为应聘历程到此结束了,性格测试未通过,然后后面就没有机会了。

阿里巴巴

2013.08.30 参加了阿里大讲堂活动,去听了个关于搜索的讲座。感觉还是不错的,听到了很多以前不了解的技术,中午混了块披萨,下午答对了一道题目还拿了本书回来,具体的题目是:“当你在淘宝上搜索一个关键字的时候,后台大概有多少的数据参与了运算?”, 我当时蒙了个 1TB,实际的答案是 1.4TB, 我的最接近。实在没想到,一个小小的搜索背后竟然需要这么海量的数据的支撑。

2013.09.22 阿里巴巴笔试

选择的岗位是系统工程师,貌似杭州的卷子的风格和历年的题目和其他地区的题目都有点差别。更偏重于计算机基础,组成原理方面的知识。附加题还有数据库方面的知识,当时感觉做的很糟糕,但是幸运的是还是有面试的机会。

2013.09.24 阿里巴巴一面

一面的时候是个很年轻的帅哥,见面也不需要什么自我介绍。看着简历聊聊天,貌似对我的 blog 和我以前帮朋友维护的网站都很有兴趣,边看我的 blog,边和我讨论些问题。貌似当时还问了我虚拟机的具体架构,虚拟机如何与宿主机通信等问题,这些问题确实一点都不了解,当时都快跪了,幸好面试官感觉我对这些操作还是很熟悉,而且很有热情做这项工作,给了我二面的机会,还给我我一夜的时间去准备二面,十分感谢他。

2013.09.25 阿里巴巴二面

二面的情况是从头跪到了尾,一方面自己确实没有什么工程项目的经验。另一方面当时面试的时候太紧张,最重要的确实准备不足够,前期的时候准备的更偏重于开发方面的东西,对系统、网络方面的知识没有认真的复习,记得面试官问我相当简单的 TCP 协议中的 Time_Wait 状态是什么的时候,脑子中一片浆糊,没有回答出来。二面不出意料的挂掉了,但是我也学到了不少东西,也更坚定了以后做运维的决心,回去收拾心情,看书学习,准备再战。

2013.09.29 阿里巴巴拒信

人生中第一次正规的拒信,值得留作纪念。

大众点评

2013.10.09 大众点评笔试

大众点评的笔试可以说是有点怪异的,网上笔试,不过有时间限制,前面是行测的题目,后面是三道编程题目。可以上网上找答案,可以写伪代码,可以上网搜索答案。记得当时是实验室的同学一起做的,有些题目还是搞不清楚,这可能是我被大众点评秒杀的原因。

2013.10.12 大众点评面试

大众点评的面试还是比较有全面的,对照着简历一点点问。从 vi 中的快捷键到 find 命令的用法,一些基本的 linux 操作都问到了。然后开始问笔试题目怎么做的,我将我的方案说了,基本上有点像暴力搜索,记得同学给我分析过更简单的解决方案,但是当时不理解也不能讲出来到底怎么做。后来看到了我在简历中写了 python,让我用 python实现个堆栈,最简单的就是用 list,但是好久没用了,竟然把堆栈实现成了个队列,不可原谅。后来就大众点评的架构和面试官聊了会,已经知道表现的不怎么好了,最后聊的很坦然。

2013.10.14 大众点评拒信

表现的不好,收到了拒信表现的很平静。

百度

2013.10.13 百度笔试

2013.10.14 百度一面

2013.10.15 百度二面

2013.10.18 百度三面

2013.10.22 百度签约

关于百度的面试很长,在这就不详细的写了,准备开个新帖子详细的写。
在这期间还参加了几个笔试面试:

创新工厂

2013.10.11 创新工厂笔试,未获面试机会

大华

2013.10.15 大华一面游,主要是做的东西和大华的要求八字不合的感觉。

总体上这两个月比较累,也比较有意义,收获了人生中第一份工作,还是自己比较喜欢的,虽然不是最优的结果,但也是次优的选择了。以后要去帝都了,新的旅程在慢慢展开,未来的道路还要我慢慢去探索,加油!

install goagent3.0 in ubuntu12.04

发表于 2013-07-02   |  

最近 goagent 升级了, 从 2.x 升级到了 3.0 速度貌似没太大的变化,但是感觉稳定了不少。最重要的变化莫过于原来是基于 python2.7 的,新版的直接依赖 python3.3,感觉真的是有点激进了。windows 下用没有任何问题,作者直接在安装包中打包了个精简版本的 python3,但是自己常用的 ubuntu 12.04 还没有安装 python3 还是要自己手动安装下的。具体的步骤可以参考官网的wiki, 在按照上面的步骤安装的时候还遇到点小问题,下面是解决的过程。

Python3 ImportError: No module named zlib

我采用的安装方式是编译安装,按照 wiki 的命令是

1
wget http://python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2 && tar jxvf Python-3.3.2.tar.bz2 && cd Python-3.3.2 && ./configure && make && sudo make install

安装后在运行时就会提示 ImportError: No module named zlib, google 后发现有人遇到同样的问题, 页面上同样还有解决方案的链接。默认编译的时候没有加上 zlib 的参数,所以将 zlib 模块添加进编译参数,重新编译安装就好。完整的编译安装的命令如下所示:

1
wget http://python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2 && tar jxvf Python-3.3.2.tar.bz2 && cd Python-3.3.2 && ./configure -with-zlib=/usr/include && make && sudo make install

注意 ./configure 后面的 -with-zlib=/usr/include 参数。

安装 PyOpenSSL 问题

在执行

1
wget http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-0.13.tar.gz && tar zxvf pyOpenSSL-0.13.tar.gz && cd pyOpenSSL-0.13 && sudo python3 setup.py install

安装 PyOpenSSL 的时候会遇到 src/crypto/x509.h:17:25: error: openssl/ssl.h: No such file or directory 的问题,和这个页面描述的情况一致。还是缺少某些依赖包,这个页面上也给出了解决方案,执行下面的语句,安装上 libssl-dev 后继续编译就好了。

1
sudo apt-get install libssl-dev

自此 goagent3.0 应该可以在 ubuntu 12.04 下正常的工作了,记得还有个包需要安装,不过不影响运行,且有提示,按照提示安装好需要的包就可以了。

vps 安装 deluge 并设置 iptables 规则

发表于 2013-03-23   |  

昨天 HDC 的下载网站终于恢复了,换了个马甲 hdwing.com 重新开始提供 PT 服务。原有的 HDC 的数据都还在,网站也迁移到了美国感觉靠谱多了,至少不用担心莫名其妙的被拔网线的问题了。登陆后看了下,除了 logo 更换了,其他的都是那么的熟悉,看到了自己的数据都还在,顿时泪流满面。

下载工具

Windows 下没什么挑剔的,用 utorrent 就一切 ok。Linux 却要费一番思量,PT 网站支持的客户端还挺多的,有 ktorrent、rtorrent、transmission 和 deluge 等等。以前一直在用 ubuntu 自带的 transmission, 挺简洁也很小巧,但是悲剧的是从 ubuntu 12.04 起,transmission 升级到了2.77 版,HDC 支持的 transmission 最新也直到了 2.73 版,所以就悲剧了。deluge 貌似支持的到了最新的 1.3.5 版本了,所以就准备安装 deluge 作为下载工具了。

1
2
$ sudo apt-get install deluged deluge-web

执行上述的命令就安装好了,具体的如何设置的可以参见这篇 blog。

设置 nginx 代理

deluge 安装后默认的在 8182 端口打开 web 服务,但是因为 vps 上已经安装上了 LNMP 环境,所以想用 nginx 将 8182 端口映射到 80 端口,减少端口暴露,同时也便于管理。本文参考了 Seedbox配置实例 ,和 deluge forum。

nginx 文件配置

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
47
48
将下列配置写入 nginx 域名配置文件
server {
### server port and name ###
listen 0.0.0.0:80;
listen [::]:80;
server_name your.domain.net;
if ($host !~* ^(your.domain.net)$ ) { return 444; } #URL non matché par le domaine
### Compression ###
gzip on;
gzip_static on;
gzip_buffers 32 8k;
gzip_comp_level 3;
gzip_http_version 1.1;
gzip_types text/css text/xml application/x-javascript application/atom+xml text/mathml text/plain t
ext/vnd.sun.j2me.app-descriptor text/vnd.wap.wml text/x-component image/x-ms-bmp image/svg+xml application/msword application/rt
f application/xml application/xhtml+xml application/xml+rss text/javascript application/javascript application/json;
gzip_vary on;
location / {
proxy_pass http://localhost:8112/;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
### Set headers ####
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### By default we don't want to redirect it ####
proxy_redirect off;
}
location ~*^.+(ico|css|js|gif|jpe?g|png)$ {
proxy_pass http://localhost:8112;
expires max;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
### Set headers ####
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### By default we don't want to redirect it ####
proxy_redirect off;
}
}

通过上面的设置你可以通过 http://your.domain.net 来管理 deluge,和通过 http:// your-ip:8112 效果一致。

iptables 设置

默认的情况 deluge 的 incoming ports 和 outgoing ports 都使用的是 random ports,也就是随机端口,这样无法使用 iptables 控制 vps 的访问,造成很大的安全漏洞。deluge 也提供了端口设置,默认的是 6881 到 6891,但是郁闷的是我将 6881-6891的端口的进出都在 iptables 规则中设置为了 accept,连接 pt 服务器的时候还是会显示 blocked, 来回的折腾,关掉/打开 iptables、重启 deluge、甚至最后重启 vps,都是一样的效果。搞了一下午无任何进展,然后突然我想起来是不是端口被服务商封锁了,将默认的端口从 6881-6891 设置为了 56800-56810,然后就工作正常了,WTF。

iptables 规则

1
2
3
4
iptables -A INPUT -p TCP --dport 56800:56810 -j ACCEPT
iptables -A INPUT -p UDP --dport 56800:56810 -j ACCEPT
iptables -A OUTPUT -p TCP --sport 56800:56810 -j ACCEPT
iptables -A OUTPUT -p UDP --sport 56800:56810 -j ACCEPT

经过了上面的设置,deluge 运行还是比较平稳的,占用的资源不是很多。vps 网速特别给力, 上传高峰可达到 5M/s,真是相当不错, 只是硬盘容量太小很遗憾啊。

tar 排除指定目录

发表于 2013-03-06   |  

很久没有写 blog 了感觉 blog 已经荒废了。上一篇文章在 2012 年底,现在都 2013 年了,2 个多月就这么过去了。在这两个多月从大部分时间在家过年什么都没有做,一直在歇着。1 月底的时候 yardvps 打 5 折, 把 blog 迁移到了这个新的 vps 了,感觉运行很稳定,价格还是很实惠的。blog 搬家没有遇到什么问题,但是今天在用 tar 备份网站的时候遇到点问题,如何排除指定的目录。

什么是 tar

Unix和类Unix系统上的压缩打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为“tar”。目前,tar文件格式已经成为POSIX标准,最初是POSIX.1-1988,目前是POSIX.1-2001。 本程序最初的设计目的是将文件备份到磁带上(tape archive),因而得名tar。(摘抄自维基百科)

问题

我准备是用 tar 备份我的 wordpress 网站的,但是里面有一个目录是 wp-content 下面的 backup 目录有以前的备份,我想把这个排除掉,想起以前用 tar 备份系统的时候用的 –exclude 参数,开始是这么写的:

1
2
cd /home/wwwroot
tar cpzf www.mars.tingxuere.com.tar.gz www.mars.tingxueren.com --exclude=www.mars.tingxueren.com/wp-content/backup/

很遗憾运行后还是不行,我以为是路径写的有问题,下面用绝对路径

1
2
cd /home/wwwroot
tar cpzf www.mars.tingxuere.com.tar.gz www.mars.tingxueren.com --exclude=/home/wwwroot/www.mars.tingxueren.com/wp-content/backup/

同样还是不行的,不知道为什么,感觉可能是 –exclude 参数我的理解有问题。

实验

首先 man tar 看看 –exclude 参数是干吗的:

1
2
--exclude=PATTERN
exclude files, given as a PATTERN

从上面看到 –exclude 排除的目录不是目录的路径,而是按照正则表达式的形式排除的,PATTERN是也。理解错误在 –exclude 后面跟路径当然达不到我的目标,下面是个很简单的实验:

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
$ pwd
/home/user
$ mkdir test
$ cd test
$ mkdir test01 test02
$ cd test01
$ touch test01.txt
$ cd ../test02
$ touch test02.txt
$ cd
$ tar cvzf test.tar.gz test --exclude=/home/user/test/test02
test/
test/test01/
test/test01/test01.txt
test/test02/
test/test02/test02.txt
# 可以看到 --exclude 没有起到效果
$ tar cvzf test.tar.gz test --exclude=test02/
test/
test/test01/
test/test01/test01.txt
test/test02/
test/test02/test02.txt
# --exclude 依然没有效果,因为 tar 打包过程中找不到与 test02/ 匹配的项目,注意最后的`/`
$ tar cvzf test.tar.gz test --exclude=test02
test/
test/test01/
test/test01/test01.txt
# 顺利的达到目标
# --exclude 后面是正则表达式,还可以排除文件夹中具体的文件
# 保留 test02 文件夹,去除 test02.txt
$ tar cvzf test.tar.gz test --exclude=test02/*.txt
test/
test/test01/
test/test01/test01.txt
test/test02/

疑惑

在搜索过程中看到了有人写到:在 GNU tar 中用 –exclude 参数时,被打包的文件必须要放在最后,否则没有效果,但是我实验了下发现被打包文件放在前面和后面都是一样的,不知是这个 bug 被修复了,还是以讹传讹的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ tar --version
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.
# test 放在 --exclude 前面
$ tar cvzf test.tar.gz test --exclude=test02
test/
test/test01/
test/test01/test01.txt
# test 放在 --exclude 后面
$ tar cvzf test.tar.gz --exclude=test02 test
test/
test/test01/
test/test01/test01.txt
# 可以看到上述两种写法,执行效果一致

123
tingxueren

tingxueren

reading && thinking

25 日志
2 标签
© 2016 tingxueren
由 Hexo 强力驱动
主题 - NexT.Pisces