解决Debian PXE方式安装找不到硬盘的问题

该问题是由于网络启动模式的initrd.gz中并未包含对应的驱动模块,导致无法发现硬盘。可以拿DVD光盘中install[.arch]目录下的initrd解压后获取驱动模块,与网络方式(netboot)安装的initrd合并后,重新制作新的initrd文件。

1. gunzip解压dvd中的initrd.gz并重命名为initrd-dvd

2. gunzip解压netboot中的initrd.gz并重命名为initrd-net

3. 解包initrd-dvd到dvd目录

mkdir /tmp/dvd
cd /tmp/dvd
cpio -i < initrd-dvd

4. 解包initrd-net到net目录

mkdir /tmp/net
cd /tmp/net
cpio -i < initrd-net

5. 将dvd版本中的驱动复制到net版(请调整目录名称)

cd /tmp
cp -a dvd/lib/modules/3.2.0-4-amd64/kernel/drivers/* net/lib/modules/3.2.0-4-amd64/kernel/drivers/

6. 重新打包initrd

cd /tmp/net
find | cpio -o -R 0:0 -H newc | gzip > ../initrd.gz

7. 复制initrd.gz到tftp目录测试PXE引导,Enjoy!

本文参考了以下资料:
http://unix.stackexchange.com/questions/68387/preseeding-debian-install-from-local-mirror-no-disks-detected

在Linux终端递归下载ftp服务器某个目录的方法

假如要将ftp://127.0.0.1/pub/a/b/c/中的c目录及其内容下载到本地~/目录,即本地~/c/目录对应服务器的/pub/a/b/c目录,该如何操作呢?

方法一:使用lftp工具

cd ~
lftp 127.0.0.1
user <username> [<password>]
cd /pub/a/b
mirror c #或 mirror c ~/c
#mirror c 指把服务器c的内容镜像到本地当前目录,如果指定第二个参数(存放到的本地目录),则第一个c是指c下的所有文件,而不是c目录本身

方法二:使用wget

wget -r ftp://127.0.0.1/pub/a/b/c -P ~ -nH --cut-dirs=3
  • -r 递归下载目录下的内容
  • -P –directory-prefix 指定本地目录前缀,所有下载内容将基于该目录,不指定则为当前目录
  • -nH 不要建立以主机名命名的本地目录,默认wget下载的内容会存放于以主机名命名的子目录中
    –cut-dirs 裁剪目录前缀个数,本例中裁减掉/pub/a/b/共3个目录,这样保存到本地的目录树不会出现/pub/a/b/

bash中容易搞混的几种括号运算符

$()

取得括号内运行命令的标准输出,作为当前命令行的命令或参数,其效果和``相同。
举例:mkdir $(date +%F)

$[]

执行整数运算。作用和let相似
举例:var=$[10+20]

$(())

执行整数运算。作用和let相似
举例:var=$((10+20))

(())

可在其中使用直观的数学比较运算符,比test命令的选项 -lt -gt等要直观。
举例:

root@debian:~# (( 1 > 0 )) && echo yes
yes
root@debian:~# (( 1 > 10 )) && echo yes
root@debian:~#

[[]]

test命令或[的增强版,bash专有扩展,在sh中不支持。可以用扩展正则表达式或通配符来比较字符串。
举例:正则表达式:

root@debian:~# [[ "123456" =~ ^[0-9]+$ ]] && echo yes
yes
root@debian:~# [[ "123456X" =~ ^[0-9]+$ ]] && echo yes
root@debian:~#

举例:通配符:

root@debian:~# [[ 'abc.txt' == abc.* ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.txt ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.jpg ]] && echo yes
root@debian:~#

经测试等号右边的模式不能用引号括起来,否则会识别失败

新装Debian 7 重启后显示 error: file ‘/boot/grub/i386-pc/normal.mod’ not found的解决办法

新机支持EFI bios,且系统是64位,会自动安装EFI版的GRUB,不管你是否启用了EFI引导。解决办法是再次启动安装镜像,并且选择”高级选项(Advanced options)“中的”救援模式(rescue mode)“,选择正确的你所安装的根分区/的设备,并进入命令行模式。
然后:

bash  #我比较喜欢用bash,默认是sh
mount -a #把没挂载的设备都挂上
aptitude -y remove grub-efi-amd64 #删除EFI版的GRUB
aptitude -y install grub-pc #安装传统PC版GRUB
rm -rf /boot/grub/*
grub-install /dev/sdX #重新初始化GRUB到启动磁盘
update-grub #重新生成启动项菜单,等同于grub-mkconfig > /boot/grub/grub.cfg

#然后重启并从硬盘引导就OK了