编译 Gentoo 及 LFS

上个周未突然来兴致说要编译一下 LFS 或者 Gentoo,所以看了一遍 Gentoo 及 LFS 的编译过程,就开始上手了。之前在大学的时候就尝试编译过 LFS——当时一些朋友说编译 LFS 是一个可以让人忘记上课,忘记睡觉,忘记吃饭的事——编译了30几个小时也没能成功,所以很挫败。

因为 Gentoo 的编译过程简单许多,就先拿它下手。照着文档,差不多就编译了一个内核,一个 Grub,过程并不复杂,也顺利,内核编译了两遍,第一次没有把 SCSI 编译进去,造成启动的时候认不出我的 SATA 硬盘,编译了第二遍终于可以了,很兴奋——原来编译 Gentoo 也是这么简单的事,然后又用 emerge 安装了 VIM 等一些常用软件,基本系统也终于可以用了。

然后又开始编译 LFS,照着文档,也顺利地编译好了环境与基本系统,最后到内核的时候也犯了很多错误,开始的时候是直接拿了 Arch 的Config编译的,把很多东西都编译成模块了,又没有做 initfs,系统没能启动。又开始找作 initfs 的方法,都失败了。又把驱动啥的都编译到内核里去,还是启动不了,不知为何。今天索性用 arch 的内核来启动 LFS,系统是启动了,可一些初始化的工作没有完成,最后发现是 inittab 里的启动级别没设置好,最后系统终于能正常启动了,撒花~

继续折腾系统去,有时间写写编译过程与注意事项~

Shell 快捷键(二)

Shell 快捷键 中,对 Linux Shell 下 Emacs 分割的快捷键组合进行
了整理和总结,为了方便对比记忆,这里重新根据功能进行归类。

光标移动

命令 说明
Alt + b 后移一个单词
Alt + f 前移一个单词
Ctrl + b 后移一个字符
Ctrl + f 前移一个字符
Ctrl + a 把光标移到行首
Ctrl + e 把光标移到行尾
ctrl + ← 光标移动到前一个单词开头
ctrl + → 光标移动到后一个单词结尾
Ctrl + x Ctrl + x 在 EOL 和当前位置移动光标

输入编辑

命令 说明
Ctrl + h 删除前一字符
Ctrl + d 删除当前字符
Ctrl + k 删除当前字符到行末
Ctrl + u 删除行首到当前字符
Ctrl + w 删除单词到当前字符
Alt + d 从当前位置向后删除单词
Alt + ← 从当前位置向前删除单词
—————- —————————————————————
Esc + t 互换相邻两个单词
Alt + t 互换相邻两个单词
Ctrl + t 互换相邻两个字符
—————- —————————————————————
ctrl + ? 撤消前一次输入
Alt + r 撤消前一次动作
—————- —————————————————————
Alt + l 小写当前单词
Alt + u 大写当前单词
Alt + c 首字母大写当前单词
—————- —————————————————————
^oldstr^newstr 替换前一次命令中字符串

终端管理

命令 说明
Ctrl + s 锁住终端
Ctrl + q 解锁终端
Ctrl + l 清除终端
Ctrl + d 退出终端
————– —————————————————————–
Ctrl + c 中止命令
Ctrl + z 挂起命令
ctrl + o 重复执行命令

命令历史

命令 说明
Ctrl + r 向后查询历史,增量地
Ctrl + s 向前查询历史,增量地
Alt + p 向后查询历史,非增量地
Alt + n 向前查询历史,非增量地
————— —————————————————————-
Ctrl + p / ↑ 显示上一条命令
Ctrl + n / ↓ 显示下一条命令
Alt + < 移动到历史的首行
Alt + > 移动到历史的末行
————— —————————————————————-
Alt + . 插入最后一个参数
Alt + _ 插入最后一个参数
Esc + . 插入最后一个参数
Esc + _ 插入最后一个参数
————— —————————————————————-
Ctrl + y 粘贴刚才所删除的字符
Ctrl + Alt + y 插入上条命令的第一个参数

自动完成

命令 说明
Alt + / 尝试自动完成文件名
Alt + ? 显示当前自动完成列表
Alt + * 插入所有可能自动完成

其他

命令 说明
Ctrl + i 同 Tab
Ctrl + j 同 Enter
Ctrl + v CHAR 输入特殊字符
Ctrl + x @ 显示所有的可用的主机名自动完成
Ctrl + x Ctrl + e 使用 vim 写入 script 一次执行
2T 命令行补全
(string)2T 命令行补全
$2T 列出系统变量
=2T 列出当前目录
/2T 显示整个目录结构,包括隐藏文件
./2T 只显示子目录,包括隐藏目录
*2T 只显示子目录,不包括隐藏目录
@2T “/etc/hosts” 文件的条目
~2T “/etc/passwd” 文件中系统所有的当前用户

Shell 快捷键

在使用 Shell 进行 Linux 操作时,经常需要编辑大段的代码,如果仅仅使用键盘的
Delete 和 Backspace 键,那是一件非常折磨人的事情。我们以 Linux 默认的 Bash
Shell 为例,他可以设定为多种 Mode,使其操作习惯类似于一些熟悉的编辑器,比如
emacs 或 vi。

  • 列出所有 Mode

    set -o

  • 使用 vi 操作习惯來操作 Bash Shell

    set -o vi

  • 使用 emacs 的操作习惯来操作 Bash Shell,默认即为此 Mode

    set -o emacs

下面总结以下 Bash Shell 采用默认 emacs Mode 时可用的一些快捷键,能够极大提高
Shell 的操作效率。

继续阅读Shell 快捷键

让Gnome 3.2上的dock扩展工作

前几天把ArchLinux的Gnome升级到了3.2版本。
升完后,’gnome-shell-extension-dock’就无法工作了,用得顺顺得dock一下不见了很不习惯。前几天网上找也无果。

然后,终于在今天找到了方法:

# cd /usr/share/gnome-shell/extensions/dock@gnome-shell-extensions.gnome.org/
# vim extension.js

找到”this.actor.lower_bottom();”这一行,把它注释掉。保存后,在gnome-tweak-tool中把dock-extensions重新启用。Enjoy!
发现3.2的dock可以自动隐藏了,这个很是喜欢呐。

sshfs的配置

上个月新买了一个本本电脑,所以女人的旧电脑就算淘汰下来了。但我还得用我那07年的老爷机,在做开发上还是有些吃力,因此决定把原来共存于同一个系统的桌面环境和服务器环境分开,将服务器环境转移到淘汰下来的老爷机上,所以在上面装了个FreeBSD,以方便维护。但也因此出现一个问题,服务器的数据应该放在哪里,桌面机上还是服务器机器上。由于淘汰下来的机器可能会被我用来折腾,如挨个装发得版,或测试其它东西,所以我想把数据还是放在桌面机上;问题又来了,服务器如何能快速有效地访问这些数据,而不影响服务器的正常运作呢。

首先,想到的是用netbeans的远程站点功能。随后,又想到了利用 ssh 挂载远程文件系统的功能,把 Desktop 上的文件系统通过 sshfs 挂载到 Server 上。由于第一种方案需要依赖netbeans,所以我打算用第二种方案。

一、安装配置 SSHFS

安装 sshfs ,这个在 Arch 下用 pacman 安装即可,其它发行版应该都有相应的包管理器可以解决。在安装好 sshfs 之后,可以使用 # sshfs [USER]@[HOST]:[DIR] [MOUNTPOINT] [OPTIONS] 挂载远程的文件系统,使用 # fusermount -u [MOUNTPOINT] 进行卸载。当然,前提是远程系统上有 ssh daemon 运行。另外一个比较有用的参数是 -o allow_other,否则挂载的文件系统只有当前用户可用,其他用户无法访问。这样,就可以像操作本地文件一样来操作远程文件了。

继续阅读sshfs的配置

如何在Linux下挂载带分区的镜像文件

之前一直有折腾ChromeOS,一位叫hexxeh的朋友一直有提供nightly build的镜像,所以免去了自己编译的烦恼。下载下来后,我打算修改一些东西后,再写入到U盘上,因为ChromeOS的映像文件是带有GPT分区的镜像,所以不能直接mount,需要在mount的时候的提供offset参数,即提供需要挂载的这个分区是从哪里开始的。像这样:

# sudo mount -o offset=xxx xxx.img /MOUNT/TO/DIR/

那么,如何得到这个offset的参数呢?我们可以用fdisk等工具来列出相关信息得到。不过,还有一个更NB的工具叫parted,一般可以在源里面找到。
继续阅读如何在Linux下挂载带分区的镜像文件

Debian VPS 在更新内核报错的问题

今天在Debian VPS上更新内核时碰到了问题,报错为

Setting up linux-image-2.6.32-5-686-bigmem (2.6.32-31) ...
Running depmod.
Running update-initramfs.
update-initramfs: Generating /boot/initrd.img-2.6.32-5-686-bigmem
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32-5-686-bigmem /boot/vmlinuz-2.6.32-5-686-bigmem
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 2.6.32-5-686-bigmem /boot/vmlinuz-2.6.32-5-686-bigmem
Searching for GRUB installation directory ... found: /boot/grub
warning: grub-probe can't find drive for /dev/xvda1.
grub-probe: error: cannot find a GRUB drive for /dev/xvda1. Check your device.map.
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 1
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-2.6.32-5-686-bigmem.postinst line 799,  line 2.
dpkg: error processing linux-image-2.6.32-5-686-bigmem (--configure):
subprocess installed post-installation script returned error exit status 2

之前在给公司的VPS作配置的时候也遇到了一样的问题,都是Xen的VPS,装的是Debian的系统,当时就只是把kernel的更新给keep了。今天自己碰到了一样的问题就细细琢磨了一下。看报错的情况是在更新Kernel的时候,没有找到装有GRUB的设备。下面是我解决的步骤:
继续阅读Debian VPS 在更新内核报错的问题

用TestDisk找回丢失的分区表

TestDisk

本来想把一ISO镜像dd写入到U盘里的,结果忘记我把移动硬盘也插在电脑上,直接”dd if=xx.iso of=/dev/sdb”了,而这个sdb正好是移动硬盘,于是iso全部被写入到了移动硬盘上@.@。好在移动硬盘上的分区都还挂载着,先把重要的数据都转移后,拨下移动硬盘,果然一个分区也认不出来了,应该是分区表已经被损坏,崩溃。

决定试着找回一下分区表,在网上找到了这篇:介绍一个 GPL 的分区表修复工具 TestDisk,Arch的源也面也正好有testdisk,下载安装,并看了一遍TestDisk的WIKI

之前在windows下也用过一些数据恢复的软件,而这个testdisk并不像那些软件有华丽丽的图形界面,只在终端下面提供一个向导,扫描后显示扫描结果,及有可能的分区情况,选择原先正确的分区情况后写入到硬盘,总算找回了所有分区。只是第一个分区似乎真的损坏了,好在这个分区无关紧要,我只在上面装了个移动作业系统,重新格式化这个分区后,一切安好。

继续阅读用TestDisk找回丢失的分区表

Linux下查看某进程的详细状态

Linux下用”ps”命令可以查看进程列表中某一个进程的内存及CPU占用信息,那么,如果想查看某一进程详细的状态信息应该如何去做呢。
其实Linux下进程的详细信息会被记录在/proc/PID/status文件中,其中PID为某个进程的Process ID。现在假设有个程序ID为788,那么我们只要

cat /proc/788/status

就可以看到788这个进程的详细信息了。至于如何得到PID,可以用”ps aux | grep ‘进程名'” 找到pid。
或者干脆用一行流:

cat /proc/`ps ax | grep mysql | awk '{print $1}' | head -1`/status

diff的使用及制作patch

VPS上的LANMP都是自己编译出来的,因为个人比较追求新的发布,所以一有新的版本发布,就会上down下来编译更新。之前都会对源码做些个人化的修改后再编译,就经常要对新的发布版本做一样的修改。经常性地这样手动更改很麻烦,所以就想到了制作patch补丁。

diff工具的使用

diff [OPTION]... FILES

FILES 表示多个文件或目录
说明:该命令告诉使用者,为了使文件,如FILES一致,需要修改它们的哪些行。如果用 “-“表示 FILES,则表示标准输入。如果 FILES 是目录,那么 diff 将使用该目录中的同名文件进行比较。
继续阅读diff的使用及制作patch