Windows 7 & Arch Linux U盘安装二合一

距离上次发文也一年多了, 真是时光飞逝. 这一年工作接触了很多也做了很多, 不过其实学得越多越发现自己是小白, 也不好意思写文章误导大众了><, 分享一些小经验吧.

话说最近转战Arch Linux, 不过U盘已经放了个Windows 7, 就想弄个双启动. 双启动就得给U盘重新装个引导呗, 不过折腾了半天syslinux没搞定, 启动时卡在那黑屏, 也没啥报错信息. 还是上GRUB吧. 以下是在U盘上安装GRUB并配置双启动的方法.

U盘的目录结构

由于我的U盘之前做成了Windows 7的安装盘, 所以弄成了如下的文件结构. 直接引导Windows 7的ISO谁有兴趣的话也可以尝试下.

  • Windows 7: 直接解压镜像至U盘根目录.
  • Arch Linux: 直接把ISO放于U盘/boot/isos/下.

GRUB的安装

在Ubuntu下直接用grub-install即可, 其它系统可查阅相关文档.

grub-install --boot-directory=/mnt/usb/boot /dev/sdb


其中/dev/sdb是U盘设备, 假设U盘被挂载到/mnt/usb目录下.

GRUB的配置

以下是grub.cfg, 在U盘的/boot/grub/下, 注意不要和你硬盘的/boot搞混了!

set timeout=10
set default=0

menuentry "Arch" {
 set isofile="/boot/isos/archlinux-2013.09.01-dual.iso"
 loopback loop /$isofile
 linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201309 img_dev=/dev/disk/by-label/GSP1RMCULXF img_loop=$isofile earlymodules=loop
 initrd (loop)/arch/boot/x86_64/archiso.img
}

menuentry "Windows 7" {
 insmod part_msdos
 insmod ntfs
 insmod ntldr
 ntldr /bootmgr
}

其中Arch的引导需要指定下镜像文件所在设备的路径img_dev, 我这边是根据U盘的Label(img_dev=/dev/disk/by-label/GSP1RMCULXF)找的, 不知道有没有更好的办法.

至此从U盘启动的时候就会出现启动菜单, 当然也可以类似地加入Ubuntu等, 不过要注意的是其它发行版和Arch的ISO目录结构可能不太一样, 需要查阅下相关文档看怎么配置引导.

完结撒花><!


2014.04.16 Update

贴一个Ubuntu的配置:

menuentry "Ubuntu 13.10 Desktop amd64" {
 set isofile="/boot/isos/ubuntu-13.10-desktop-amd64.iso"
 loopback loop /$isofile
 linux (loop)/casper/vmlinuz.efi boot=casper img_dev=/dev/disk/by-label/GSP1RMCULXF iso-scan/filename=$isofile noprompt noeject
 initrd (loop)/casper/initrd.lz
}

Tips for Crontab

  1. Add “2>&1 >> cron.log” to redirect stderr and log output. “>>” means appending while “>” means overwriting.
  2. Check the “+x” mode of the script.
  3. Check the relative path in both the script and the cron config. Cron may run in a different directory.
  4. Check the encoding of the script. Cron may run in an environment different from bash.
  5. Check the privileges related with the files used in the script.

Dnsmasq设置简介

说是简介其实也不想详细介绍, 具体官网上都有, 一搜便知. 这里只是简单地罗列下常用配置, 以供参考.

#不读取/etc/resolv.conf文件
no-resolv

#不扫描/etc/resolv.conf和/etc/dnsmasq.conf文件的改动,如果有改动直接重启程序即可
no-poll

#设置dns服务器
server=8.8.8.8

#指定*.domain.name用8.8.8.8解析
server=/domain.name/8.8.8.8
注意不是server=/*.domain.name/8.8.8.8

#解析*.domain.name到127.0.0.1
address=/domain.name/127.0.0.1

#无效的DNS服务器, 用于反DNS劫持
bogus-nxdomain=127.0.0.1

下列一个典型的配置文件, 用于tomato, 要使其生效请开启截获DNS端口.

#覆盖掉原有DNS设置
no-resolv

#对baidu.com及其子域名使用中国电信的DNS
server=/baidu.com/218.2.135.1

#对其它的域名使用Google DNS
server=8.8.8.8

nginx泛二级域名配置

nginx有着非常强大的rewrite功能, 结合正则表达式可以定义非常灵活的泛二级域名.

假设/home/www中分别有company1/和company2/两个网站, 希望分别有各自的二级域名.

在nginx配置文件中使用如下语句即可分离出二级域名, 保存至变量$subdomain, 默认为company1.

set $subdomain company1;
if ( $http_host ~* "^(.*).archangelsdy.com$") {
    set $subdomain $1;
}

之后用root语句定位至对应的主目录.

root /home/www/$subdomain;

同样, fastcgi的转发也相应修改为:

fastcgi_param  SCRIPT_FILENAME  /home/www/$subdomain$fastcgi_script_name;

如上配置后, 对于某个二级域名便可重定向置/home中对应的目录. 显然, 用这种方便配置后, 以后添加二级域名只需要配置好域名解析并在/home中建立相应目录即可, 不需要修改nginx的配置文件也不需要重启nginx, 可批量添加二级域名三级域名等, 缺点是对于每个二级域名下的网站配置都是相同的.

双层SSH隧道研究

学校的内网无法直接出校, 需拨某VPN才能访问外网, 对外统一为一个ip. 然而最近由于那啥升级导致学校的国际出口及其不稳, 无法通过此VPN挂SSH proxy. 手头有一系服务器(Server A)对外有独立ip, 然而没有root权限, 基本上只能ls/cp/mv/rm/scp. 突然想到既然可以ssh上此服务器当然可以当成proxy出校, 而且由于独立ip基本没有对外访问的请求应该不至于触发某计数器, 于是尝试在此ssh tunnel中再与vps(Server B)构造一层tunnel.

由于没有root权限也改不了iptables, Server A自然只能当成ssh proxy出校用了, 在本地8000端口监听:

ssh -qTfnN -D 8000 user@server-a.com

尝试让本地的ssh请求走8000端口的proxy, 然而全局代理无效, 只能另想办法.

Google了一圈发现proxychains, 支持HTTP/SOCKS4/SOCKS5, 支持ssh/telnet/wget/ftp/apt/vnc/nmap等命令的转发, 再合适不过了.

直接apt-get装完, 编辑/etc/proxychains.conf如下, 具体可参照该文件内的注释:

dynamic_chain
chain_len=1
proxy_dns 
tcp_read_time_out 15000
tcp_connect_time_out 10000

[ProxyList]
socks5 	127.0.0.1 8000
socks4  127.0.0.1 8000

配置完后就可以在通过代理使用ssh了:

sudo proxychains ssh -qTfnN -D 7070 user@server-b.com

此后配置浏览器通过7070端口使用代理, 即可正常访问.