Posts tagged linux

linux 文件目录权限批量处理

在linux上有时遇到这样的需求,希望将一个目录下所有子目录的权限批量设置为新的权限。 这其实很容易,只需chmod -R XXX path即可。 问题是,如果我们只想让其他用户可以访问到这个文件目录,同时需要保持原有的读写权限,该怎么办呢? 使用chmod的权限字母表示法,可以表示该文件当前的权限 The permissions that the User who owns the file currently has for it u The permissions that other users in the file’s Group have for it g Permissions that Other users not in the file’s group have for it o 通过以下符号可以表示将要设置的文件权限 User letter The user who owns it […]

dss 编译问题小结

主要遇到两个问题,比较有通用性,记录一下: 1. -lpthread 修改为 -pthread 2. -ldl 修改为 -Wl,–no-as-needed -ldl 在linux编译遇到 undefined reference to pthread_mutexattr_init undefined reference to dlopen 可能跟这两个问题相关。

EFI/GPT上的Windows – Linux双系统

很长一段时间都没有鼓捣重装系统了。前些日子旧笔记本坏了,买不起MBP的咱只好入手了一台惠普的win8系统的本本。 近来需要一个linux环境进行线下测试,这台本本就成了实验对象。本以为装个linux还不简单么,装个ubuntu分分钟搞定的事情,没想到居然屡遭挫折。最简单的方法就是通过easybcd软件进行硬盘安装了。然后遇到的第一个难题就是怎么重启机器。win8新的电源管理模式,所谓关机其实只是打瞌睡。网上查到在控制面板-电源管理中可以关闭这个功能。OK,重启。进入引导界面却引导失败,提示找不到文件。这个问题纠结了很久,我以为是自己填写的磁盘号错了,通过存储管理可以看到除了系统可见的C盘D盘E盘外,还有好几个分区,此时我还没了解到这是GPT分区表的特征,从(hd0,0)到(hd0,5)试了个遍,通通无效。 经过这么多纠结我终于决定放弃硬盘安装,转而采取刻录光盘安装,还好新本本光驱还没坏(不得不吐槽下本本光驱的脆弱身板。。)。结果再次挫折。。光驱引导界面进去之后无法进入到liveCD的试用模式,也无法直接安装,于是使用检测光盘那个选项吧,统统黑屏,进去光盘也不转。试用模式的最后会输出两行字,说是无法从cd0的某扇区读取数据。莫非是烧CD烧坏了?于是再烧一张,并且烧写结束的检测光盘步骤也检测正确了,ubuntu的iso检测checksum也检测正确了,应该没问题了吧,用新盘重试,还是一样的问题,甚至提示错误的扇区编号都是一样的,我看着状况应该不是烧写的问题。 只好再度重启去BIOS看看了(其实应当是叫做EFI,这个时候我还没意识到这个问题)。发现boot option中有一个选项是开启legacy support模式。注解中说这个模式用于引导win7及以前版本,推荐不要开启可能会导致(win8)系统无法引导。我晕,估计问题就出在这了。首先先不管一层层的警告先把这个选项开了,然后我也注意到这说明这台机器的引导方式已经与以往不同了,以往的引导方式已经是legacy了。。 重启之后还有提示,说有延迟的修改,不顾各种警告允许修改生效,再次通过liveCD引导,终于可以进入熟悉的ubuntu试用界面了。不管那么多进入安装。根据ubuntu以往的尿性,应该是对windows超级友好兼容,不用担心引导项问题的(我还是没意识到EFI这个问题的严重性)。结果装好发现就是败在这个疏忽上了,grub没有正确地安装,还是直接进入到windows引导界面了。 不过这时候已经知道病因了,那么在网上求医问药就比较顺当,找到了许多文章,介绍了许多不同的解决办法。我采取的是这篇文章中介绍的办法,通过liveCD进入ubuntu后,挂载sda2,这是gpt的引导分区。其文件夹结构为 <DIR> Boot <DIR> HP <DIR> Microsoft <DIR> Ubuntu 其中Boot文件夹中有Bootx64.efi文件,Microsoft/Boot文件夹下有Bootmgfw.efi文件,Ubuntu文件夹下有grubx64.efi文件。可以看出Ubuntu安装程序已经安装了Ubuntu的引导文件,可是EFI系统没有识别出新的引导项,依旧直接启动了windows的引导文件。由于对EFI也是昨天折腾这个事才刚从网上了解,我还说不出所以然,为什么Ubuntu的安装程序无法正确替换windows引导文件,并且事实上ubuntu自动生成的windows引导项也是错的无法启动windows。应该说是新设备加上新系统吧,兼容工作不可能那么快跟得上。 网上提供的另一种解决方案是将linux引导信息写到U盘,通过U盘启动linux,这样做就避免修改windows的引导文件,应该说是方便企业级客户吧。这个方案来自linuxsir.org。可是对我来说太麻烦,不想采用。于是还是使用了上面引用的方案,将Ubuntu引导文件强行替换windows的引导文件,并将ubuntu的grub中增加一个项目,指向原来的windows引导文件(备份更名),从而解决问题。不得不佩服下这个方案的作者,这样强行替换引导文件确实是需要足够的知识和勇气的。。。 这里说明一下,我的系统引导文件分区与文章中一样是sda2,但可能不同系统不同,可以分别挂载查看一下目录结构就能确定具体是哪个。 好吧,长篇的唠叨说完,总结一下要点: windows 8 电源管理关闭快速启动策略 EFI(BIOS)设置中启用boot options/legacy support(网上说法还需关闭secure boot,我是后来才看到,没有采用) 完成ubuntu安装后用ubuntu的grubx64.efi文件替换windows的bootmgfw.efi文件(注意备份) 在ubuntu的grub配置中增加指向原bootmgfw.efi的条目 当前版本的easybcd暂不支持efi/gpt引导方式(我使用的是2.0.2,文章中称2.2也不支持) 后记 总结完才意识到可能由于我没有关闭secure boot才导致ubuntu引导项安装失败以及easybcd设置启动项失败。由于昨天经历漫长的战役已经重启笔记本30次以上消耗了一整天的时间,暂时没有心情去继续研究了。附上似乎是比较官方的介绍easybcd双启动linux和win8的文章供参考。 how to dual boot windows 8 and linux 最后是参考来源: 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解 全局唯一标识分区表 UEFI模式+GPT硬盘实现Windows 8与Ubuntu双系统启动 在EFI/GPT硬盘上利用grub2实现Ubuntu/Win7等多重启动 Ubuntu官方文档:UEFIBooting – Booting Linux natively […]

emacs + cygwin again

两年前我写了一篇博emacs + cygwin fail,说的是在cygwin中使用emacs的种种不便。这些问题已经得到解决。但如今我的需求又有了转变,想在native emacs on windows上使用cygwin作为shell,于是又产生了新的问题。今天看到ownwaterloo在我博客里的留言,想到应该花点时间把以前遗留下来的问题解决掉,于是有了这篇文章。 在emacs中使用cygwin作为shell,可以使用这个cygwin-shell.el http://lists.gnu.org/archive/html/help-gnu-emacs/2010-02/msg00668.html 然后在.emacs中如此启用之 (load “D:\\programs\\emacs-24.3\\site-lisp\\cygwin-shell.el”) 为了方便可以绑定一个快捷键 (global-set-key (kbd “M-s”) ‘cygwin-shell) 重启emacs试用,发现不工作,原来是bash的路径需要填对: (let* ((shell-file-name “D:\\cygwin\\bin\\bash”) 再进去看,可以用了,但是提示符乱码。根据网上的一些讨论,打开bash.bashrc查看 # Set a default prompt of: user@host and current_directory PS1=’\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ ‘ 由于我用的emacs版本支持分色显示,我删除了前面的\w\a部分,保留了分色显示的\u@\h部分。 # Set a default prompt of: user@host and current_directory if [[ $TERM = “emacs” ]]; then PS1=’\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ ‘ else […]

emacs + cygwin fail

真郁闷啊,装了cygwin还没怎么好好玩过。最近因为拆机-重装系统,暂时没装linux,就想着也摸索摸索cygwin,结果上来就给我难题。。 xemacs不太会用,关键是貌似函数名什么的都变掉了,配置文件还要重新写?麻烦啊。 于是emacs有什么问题呢? 居然ctrl-c 是默认绑定到ctrl-g上面去了。。所以怎么退出emacs啊C x C c啊。 查了查资料,原来这个问题04年就有人在问了。真的没有解吗。。 cygwin’s emacs 这里转载一下内容: >On Tue, Mar 09, 2004 at 10:46:47PM -0500, George Hester wrote: >>I go into emacs easy enough. I start cygwin and type emacs and there I >>am in emacs. The directions say to exit type C-x C-c where C is the >>control key. […]

linux内核学习 – C风格的面向对象

linux内核大量使用面向对象的编码风格。然而linux内核是完全使用C写就。学习他们如何使用C模拟面向对象机制很有意思。这种做法很可能被人贬为扯淡,但是的确使用C模拟面向对象机制,使得程序员对类型构造/析构,拷贝/赋值等操作有了绝对的控制权,可以提高对效率的嗅觉,减少错误,同时也避免了对C++编译器各种不同类/对象实现机制的依赖。 类的多态特征是linux内核经常用到的。例如在驱动代码中常常使用函数指针来定义一组设备操作函数,从而模拟了多态的特点。 struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, }; 上面的例子是Linux Device Driver中抄来的示例代码。很好地展示了file operation结构体如何使用这种机制来定义一组文件操作的方式。用这种方式,Linux很好地贯彻了所有的设备都是文件这种概念。不同的设备可以有不同的处理函数,但使用相同的接口,这样就把底层设备的差异在文件系统这一层隔离开来了。 Linux内核中也经常用到类的继承关系。这种关系使用C也很容易模拟,就是使用结构体嵌套。例如 struct scull_dev { struct scull_qset *data; int quantum; int qset; unsigned long size; unsigned int access_key; struct semaphore sem; struct cdev […]

php nslookup 安全性检查

昨天做了这个http://pp.hawkwithwind.net/nslookup.php之后,忽然想到,其实完全可以做一个网页版的命令行,远程控制服务器,其实相当于网页版的ssh了。转念一想,不行,因为那样的话安全性没有保障,等于是把自家后院交给人家随意践踏了。 想到这里,忽然意识到,自己写的那个nslookup.php,其实只是简单的把用户提交的字符串前面加一个”nslookup “然后给系统调用,这样其实是非常危险的。例如我尝试在输入框里面输入twitter.com & whoami,结果除了返回twitter的ip信息,也返回了我在服务器上的用户名。这种可怕的缺陷给黑客太多可趁之机了。立刻修改。 我目前的想法是,字符串里包含后台符号 &,分号 ; , 管道符号 | , 重定向符号 > 或者选项符号 – 的时候,就拒绝服务。另外也禁止了字符串内部的空格或者换行符。这样的话,似乎就没有其他的问题了吧?我在这方面不是很熟,估计还会有问题,欢迎黑客及爱好者们赐教~ 后来又发现了好多其他可能的符号会导致插入语句。。现在我禁止的符号更多了。。包括大括号{}还有问号冒号等等都被我禁掉了。。 另外,虽然只有几行代码,我把他放到了github上,希望能给大家提供一点帮助~ https://github.com/hawkwithwind/phpNetTools

nslookup – 解决ssh隧道无法访问twitter

我最近发现,即使使用ssh隧道,有时也会无法访问twitter, facebook等知名网站,但查询自己的ip地址已经在美国,并且另外一些被墙的网站如blogger等,却又能访问。想到应该是最近GFW的新动作造成的。网上查了查,在google的实时搜索中发现了很多关于最近GFW升级的传闻,很多人抱怨自己ssh或者VPN开始不好用了。 只要能够连上ssh或者vpn,GFW就无法真正对我们造成威胁。仍然无法访问这些网站,极有可能是dns污染造成的。只要能获取到正确的ip地址,就可以访问到对应的网站。然而,网上搜索到的ip地址,往往比较旧,可能已经失效。想要得到最新最正确的dns对应ip地址,最好的方法是通过墙外的主机ping得的ip地址。将其写入自己的hosts文件就好了。 为此,我自己写了一个小小的服务,用美国主机nslookup你想问的域名,给出对应的ip。 pp.hawkwithwind.net/nslookup.php 我还提供了他的api版本,只要使用如下格式的命令,就可得到 json 格式的返回包: pp.hawkwithwind.net/nslookup.php?server=google.com 返回形式如下 [‘74.125.224.176’, ‘74.125.224.177’, ‘74.125.224.178’, ‘74.125.224.179’, ‘74.125.224.180’] 相信还是蛮有用的。至于原理,非常简单,用php的exec函数执行nslookup命令就可以了。

在linux上使用fbterm和ucimf启用中文命令行

昨天说了希望找到一个好用的linux下的中文命令行, 最好还是用framebuffer的, 今天果然就找到了, 其实就是名气响当当的fbterm. 顾明思意, 他是使用framebuffer的, 完全满足了咱那小小的需求. 装这个东西费了我不少时间. 主要也是因为ubuntu没有提供安装包支持的关系. 好在这个东西名气比较响, 网上的讨论比较多, 很快找到了资源. 首先安装fbterm本身. 这个东西ubuntu有安装支持. 接下来是fbterm_ucimf. 这个东西是给fbterm用的中文输入法. 要先装libucimf再装fbterm_ucimf. 这些ubuntu源上都没有, 幸而google code上有他们的项目, 很容易找到. 可惜装完之后他用不了. 网上查了很久也不知道怎么解决. 想想看只好继续往下安装. 就又安装了Openvanilla-modules, ucimf-Openvanilla. 这两个东西google code上的fbterm_ucimf项目那里也有. 全安装完毕之后再打开fbterm, 敲击Ctrl-Space之后, 按F9, 终于看到输入法了!不过那输入法很扯淡, 用不了. 按照网上说的, 到Openvanilla安装目录下面去找那堆输入法.cin文件, 除了pinyin之外全删掉(我是把后缀改成.bak). 世界清静了. 至于前面为何输入法没弄对, 我一直不清楚. 也许是Openvanilla才是真正对输入法的支持吧. 进fbterm之前要设置正确locale: LANG=zh_CN.UTF-8 使用这个命令之后再 fbterm -i fbterm_ucimf 就能正确启动fbterm啦~ 顺便说一下fbterm两个小问题的解决: 如果他进入之后说快捷键无法启用, 那是因为权限问题. 根据google code上wiki的提示, 使用chmod u+s /…/fbterm […]

ubuntu禁用gdm

通常禁用gdm的方式是修改/etc/inittab文件,将默认起入init 5的设置改成默认起入init 3就好了。 但是这个方式在ubuntu下似乎走不通。因为ubuntu下面根本就没有/etc/inittab文件,并且据网上说ubuntu默认对init [2345]都加上了gdm支持,所以你自己加了一个/etc/inittab文件确实能覆盖ubuntu原始设置但是也没啥用。 网上有介绍,在服务设置中关闭gdm对2345运行级的默认启动设置就行了。但是我自己这台机器它本来就是deactive的,不知为何还能进入x。这点我没有求其所以然。 不过根据网上的另外一些介绍,找到了/etc/init文件夹,下面是一堆各种init脚本。ls | grep gdm,只有一个gdm.conf。他有一句stop on runlevel如何如何,方括号应该是正则的或的关系吧,写成[012346],就只有init 5能进x了,默认进的应该是2,网上有交代,在rc_sysinit.conf里面也能找到。有人说要改成3,其实不是5就行了(当然也不能是0和6)。 起进去我楞了好久。一开始我的grub还是带splash的,它闪啊闪最后不动了,cpu和硬盘都不动了。我就只好重启。后来进safe mode关了splash看他的输出信息,我还以为是他卡死在配置电池什么什么的一个环节出不来了。网上查也查不到怎么回事。只好孜孜不倦地反复重启。其实再怎么重启效果也是一样嘛,但是可能人就不一样了。某次又重启的时候莫名其妙按了ctrl-alt-f1,然后就进命令行了。才知道原来他CPU也不转了硬盘也不叫了其实就是启动完毕了。我傻乎乎反复引导了十多次才搞明白这么回事。 最后说一下进了命令行上不了网怎么办吧,其实很简单。我也是在网上查的,就是sudo dhclient,他就会自动获取IP了。当然如果你的网络是需要手动配ip的那你还是自己ifconfig eth0吧。或者改脚本也行。命令行下怎么用无线网络我还没试过,以后回去试试看。 最后说下,这个Ubuntu Skills的网站相当给力啊。常用工具都指出了。强烈推荐。