前言
1 月份在移动硬盘上装了个 Arch , 但这块移动硬盘实在是太旧了,在我的旧电脑上经常供电不足, 弄了块 USB 2.0 PCI 卡 也无济于事。 最近终于挺不住了,频繁的报分区损坏、无法进入系统, 严重的时候会在进行硬盘操作时死机。 无奈,拿出一个比较新的 8G U盘,重做随身系统。
本篇文章基于上次移动硬盘安装的经历修改补充而来, 不过半年的时间,一些基础组件就已经发生了变化, Arch Linux 可真是够“折腾”的。
PS:基于半年的 Arch Linux 使用经验, 我 合租的 Linode VPS 也用上了 Arch, 目前感觉尚好,Nginx + PHP-FPM 确实是不错的组合。 Linode 使用修改过的 Linux 内核, AUR 上也有人发布 自己制作的更新版 , 还没研究怎么升级。
基本系统安装
和上次移动硬盘安装一样,选择 32 位系统。 安装介质使用 archlinux-2013.07.01-dual.iso dd 到另一个U盘。
使用U盘启动,自动以 root 身份进入系统。
插入移动硬盘,分区,格式化,挂载。
本想使用 GPT 分区表,查了一些资料, 为了使这个U盘在 BIOS 和 UEFI 电脑上都能用, 需要创建一个 BIOS boot 分区,2M 大小足够,位置尽量靠前。 多系统的话还要创建一个 200M 的 EFI System Partition(ESP) 分区。 这些都不是问题,但实际做下来, GPT 中的 NTFS 分区在 Win7 下死活不认, 想用这个分区作为常规U盘使用就不行了, 只好再回到 MBR 分区表。 如果是移动硬盘用 GPT 应该没有问题。
所以仍然使用 MBR 分区,所以就要用 fdisk 或者 cfdisk 了, 不能使用支持 GPT 的 gdisk 和 cgdisk, 4k 对齐也是自动完成。 有趣的是,如果想把 GPT 分区表转换成 MBR 分区表, 还得借助 gdisk:r 进入 Recovery 模式, g 进入 MBR 模式,w 进行转换。 根据实际情况, 有些分区转换未必能够成功, 不过变回 MBR 分区表是没有问题的。
NTFS 分区得在第一个分区,不然 Windows 不认。
启动U盘是 /dev/sdb,目标U盘就成了 /dev/sdc。
# fdisk /dev/sdb Disk /dev/sdc: 8022 MB, 8022982656 bytes, 15669888 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 2048 1804287 901120 7 HPFS/NTFS/exFAT /dev/sdb2 * 1804288 2009087 102400 83 Linux /dev/sdb3 2009088 10405887 4198400 83 Linux /dev/sdb4 10405888 15669887 2632000 83 Linux
第一个分区先用 ntfs,当正常U盘使用, 如果以后需要用到 ESP 分区,直接用这个分区转,或者切一部分空间过去。 第二个分区 100M,挂 /boot; 第三个分区 4G,作为 ArchLinux 根分区; 第四个分区 2.5G,作为 $HOME ;
格式化分区:
如果使用 xfs 分区格式:
# mkfs.ntfs -f /dev/sdc1 -L f004-c # mkfs.xfs -n size=64k -l lazy-count=1 /dev/sdc2 -L f004-boot # mkfs.xfs -n size=64k -l size=128m,lazy-count=1 /dev/sdc3 -L f004-a # mkfs.xfs -n size=64k -l size=128m,lazy-count=1 /dev/sdc4 -L f004-b
-n size=64k 参数增加了文件名(目录)区域大小(默认 4k), 这样可以减少 IO 消耗,代价是 CPU 消耗多一些, 这对现代计算机显然不是问题。 -l size=128m 参数扩大日志的容量(默认 10m),更安全, 代价是挂载时间会长一些。 -l lazy-count=1 参数减少 superblock 读写次数,提高性能。
如果使用 ext4 分区格式:
# mkfs.ntfs -f /dev/sdc1 -L f004-c # mkfs.ext4 -b 4096 -m 0 -i 16384 -O '^has_journal' /dev/sdc2 -L f004-boot # mkfs.ext4 -b 4096 -m 1 -i 16384 -O '^has_journal' /dev/sdc3 -L f004-a # mkfs.ext4 -b 4096 -m 0 -i 16384 -O '^has_journal' /dev/sdc4 -L f004-b
-b 4096 是每个存储块的大小。 -m 1 是指定 root 保留空间为 1%,home 区就不留了。 -i 16384 是指定多少字节的数据设置一个 inode 节点, 增加它的值会减少 inode 的总数,占用的空间会少一些, 相应的能够存储的文件数量也减少了,这个稍微注意一下就好,一般都够用。 -O '^has_journal' 是关掉文件系统日志,有点小危险。
经过两天的折腾,个人感觉 ext4 在U盘上读写速度快一些。
挂载分区:
# mount /dev/sdc3 /mnt # mkdir /mnt/boot # mount /dev/sdc2 /mnt/boot # mkdir /mnt/home # mount /dev/sdc4 /mnt/home
df -h 检查一下:
# xfs Filesystem Size Used Avail Use% Mounted on /dev/sdc3 3.9G 33M 3.9G 1% /mnt /dev/sdc2 82M 5.2M 77M 7% /mnt /dev/sdc4 2.4G 33M 2.4G 2% /mnt/home # ext4 Filesystem Size Used Avail Use% Mounted on /dev/sdc3 3.9G 8.1M 3.8G 1% /mnt /dev/sdc2 96M 48K 96M 1% /mnt /dev/sdc4 2.5G 3.8M 2.4G 1% /mnt/home
ext4 改变 bytes-per-inode 确实对分区所占空间影响很大。
安装基本系统
家里有无线路由,网络不用配置,已经自动连上了。
编辑 /etc/pacman.d/mirrorlist ,把最快的源挪到最上面。 一般来说 163 和台湾的源比较快,163 似乎有时候不稳定, 几个中国大学的源有些是 ipv6 的,用不了。 安装完成后,这个配置文件也会自动拷贝到新系统中。 自带的 vi 真的是比 vim 难用多了,一会儿第一时间换掉。
按照官网说明,用 # pacstrap /mnt base base-devel 安装基本系统, base-devel 也一并装上,迟早会用到 AUR 或 ABS。 提示共 128 个软件包,需要下载 158.37M 内容,安装完成后是 507.09M。
安装 grub: # arch-chroot /mnt pacman -S grub 。
生成 fstab: # genfstab -p -U /mnt >> /mnt/etc/fstab , 然后更改 fstab (系统默认一般就比较好了,不优化也行):
使用 relatime 挂载参数。
以前是推荐增加 noatime 挂载参数,不记录文件读取时间, 但这会导致 Mutt 等需要文件读取时间的软件出错。 现在改为使用 relatime 参数了 (已经默认加上了,Linux 2.6.30 起此参数成为默认值), 只有在文件读取时间早于文件更新时间时,才更新读取时间数据。
使用 nodiratime 挂载参数,不记录目录读取访问时间。
把 /tmp 放到 tmpfs 上去。(没单独分区,免了)
不再使用 discard 挂载参数。
这个参数主要是针对 SSD 硬盘的,对不支持 TRIM 的机械硬盘无效, 对U盘貌似作用不明显。
不再使用 async 挂载参数,开启异步读写模式。 由于只是“看起来”快了,实际数据写入速度并没有改善, 考虑到稳定性,是否应使用此参数?
不要使用 barrier=0 挂载参数,这个选项似乎在突然断电、 拔U盘时,有几率丢失文件或损坏分区。 (基于我的经历 + 参考 )
由于不会跑什么大应用,为了降低 swap 的使用频率, 修改 /mnt/etc/sysctl.conf :
vm.swappiness = 1 vm.vfs_cache_pressure = 50
前一句是尽量不使用 swap,后一句是缓存文件系统信息。
下面的操作可以在 chroot 环境下运行:
# arch-chroot /mnt
设置 hostname: echo 'f004' > /etc/hostname 。
设置时区:
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
新建 /etc/locale.conf 内容为:
LANG='en_US.UTF-8' LC_COLLATE='C' LC_MESSAGES='C'
编辑 /etc/locale.gen ,取消 en_US.UTF-8, zh_CN.UTF-8, zh_TW.UTF-8 前面的注释,然后执行 locale-gen 命令。
更改 root 密码: passwd root 。
安装 Grub 引导系统。
仍然在 chroot 环境中操作。 编辑 /etc/mkinitcpio.conf ,检查 HOOKS 段, 让 block 参数紧挨着 udev 参数之后(早一点加载), 然后 # mkinitcpio -p linux 生成 img 文件。 同时加上了 shutdown 参数,作用以后再试。 resume 参数就算了,U盘本来就小、慢,支持休眠更痛苦。 (注:新版本中 block 参数替代了 usb pata sata scsi 等一众参数)
安装 grub:
# grub-install --target=i386-pc --recheck --boot-directory=/boot --no-floppy /dev/sdc # cp -v /usr/share/grub/{unicode.pf2,ascii.pf2} /boot/grub/ # cp -v /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo
无论是 32 位还是 64 位系统,都是使用 --target=i386-pc 参数, --no-floppy 是不检查软驱(这玩意儿现在应该没人用了)。 后两句不执行也行,还没弄懂是做什么的。
然后,千万不要忘记 生成 grub.cfg 文件 :
# grub-mkconfig -o /boot/grub/grub.cfg # grep 'set=root' /boot/grub/grub.cfg # blkid /dev/sdc2
现在的 Grub2 使用 UUID 来找硬盘分区, 后两句就是检查新生成的 grub.cfg 使用的分区 UUID 和硬盘是否相符。 如果忘记生成 grub.cfg 了,可以再次用光盘启动进去做。
最后,退出 chroot 环境,umount,重启。 启动U盘可以收起来了。
启动后,新安装的U盘变成了 /dev/sdb, 此时最好将 mkinitcpio grub-install grub-mkconfig 重新做一遍, 否则有可能在下次或另外一台机器上启动时,损坏分区表,丢失文件。 或许没有道理,但这是我重复安装好多次以后的感觉,可能有以下原因:
- 带电插拔,可我都是 umount 了啊,不应当这么脆弱。
- 被 USB 3.0 高电流给破坏了,没拔U盘烧了算我走运? 倒是听说过 USB 3.0 损坏U盘数据。
- /boot 原先没有单独分区,这个不应该。
- 是原先使用 GPT 分区在 BIOS 电脑上水土不服? U盘难道就不能用 GPT 分区么?
反正换回 MBR 分区后,貌似比较正常了。
初始设置
如果一切正常,现在可以用 root 登录系统了:
# uname -a Linux f004 3.9.9-1-ARCH #1 SMP PREEMPT Wed Jul 3 22:52:05 CET 2013 i686 GNU/Linux # free -h total used free shared buffers cached Mem: 1.0G 54M 951M 0B 5.6M 27M -/+ buffers/cache: 21M 984M Swap: 0B 0B 0B # df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb3 3.9G 764M 3.1G 20% / dev 499M 0 499M 0% /dev run 503M 7.1M 496M 2% /run tmpfs 503M 0 503M 0% /dev/shm tmpfs 503M 0 503M 0% /sys/fs/cgroup tmpfs 503M 0 503M 0% /tmp /dev/sdb4 2.5G 3.8M 2.4G 1% /home /dev/sdb3 96M 39M 58M 41% /boot |
安装U盘拿掉后,这个U盘就成为 /dev/sdb 了。
配置有线网络。
没网络的时候,可以直接设定ip应急,后面 netctl 才是正规设置:
# ip addr add 192.168.0.100/24 dev enp0s4 # ip link set dev enp0s4 up # ip route add default via 192.168.0.1 # echo nameserver 208.67.222.222 >> /etc/resolv.conf
觉得设备名 enp0s4 不习惯,也可以在 udev 中改名(重启生效):
# cat /etc/udev/rules.d/10-network.rules SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:50:70:a2:49:7d", NAME="eth0"
如果使用 dhcd 动态分配地址:
# dhcpcd # 自动让 eth0 获取 IP # # 或者配置成服务自启动(更加方便) # systemctl enable dhcpcd@eth0 # systemctl start dhcpcd@eth0
如果使用静态地址,现在是用 netctl 进行管理:
# pacman -S ifplugd # systemctl disable dhcpcd@eth0 # systemctl stop dhcpcd@eth0 # 要停掉 DHCP,不然有干扰 # cd /etc/netctl # cp examples/ethernet-static home # vi home # 设置我的静态 IP 设置 profile # systemctl enable netctl # 重启一下,清除刚才的临时 IP 设置 # netctl start home # netctl enable home
如果要快速切换网络环境, 再在 /etc/netctl/ 下建立一个新的 profile 文件, 用 netctl switch-to PROFILE 来进行切换,会自动停掉旧的。 更详细的可以看 我以前写的 netctl 如何选择 profile 。
安装 vim,默认的 vi 实在是用不惯:
# pacman -S vim # pacman -R vi # ln -s /usr/bin/vim /usr/bin/vi
关闭 PC 小喇叭。
这个实在是太烦人了,在启动时就禁用:
# cat /etc/modprobe.d/nopcspkr.conf blacklist pcspkr
这个文件需要自己创建。
安装 ntp 自动更新时间
# pacman -S ntp libedit # systemctl enable ntpd # systemctl start ntpd
另外,Arch 建议在 /etc/ntp.conf 中添加 iburst 参数,比如:
server 0.pool.ntp.org iburst server 1.pool.ntp.org iburst server 2.pool.ntp.org iburst server 3.pool.ntp.org iburst
检查 ntpd 同步情况:
# systemctl restart ntpd # ntpq -np
时间同步完成后,用 hwclock -w 写入硬件时钟。
创建普通用户。
# useradd -m fwolf # passwd fwolf
通常,这个用户我们要赋予 sudo 权限:
# pacman -S sudo # cat /etc/sudoers.d/fwolf_sudo_conf Defaults env_reset Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" fwolf ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL # chmod 0440 /etc/sudoers.d/fwolf_sudo_conf
注意, /etc/sudoers.d/ 下的文件,名称带有 ~ 或者 . 的不会生效, 参见 CentOS – 0005017: The #includedir directive in sudoers does not work , 文件属性也必须是 0440 。
安装 Yaourt
在 /etc/pacman.conf 中添加:
[archlinuxfr] SigLevel = Never Server = http://repo.archlinux.fr/$arch
然后 pacman -Sy yaourt 完成安装。
安装其他常用工具
bash-completion ctags git htop openssh subversion tk
图形系统
由于U盘要带着到处跑,所以图形驱动一定是什么都有。 也不追求多么花哨的界面效果,简洁明快,所以选择 LXDE+Fluxbox 。
字符界面分辨率
默认进入字符界面后,分辨率是最大分辨率,如果要另行指定, 可以修改 /etc/default/grub :
GRUB_CMDLINE_LINUX_DEFAULT="quiet video-1024x768M@75m"
然后 grub-mkconfig -o /boot/grub/grub.cfg 重新生成 grub 配置文件。
默认点亮 Numlock
需要用到两个命令:系统自带的 setleds 和 通过 pacman 安装的 numlockx。
要在字符界面下打开 Numlock,可以在 $HOME/.bashrc 中添加:
# Numlock if [ -x /usr/bin/setleds ]; then for tty in /dev/tty{1..6}; do /usr/bin/setleds -D +num < /dev/tty > /dev/null 2>&1 done fi
这样设置会在登录之后自动打开 Numlock,若要登录之前就打开,可以参照 Arch Wiki 将上述内容添加到 /etc/rc.local 或者 /etc/inittab , 但不如跟着用户配置容易备份。
要在 X 下打开 Numlock,可以在 $HOME/.xinitrc 中添加:
# Set numlock if [ -x /usr/bin/numlockx ]; then /usr/bin/numlockx on fi
安装 xorg 和显卡驱动
- Xorg: xorg-server xorg-xinit xorg-server-utils mesa
- 显卡驱动:xf86-video-ati xf86-video-intel xf86-video-nouveau nouveau-dri
- 笔记本触摸板支持:xf86-input-synaptics
- 测试 X 工作是否正常:xorg-twm xorg-xclock xterm
现在可以用 startx 启动 X 看到简陋的图形界面了。 如果想用 Ctrl+Alt+Backspace 关闭 X,需要在 /etc/X11/xorg.conf.d/10-evdev.conf 中增加一段:
Section "InputClass" Identifier "Keyboard Defaults" MatchIsKeyboard "yes" Option "XkbOptions" "terminate:ctrl_alt_bksp" EndSection
安装 LXDE & Fluxbox
- LXDE 组的所有包
- Fluxbox
- 监测文件系统变化的 Gamin
- 常用软件:leafpad obconf epdfview
配置一个简单的 $HOME/.xinitrc ,从 /etc/skel/.xinitrc 复制一份, 然后添加:
#xrandr -s 1024x768 # 如果需要的话,提前指定分辨率 exec startlxde
现在都是液晶的天下,很少出现分辨率刷新率超出界限不显示的情况, 命令行下的分辨率可以用自动,嫌字小上面有修改 grub 设置的方法, 图形下 LXDE 也支持 auto 分辨率,一般也都自动设置好了。
为了把 Openbox 换成 Fluxbox,需要修改 /etc/xdg/lxsession/LXDE/desktop.conf :
[Session] window_manager=fluxbox
中文相关
基本字体 ttf-dejavu artwiz-fonts wqy-microhei
输入法 fcitx-im fcitx-configtool fcitx-fbterm ,在 $HOME/.xinitrc 里添加:
export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS="@im=fcitx"
字体配置,把原先用的其他常用字体和配置文件都搬过来了, 就是 $HOME/.fonts 目录,Ubuntu 下用的很好,这里也可以直接用。 把 $HOME/.fonts/fonts.conf 链接为 /etc/fonts/local.conf 即生效, 然后修改 /etc/fonts/conf.avail 下的 40-nonlatin.conf 和 60-latin.conf 将 SimSun 或者其他你喜欢的字体设置为首选字体, 最后 $ fc-cache -vf 更新下字体缓存,重启 X 就可以了。
至此,一个基本的、具备图形界面的 Arch Linux 就安装完成了, pacman -Scc 清理一下,已安装程序占用空间约 1.4G。 总体感觉,运行速度受U盘读写速度影响非常大,有时候会卡。
……大约反复两周后,经历了无数次的重装,我终于下了结论: U盘上的 Linux 系统除非只以只读方式使用,否则几乎没有可用性。 大概是因为重启、关机时,umount 总是等不及U盘的灯闪来闪去, 就强制重启或关机了,然后文件系统未正常 umount, 然后就是文件系统损坏,一修复都是文件丢失,损坏的 inode。 难道是因为我的U盘质量不好么? 不管怎样,拿这个做随身系统的想法破灭了, 还是磁介质的机械硬盘靠谱一点。
参考
- GPT fdisk Tutorial
- GPT gdisk partitioning overview
- 非UEFI,BIOS引导GPT磁盘,MacOS + Linux + (Hybrid-MBR+扩展分区+Windows)
- Linux 硬件迁移小测试 (评论中的 linux的两种 gpt 分区方案 说得间接明了,但搜不到原出处)
- Optimized Your SSD
- Q: Performance: mkfs.xfs -n size=64k option
- xfs文件系统优化
- XFS optimisation
- 优化 Ext4 分区格式化后占用空间
- 理解inode
- Installing Arch Linux on a USB key
- Converting to or from GPT
- Installing Arch Linux on USB drive (instability)
不跑GUI的话应该能好一点
还是搞个liveCD能应付临时使用就行了,我为了一个随身携带的,跑坏了一个移动硬盘,两个U盘,好几个SD卡,最终还是放弃了….
liveCD用安装光盘就差不多了。
我这主要是电脑不够用(硬件),主系统上装着 Windows 玩游戏,又懒得装双系统。
折腾的 geek