├── install ├── img │ ├── 03-mount.png │ ├── 04-rufus.png │ ├── 07-format.png │ ├── 01-download.png │ ├── 02-download-2.png │ ├── 05-dlsyslinux.png │ └── 06-hybridiso.png ├── old │ ├── Makefile │ └── install.tex ├── README.md ├── linux-install-internal.md ├── from-firmware-to-userspace.md ├── fs-partition.md └── install-archlinux.md ├── cmake.md ├── gpg └── README.md ├── rewrite.awk ├── desktop.rst ├── ffmpeg.org ├── cups_resetting.md ├── go_bootstrap.md ├── phpbb.rst ├── Chinese_fonts.md ├── caddy.md ├── v6routing.md ├── notes.org ├── alpm.org ├── LibreOffice_Templates.md └── wireguard.rst /install/img/03-mount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/03-mount.png -------------------------------------------------------------------------------- /install/img/04-rufus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/04-rufus.png -------------------------------------------------------------------------------- /install/img/07-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/07-format.png -------------------------------------------------------------------------------- /install/img/01-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/01-download.png -------------------------------------------------------------------------------- /install/img/02-download-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/02-download-2.png -------------------------------------------------------------------------------- /install/img/05-dlsyslinux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/05-dlsyslinux.png -------------------------------------------------------------------------------- /install/img/06-hybridiso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mytbk/Linux_Notes/HEAD/install/img/06-hybridiso.png -------------------------------------------------------------------------------- /install/old/Makefile: -------------------------------------------------------------------------------- 1 | install.pdf: install.tex 2 | xelatex install.tex 3 | xelatex install.tex 4 | 5 | view: install.pdf 6 | xdg-open install.pdf 7 | 8 | .PHONY: view 9 | -------------------------------------------------------------------------------- /cmake.md: -------------------------------------------------------------------------------- 1 | ## CMake 2 | 3 | - ``cmake-commands(7)`` ``cmake-qt(7)`` 等man page很有价值 4 | - add_definitions只对后面加入的目录生效,对前面加入的目录无效 5 | - 移动文件的同时要修改文件列表和include列表 6 | - add_library后要在其他目标添加链接库和链接依赖 7 | -------------------------------------------------------------------------------- /gpg/README.md: -------------------------------------------------------------------------------- 1 | ## GPG & Key Signing 2 | * [gpg2(1)常见使用方法](gpg2.md) 3 | * [Key Signing Party](key-signing.md) 4 | * [(链接)ISO 7816](http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816.aspx) 5 | * 6 | -------------------------------------------------------------------------------- /rewrite.awk: -------------------------------------------------------------------------------- 1 | # rewrite.awk: convert nginx rewrite rules to Caddyfile rewrite rules 2 | # awk -f rewrite.awk htaccess-nginx.txt 3 | /^rewrite / { 4 | t = gensub("\\\$([0-9])", "{\\1}", "g", $3) 5 | print "\trewrite {\n\t\tregexp " $2 "\n\t\tto " t "\n\t}\n" 6 | } 7 | -------------------------------------------------------------------------------- /desktop.rst: -------------------------------------------------------------------------------- 1 | 桌面设置小记 2 | ============ 3 | 4 | 前几天我给工作站装了个系统,记一下桌面设置。 5 | 6 | 我用的是 LXDE-GTK3,用 ``pacman -S lxde-gtk3`` 就行了,然后 ``systemctl enable lxdm`` 启用 LXDM. 7 | 8 | 可以安装 openbox-themes,这样在 look and feel 的设置里面就有很多窗口管理器主题可以选择。此外,look and feel 里面可以设置字体,对于高分屏用户很有帮助。 9 | 10 | 在主目录下写一个 ``$HOME/.xprofile``,把要在 X 启动时执行的命令写在里面,可以设置键盘布局和一些环境变量。 -------------------------------------------------------------------------------- /install/README.md: -------------------------------------------------------------------------------- 1 | ## Linux安装教程 2 | * [系统的启动过程:从固件到用户空间](from-firmware-to-userspace.md) 3 | * [安装Arch Linux:一步一步了解Linux系统](install-archlinux.md) ([补充:分区和文件系统](fs-partition.md)) 4 | * [Linux系统安装原理](linux-install-internal.md) 5 | 6 | ## Live USB制作教程 7 | * [如何制作Live USB](liveusb-howto.md) 8 | * [内核命令行和initramfs](kernel-cmdline-initramfs.md) 9 | * [案例学习:将openSUSE的安装镜像集成至Arch Linux的Live USB](opensuse-live.md) 10 | -------------------------------------------------------------------------------- /ffmpeg.org: -------------------------------------------------------------------------------- 1 | #+TITLE: FFMPEG 2 | 3 | * ffmpeg 4 | - concatenate video 5 | create a file list, like, 6 | #+BEGIN_SRC text 7 | file '1.flv' 8 | file '2.flv' 9 | #+END_SRC 10 | then run command 11 | #+BEGIN_SRC bash 12 | ffmpeg -f concat -i filelist.txt -vcodec copy -acodec copy out.flv 13 | #+END_SRC 14 | - extract annexb H.264 stream 15 | use =-vbsf h264_mp4toannexb= 16 | - [vaapi encoding](https://ffmpeg.org/pipermail/ffmpeg-user/2016-May/032153.html) 17 | -------------------------------------------------------------------------------- /cups_resetting.md: -------------------------------------------------------------------------------- 1 | Reset CUPS settings 2 | =================== 3 | 4 | I screw up my HP printer settings, and I can't print things anymore. 5 | 6 | If I use hp-setup to add the printer, it says there's already a print queue. I don't want to add a new print queue. I tried to reinstall cups and hplip. I also removed /etc/cups. However, these doesn't work. 7 | 8 | At last, I found cups store its spool files in /var/spool/cups. So I remove all the things in /var/spool/cups, and run hp-setup again. This time it worked! 9 | -------------------------------------------------------------------------------- /go_bootstrap.md: -------------------------------------------------------------------------------- 1 | Building Go 1.8 on CentOS 2 | ========================= 3 | 4 | I don't like third party binary packages, and I also want to bootstrap Go with only a C compiler. So here I'm going to build Go 1.8 without an existing Go compiler. 5 | 6 | First, clone the repository, and clone several copies as `go14`, `go16` and `go18`. 7 | 8 | Go 1.4 is the last Go distribution that is written in C, so build it first. 9 | 10 | Then use Go 1.4 to build Go 1.6, because I had problems building Go 1.8 with Go 1.4. 11 | 12 | At last, use Go 1.6 to Go 1.8. Remember to set the `GOROOT_FINAL` variable. 13 | -------------------------------------------------------------------------------- /phpbb.rst: -------------------------------------------------------------------------------- 1 | 搭建 phpBB 论坛 2 | =============== 3 | 4 | 安装 lighttpd, php, postgresql. 同时安装 php-pgsql 用于支持 php 连接 postgresql, 和 phpbb 需要的 php-xml:: 5 | 6 | apt install lighttpd php7.0-fpm postgresql php-pgsql php-xml 7 | 8 | 配置 lighttpd 的 fastcgi:: 9 | 10 | fastcgi.server = ( 11 | ".php" => (( 12 | "socket" => "/var/run/php/php7.0-fpm.sock" 13 | )) 14 | ) 15 | 16 | 默认 Debian 安装 postgresql 后使用 peer 认证,我们修改 pg_hba.conf 使用密码认证:: 17 | 18 | # /etc/postgresql/9.6/main/pg_hba.conf 19 | local all phpbb password 20 | 21 | 重启 lighttpd 和 postgresql 服务后,将 phpBB 的 zip 解包到网站目录下,然后安装即可。 -------------------------------------------------------------------------------- /install/linux-install-internal.md: -------------------------------------------------------------------------------- 1 | ## Linux系统的安装原理 2 | 让我们再来回顾一下[Arch Linux的安装](install-archlinux.md),接下来,我们再简单地看一下Debian和Gentoo的安装方法,最后总结一下Linux系统的安装原理。 3 | 4 | ### Debian和Gentoo的安装 5 | 我们开始安装Debian和Gentoo系统。为了实验的方便,我先在虚拟机上安装好一个现成的Arch Linux,/所在分区使用btrfs文件系统,从而可以利用btrfs的分卷机制方便地安装新的系统。 6 | 7 | #### 用debootstrap安装Debian 8 | 在PC上用Debian的安装盘安装Debian比较简单,因为安装盘中有图形界面的安装程序。在这里,我们来看看如何用debootstrap安装Debian.debootstrap是一个perl脚本,作用和Arch Linux安装盘上的pacstrap类似,可以从网络上下载软件包并构建一个文件系统。用debootstrap安装Debian是构建非x86平台(如ARM开发板,龙芯笔记本)的Debian系统的常用方式。为了方便,在这里我们在现有的Linux安装之上,在一个新的分区中安装Debian,然后用GRUB完成双系统的引导。 9 | 10 | #### 安装Gentoo 11 | Gentoo的安装也是类似的,接下来我们再建一个分区来安装Gentoo. 12 | 13 | ### Linux系统的安装原理: rootfs+chroot 14 | 从Arch,Debian,Gentoo的安装中,我们可以发现一些共同点: 15 | * 都构建了一个基本的文件系统(rootfs): Arch使用pacstrap,Debian使用debootstrap,Gentoo使用已经打好包的stage3 16 | * 使用一种叫chroot的手段,进入构建好的rootfs中进行root密码修改,以及进一步的软件安装等操作 17 | 18 | 因此,Linux系统的安装就是:**rootfs + chroot**. 19 | 20 | 熟悉了Linux系统的安装原理,相信你已经可以轻松的安装大多数的Linux发行版,跟着手册安装LFS(Linux From Scratch)和CLFS(Cross LFS)也不成问题。同时,也可以根据Linux的结构,修复一些Linux的问题。 21 | -------------------------------------------------------------------------------- /Chinese_fonts.md: -------------------------------------------------------------------------------- 1 | 自由中文字体 2 | ============ 3 | 4 | [DebianHK](http://wiki.debian.org.hk/w/Fonts)有一页关于字体的wiki. 5 | 6 | 文鼎字体 7 | -------- 8 | 9 | 来自[文鼎科技(Arphic Technology)](http://www.arphic.com.tw/)的中文字体。 10 | 11 | 常见软件包名为opendesktop-fonts,其主页([链接](http://www.opendesktop.org.tw/))已失效。 12 | 13 | 现在文鼎科技主页还提供了[字体下载](http://www.arphic.com.tw/zh-tw/support/index#download/4),但不知道是不是自由的文鼎字体。 14 | 15 | 文泉驿 16 | ------ 17 | 18 | 来自[文泉驿中文计划](http://wenq.org),授权许可为GPL.共有3套字体: 19 | 20 | - 文泉驿正黑(Zen Hei) 21 | - 文泉驿微米黑(Micro Hei) 22 | - 文泉驿细线版微米黑(Micro Hei Lite) 23 | 24 | Droid fonts 25 | ----------- 26 | 27 | [Droid fonts](http://www.droidfonts.com/)由Ascender Corporation的Steve Matteson设计。[部分字体以Apache License发布,其他字体则是私有的。][for-devel]在Wikipedia上可以找到[Github链接](https://github.com/android/platform_frameworks_base/tree/master/data/fonts)。 28 | 29 | 只有Droid Sans Fallback支持中文。 30 | 31 | [for-devel]: http://www.droidfonts.com/droidfonts/customversions/ 32 | 33 | Adobe Source Han Sans 34 | --------------------- 35 | 36 | Adobe发布的一套CJK字体,Apache授权,[源码可见Github.](https://github.com/adobe-fonts/source-han-sans) 37 | 38 | -------------------------------------------------------------------------------- /caddy.md: -------------------------------------------------------------------------------- 1 | 手动编译 Caddy 2 | ============== 3 | 4 | 从 Caddy 0.10.4 开始,Caddy 终于把它的依赖包打进来了,因此不再需要 go get 了。 5 | 6 | 从 go help gopath 可以看出,程序源码树下的 vendor 目录是可以指导 go 的 import 的,于是在源码根目录下编译,就可以用上 vendor 目录下的源码了。 7 | 8 | 首先,我们建立一个临时的 GOPATH,并且把 Caddy 的路径也建立起来: 9 | 10 | mkdir -p /tmp/go/src/github.com/mholt 11 | cd /tmp/go/src/github.com/mholt 12 | 13 | 把 Caddy 的源码包解到这个目录下: 14 | 15 | tar xvf /tmp/caddy-0.10.5.tar.gz 16 | mv caddy-0.10.5 caddy 17 | cd caddy 18 | 19 | 然后编译主程序 caddy/main.go: 20 | 21 | GOPATH=/tmp/go go build -v caddy/main.go 22 | 23 | 最后编译出一个 main 程序,编译成功。 24 | 25 | 26 | 添加 caddy-cgi 插件 27 | ------------------- 28 | 29 | Caddy 有用于支持 CGI 的插件 github.com/jung-kurt/caddy-cgi. 30 | 31 | 首先下载 caddy-cgi 的源码 https://github.com/jung-kurt/caddy-cgi/archive/v1.4.tar.gz,然后还是创建 caddy-cgi 的路径,再解包: 32 | 33 | mkdir -p /tmp/go/src/github.com/jung-kirt 34 | cd /tmp/go/src/github.com/jung-kirt 35 | tar xvf /tmp/v1.4.tar.gz 36 | mv caddy-cgi-1.4 caddy-cgi 37 | 38 | 编辑 Caddy 源码中的 caddy/caddymain/run.go,在 import 列表的末尾添加 ``_ github.com/jung-kurt/caddy-cgi``. AUR 上面 caddy 这个包的做法是用一个小程序自动生成添加了 import 之后的文件。 39 | 40 | 之后编译,可以按照上面的方法指定 main.go. 也可以按照 AUR 的做法,编译 github.com/mholt/caddy/caddy 这个 package. 41 | -------------------------------------------------------------------------------- /v6routing.md: -------------------------------------------------------------------------------- 1 | ### 用hostapd,dnsmasq,ndppd建立IPv6路由 2 | 3 | 首先配置hostapd开热点,这个很简单,就不谈了。 4 | 5 | #### dnsmasq 6 | 7 | dnsmasq建立IPv4内网很简单: 8 | 9 | ``` 10 | dhcp-range=192.168.0.50,192.168.0.150,12h 11 | ``` 12 | 13 | 并给wlp1s0分配地址192.168.0.1/24 14 | 15 | 对于IPv6,也用DHCP,并且广播: 16 | ``` 17 | dhcp-range=2001:da8:201:1233:1::2, 2001:da8:201:1233:1::500, 80, 12h 18 | enable-ra 19 | ``` 20 | 21 | 注意让dnsmasq只监听wifi端,否则会通过有线网发广播... 22 | ``` 23 | interface=wlp1s0 24 | ``` 25 | 26 | 同样给wlp1s0分配地址2001:da8:201:1233:1::1/80 27 | 28 | #### ndppd 29 | 当内网的机器通过DHCPv6获得IPv6地址后,就可以访问网关了,但外网的机器要访问内网机器时,要让网关转发数据包,于是需要邻居发现协议。 30 | ``` 31 | # 假设内网机器IPv6地址为2001:da8:201:1233:1::32c 32 | ip -6 neigh add proxy 2001:da8:201:1233:1::32c dev enp0s25 33 | ``` 34 | 手工添加太麻烦,因此需要用ndppd. 35 | ``` 36 | # /etc/ndppd.conf 37 | proxy enp0s25 { 38 | rule 2001:da8:201:1233:1::/80 { 39 | } 40 | } 41 | ``` 42 | 43 | ### 内核配置 44 | ``` 45 | sysctl net.ipv4.conf.all.forwarding=1 46 | sysctl net.ipv6.conf.all.forwarding=1 47 | sysctl net.ipv6.conf.all.proxy_ndp=1 48 | 49 | iptables -t nat -A POSTROUTING -o enp0s25 -j MASQUERADE 50 | ip6tables -A INPUT -p ipv6-icmp -j ACCEPT 51 | ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT 52 | ip6tables -A FORWARD -p ipv6-icmp -j ACCEPT 53 | ``` 54 | -------------------------------------------------------------------------------- /notes.org: -------------------------------------------------------------------------------- 1 | #+TITLE: Linux Notes 2 | 3 | * bash 4 | - http://www.tldp.org/LDP/abs/html/string-manipulation.html 5 | - get a substring: ${VAR:pos:length} 6 | - remove from left/right: ${VAR#substring} ${VAR%substring} 7 | 8 | * git 9 | - squash commits: git rebase -i HEAD~n 10 | - git server 11 | - on remote machine: 12 | #+BEGIN_SRC 13 | mkdir /path/to/project 14 | #+END_SRC 15 | - on local machine: 16 | #+BEGIN_SRC bash 17 | git remote add ssh://user@host:port/path/to/project 18 | #+END_SRC 19 | 20 | * gdb 21 | - remote debugging 22 | in gdb, `target remote host:port' 23 | 24 | * keyboard layout 25 | - setxkbmap 26 | - xorg.conf 27 | - tty: loadkeys 28 | #+BEGIN_SRC bash 29 | loadkeys colemak 30 | loadkeys qwerty/us 31 | #+END_SRC 32 | - use localectl from systemd 33 | 34 | * networking 35 | - dnscrypt 36 | - dnsmasq 37 | 38 | * system 39 | ** systemd 40 | ** acpi 41 | - systemd-logind: =/etc/systemd/logind.conf= 42 | simple 43 | - acpid 44 | more configurable 45 | - example: only suspend when using battery on lid-close 46 | #+BEGIN_SRC bash 47 | button/lid) 48 | case "$3" in 49 | close) 50 | logger 'LID closed' 51 | if grep 0 /sys/class/power_supply/AC/online; then 52 | systemctl suspend 53 | fi 54 | ;; 55 | #+END_SRC 56 | ** udev 57 | - usb power saving, except usb keyboard 58 | #+BEGIN_SRC text 59 | ACTION=="add", SUBSYSTEM=="usb", ATTR{product}=="*Key*", ATTR{power/control}="on" 60 | #+END_SRC 61 | -------------------------------------------------------------------------------- /install/from-firmware-to-userspace.md: -------------------------------------------------------------------------------- 1 | ## 系统的启动过程:从固件到用户空间 2 | 3 | 在安装系统之前,我们先学习一下系统是怎么启动的。 4 | 5 | ``` 6 | $ systemd-analyze 7 | Startup finished in 3.222s (firmware) + 6.642s (loader) + 2.101s (kernel) + 1.734s (userspace) = 13.700s 8 | ``` 9 | 10 | 以上是在一台机器上执行`systemd-analyze`的输出,它分析了系统启动所占用的时间。可以看出,系统的启动分为4个部分,固件(firmware),引导加载器(bootloader),内核(kernel),用户空间(userspace).我们就把从机器上电开机开始的4个过程一个一个地描述出来。 11 | 12 | ### 固件(firmware) 13 | 计算机启动后,首先会从ROM中执行一段程序,这段程序就是固件。固件的作用是完成硬件的初始化和检测,提供访问硬件的接口,最后加载引导加载器或者操作系统内核。 14 | 15 | 我们在这里主要讨论固件是怎么引导系统的。不同的固件用不同的方式引导系统,x86平台上常用的固件有BIOS和UEFI. 16 | 17 | #### BIOS(basic input/output system) 18 | BIOS起源于IBM PC,并一直沿用到现在。BIOS引导系统的过程如下: 19 | 20 | 1. 读取引导设备(硬盘,软盘,U盘等)的第一个扇区到内存的指定地址0000:7C00. 21 | 22 | 2. 检查这个扇区的最后两个字节是否为0x55 0xaa(小端表示为0xaa55),如果是,则进行下一步,否则回到第1步。 23 | 24 | 3. 跳转到0000:7c00执行引导代码。 25 | 26 | #### UEFI(Unified Extensible Firmware Interface) 27 | [UEFI](http://www.uefi.org/)是Intel提出的固件结构,起初用于Intel的IA64平台,后来移植到了x86和x86_64平台,同时也有ARM设备使用UEFI. 28 | 29 | UEFI规范中指定了UEFI固件的结构,编程规范,也规定了引导系统的方式。UEFI固件引导系统的过程如下: 30 | 31 | 1. 读取启动设备的EFI系统分区(一般是第一个分区,使用FAT32文件系统),寻找启动文件(默认为efi/boot/bootx64.efi). 32 | 33 | 2. 执行启动文件,完成引导。 34 | 35 | 36 | ### 引导加载器(bootloader) 37 | 有了固件标准之后,程序员根据固件引导系统的方式,写了相应的能被固件使用的引导加载器。引导加载器的作用是加载并启动操作系统的内核。操作系统的类型很多,内核的启动也有很多参数,引导加载器可以根据用户的配置,使用合适的参数启动内核。很多引导加载器有多系统引导,命令行界面等功能。 38 | 39 | 用于引导Linux的常用引导加载器有GRUB,syslinux等。 40 | 41 | 42 | ### 内核(kernel) 43 | 内核是操作系统的核心部件,向下管理硬件资源,向上为应用程序提供服务。Linux是一个内核,它实现了内存管理,进程调度等操作系统的基本功能,还包含了很多硬件驱动程序。Linux内核进行了一系列的初始化操作之后,会启动第一个进程,称为init. 44 | 45 | 46 | ### 用户空间(userspace) 47 | init进程的作用是启动其他进程,从而操作系统就启动了很多的应用程序,包括图形界面,网络服务等。默认情况下,Linux启动/sbin/init作为init进程,但可以通过修改内核的init参数选择其他的init程序。常用的init程序有sysvinit,systemd,busybox init等。 48 | -------------------------------------------------------------------------------- /install/fs-partition.md: -------------------------------------------------------------------------------- 1 | ## 分区与文件系统 2 | 3 | 我们来了解一些文件系统的基本概念,从而能更好地认识我们使用的操作系统。 4 | 5 | ### 文件系统 6 | 数据存放在存储介质(如硬盘)上,在没有任何数据结构的组织下,我们依然可以直接在硬盘上读写数据,但是这样做很不方便,因此我们才需要文件系统。 7 | 8 | 文件系统的一个组成部分是文件,它是对磁盘的一个抽象。文件系统把存放了数据的文件按照一定的方式组织起来,这样用户就可以很方便的通过文本形式的路径和文件名访问一个文件。 9 | 10 | ### 分区和分区表 11 | 为了更好地组织数据,我们需要对磁盘进行分区,这样可以把功能相近的文件集中放置,便于管理。 12 | 13 | 有了分区之后,自然就需要一个数据结构存放分区信息,如分区的起始位置和终止位置(或分区大小),还有更多的信息如分区类型,这个就是分区表。在Linux下可以使用`fdisk`查看一块磁盘的分区表中存放的信息,如: 14 | 15 | > ``` 16 | > $ LANG= sudo fdisk -l /dev/sda 17 | > Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors 18 | > Units: sectors of 1 * 512 = 512 bytes 19 | > Sector size (logical/physical): 512 bytes / 512 bytes 20 | > I/O size (minimum/optimal): 512 bytes / 512 bytes 21 | > Disklabel type: gpt 22 | > Disk identifier: C26BA9CA-4A2B-48EB-8382-1863F4A6E0AB 23 | > 24 | > Device Start End Sectors Size Type 25 | > /dev/sda1 2048 616447 614400 300M Windows recovery environment 26 | > /dev/sda2 616448 821247 204800 100M EFI System 27 | > /dev/sda3 821248 1083391 262144 128M Microsoft reserved 28 | > /dev/sda4 1083392 122882047 121798656 58.1G Microsoft basic data 29 | > /dev/sda5 122882048 250069646 127187599 60.7G Linux filesystem 30 | > ``` 31 | 32 | 以上所展现的分区表显示了/dev/sda所指的这块磁盘有5个分区,每个分区的起始扇区,终止扇区和分区类型如表所示。 33 | 34 | 分区表可以用不同的方式存放在磁盘上,常见的有MBR和GPT两种分区方案。 35 | 36 | #### MBR分区表 37 | MBR分区表,或者叫DOS分区表,是最早用于IBM PC的经典分区表方案。BIOS启动系统的时候要读取磁盘的第一个扇区并执行这个扇区的代码,一个扇区有512字节,其中前440字节放置启动代码,6字节放置MBR标志,末两字节放置启动标志,剩下还有64字节可以放下4个16字节长的分区表条目。 38 | 39 | 于是,MBR分区方案最多可以放下4个分区。那么,如果要想有更多的分区,就要把其中的一个分区变成扩展分区,在这个扩展分区中再放一个分区表,这样就可以拥有更多的分区了。这样,MBR分区方案从结构上看,有主分区和扩展分区两种类型,主分区中直接存放分区内容,扩展分区中存放的是更多的分区,扩展分区内的分区称为逻辑分区。 40 | 41 | #### GUID分区表(GPT) 42 | 在MBR分区方案中,由于只有64字节可以存放分区信息,只能支持4个主分区,要依靠扩展分区来增加分区个数。此外,每个分区表条目中都用4个字节记录分区的起始扇区和终止扇区,于是最大只支持2^32扇区*512B/扇区=2TB大小。GPT使用更大的空间存放分区信息,解决了这些问题,并且还使用了一些设计方案,增强了稳定性。 43 | 44 | 关于GPT的结构及特点,可以参考[ArchWiki](https://wiki.archlinux.org/index.php/GUID_Partition_Table#About_the_GUID_Partition_Table). 45 | 46 | ### 常见Linux文件系统类型 47 | 分区要通过一定的方式组织文件,于是有很多文件系统类型,以下列出一些常见的Linux文件系统类型,做一些简单的介绍。 48 | * ext2: Linux最早的实用文件系统,非常稳定,使用典型的Unix文件系统结构。 49 | * ext3: 在ext2的基础上加入日志功能,现已被废弃,建议使用ext4. 50 | * ext4: 对ext3的改进,有更好的设计,更好的性能和稳定性。内核的ext4驱动包含对ext2和ext3的支持。 51 | * btrfs: 面向未来的文件系统,提供分区分卷,快照,压缩等高级功能。 52 | * xfs: 早期为IRIX操作系统设计的文件系统,后被移植至Linux.主要针对大文件优化。 53 | * f2fs: 三星针对NAND闪存设计的文件系统。 54 | 55 | ### 挂载 56 | -------------------------------------------------------------------------------- /alpm.org: -------------------------------------------------------------------------------- 1 | # ArchLinux Package Management 2 | 3 | 4 | * Package Management 5 | ** Build and install from source 6 | #+begin_src text 7 | ./configure 8 | make 9 | as-root make install 10 | #+end_src 11 | ** How to manage packages 12 | *** All in My Hand 13 | *** Install in separate Directories 14 | *** Symlink Style 15 | #+begin_src text 16 | ./configure --prefix=/usr 17 | make 18 | make DESTDIR=/usr/pkg/libfoo/1.1 install 19 | #+end_src 20 | *** Timestamp Based 21 | *** Tracing installation script 22 | *** Package archives 23 | + RPM, apt, Portage 24 | + tar based system 25 | *** User based 26 | 27 | * PKGBUILD, makepkg 28 | ** PKGBUILD 29 | A bash script that describes the package information 30 | and the way to build it. 31 | *** variables 32 | pkgname, pkgver, depends, provides, conflicts 33 | *** functions 34 | pkgver(), prepare(), build(), package() 35 | *** installation script 36 | ** makepkg 37 | Make an Arch package. 38 | ** mkaurball 39 | + From community/pkgbuild-introspection 40 | + Make AUR tarball 41 | 42 | * pacman 43 | ** File system based package management 44 | *** =/var/lib/pacman/sync/= 45 | repository files, all tarballs 46 | *** =/var/lib/pacman/local/= 47 | + packages installed 48 | + All info in =/var/lib/pacman/local/$pkgname-$pkgver/= 49 | **** desc 50 | Package description 51 | **** files 52 | Files belong to the packages 53 | **** mtree 54 | + Begin in pacman-4.1.1 55 | + A feature from libarchive 56 | + help to check the integrity of a package 57 | + Generate mtree: =bsdtar -cf MTREE --format=mtree --options=all *= 58 | ** Install and update packages: =pacman -S= 59 | Issue =pacman -S /= to install a package, 60 | or a group of packages. 61 | *** Sync repositories: =pacman -Sy= 62 | Use =pacman -Syy= for force sync repositories. 63 | *** Update all packages: =pacman -Su= 64 | + The most notable command: =pacman -Syu= 65 | + -uu option to force sync a package (to an old one) 66 | *** Search: =pacman -Ss= 67 | *** Detailed information: =pacman -Si= 68 | ** Install a local package: =pacman -U= 69 | Note that pacman has a cache directory =/var/cache/pacman/pkg/= 70 | ** Query packages installed: =pacman -Q= 71 | + Detailed information: =pacman -Qi= 72 | + Only show package name (ignore version): =pacman -Qq= 73 | *** Search packages installed: =pacman -Qs= 74 | *** List files owned by a package: =pacman -Ql= 75 | *** Check integrity: =pacman -Qk= 76 | + And =pacman -Qkk= for a deep check 77 | ** Remove packages: =pacman -R= 78 | + =pacman -Rc =: remove and packages depend on them 79 | + =pacman -Rs =: remove and packages they depend on 80 | + often use =pacman -Rcs = 81 | ** Packages not from repositories: =pacman -Qm= 82 | * pacman utilities 83 | Useful tools about Arch packages, some merged from pacman-contrib. 84 | + bacman: backup installed packages 85 | + pacdiff: deal with pacsave and pacnew files 86 | + pactree: list dependency tree of a package 87 | + extra/pkgfile: find the packages a certain file belongs to 88 | * AUR/yaourt 89 | ** AUR: Arch user repository 90 | ** yaourt: yet another user repository tool 91 | A good wrapper for pacman 92 | * Create repos using repo-add 93 | * Configurations 94 | ** pacman.conf 95 | + Configure pacman, add repositories, etc. 96 | ** makepkg.conf 97 | + Set CFLAGS,CXXFLAGS, etc. 98 | + Use ccache,distcc to build packages 99 | 100 | * Open Build Service 101 | - From Novell 102 | - Support a lot of distributions 103 | -------------------------------------------------------------------------------- /LibreOffice_Templates.md: -------------------------------------------------------------------------------- 1 | About LibreOffice Templates 2 | =========================== 3 | 4 | I try to look into LibreOffice Templates by reading the XML in ODT files, and I've found something interesting. 5 | 6 | I'm using the files in *Designing with LibreOffice* as example, because I'm doing the translation of this book. 7 | 8 | Can a template with same name link to the document? 9 | --------------------------------------------------- 10 | 11 | I've modified the ``designing-with-libreoffice.ott`` file to change the fonts in styles for Chinese. Then I import this template. However, although sometimes Writer will tell me to update the styles when I open a document in the book, very often Writer fails to inform me to update the styles. 12 | 13 | So I try to analyze these documents. I've converted the documents to *.fodt* files, so that I can read the XML directly. I can see something like: 14 | 15 | ``` 16 | 17 | ``` 18 | 19 | So there's a path to the template in it. That's why Writer doesn't always want to update the styles of a document link to a registered template. After I put this document to a level 3 directory relative to **$HOME**, e.g. **~/Documents/DWL/zh**, the auto-update will work, otherwise, for a path with other levels like **~/DWL/zh**, it fails to work. 20 | 21 | How style auto-update work 22 | -------------------------- 23 | 24 | There's such an XML line in the fodt file. 25 | 26 | ``` 27 | 28 | ``` 29 | 30 | If you choose to keep the styles when opening a document linking to a template, and save the document, this line will change to ``auto-update="false"``. 31 | 32 | In ODT files 33 | ------------ 34 | 35 | For ODT files, they are zipped documents with meta data. For example, I create a /tmp/test.odt with designing-with-libreoffice template, then unzip it. 36 | 37 | ``` 38 | Archive: ../test.odt 39 | extracting: mimetype 40 | extracting: Thumbnails/thumbnail.png 41 | inflating: content.xml 42 | extracting: Pictures/100002010000038400000546A82961F87F74FC58.png 43 | extracting: Pictures/1000000000000029000000280D79344E3C86B807.png 44 | extracting: Pictures/100000000000002700000026E7BA59C467F90D6A.png 45 | extracting: Pictures/100002000000000A0000000A35016327E26F24F4.gif 46 | extracting: Pictures/100000000000013000000123B3627CCB3F870366.png 47 | extracting: Pictures/100000000000014C0000012CA8954B407D4415E6.png 48 | extracting: Pictures/100000000000010D000000FF60A0AAE0E228F8E2.png 49 | inflating: meta.xml 50 | inflating: settings.xml 51 | creating: Configurations2/menubar/ 52 | creating: Configurations2/floater/ 53 | creating: Configurations2/images/Bitmaps/ 54 | creating: Configurations2/popupmenu/ 55 | creating: Configurations2/statusbar/ 56 | creating: Configurations2/toolpanel/ 57 | creating: Configurations2/progressbar/ 58 | creating: Configurations2/toolbar/ 59 | inflating: Configurations2/accelerator/current.xml 60 | inflating: manifest.rdf 61 | inflating: META-INF/manifest.xml 62 | inflating: styles.xml 63 | ``` 64 | 65 | The auto-update setting is in styles.xml. 66 | 67 | For template, it's stored in meta.xml. However, there's a little strange with the path. 68 | 69 | ``` 70 | xlink:href="../../home//.config/libreoffice/4/user/template/designing-with-libreoffice.ott" 71 | ``` 72 | 73 | While the file is located in /tmp, there are two *../* in ``xlink:href`` instead of one. If you create an ODT file, you'll see one more *../* in xlink:href than the actual path. That's a difference between ODT and flat ODT. I don't know the exact reason yet. 74 | -------------------------------------------------------------------------------- /wireguard.rst: -------------------------------------------------------------------------------- 1 | 在 Arch, Devuan, LEDE 上使用 WireGuard 2 | ========================================= 3 | 4 | 由于我的实验室内网只能访问国内地址,同时我还有安全上网的需求,因此我在社团服务器上部署了 VPN 用于在实验室内网访问国外网站,同时在我的 VPS 上也部署了 VPN 用于安全上网。 5 | 6 | 此前我用的是 OpenVPN. 但是它配置麻烦,用 easy-rsa 生成密钥的操作也十分繁琐。此外,OpenVPN 已经被安全研究人员进行了流量分析研究,因此用 OpenVPN 进行安全上网还很容易被切断连接。此前我还试用过 tinc,配置简单一些,但是却有一些奇怪的问题让我没法用它安全上网,最后就没再使用。 7 | 8 | `WireGuard `_ 是 2017 年兴起的一个 VPN 软件,它在 Linux 内核的基础上构建,直接使用 Linux 内核中的网络功能,可以用 iproute2 等工具对 VPN 的网络接口进行操作。它使用 Curve25519, ChaCha20-Poly1305, BLAKE2 等先进而高效的密码学算法,安全性好,CPU 要求低。此外,它也提供预共享密钥的设置以抵抗量子计算机的攻击。 9 | 10 | WireGuard 提供 wg(8) 工具以配置 WireGuard 网络接口,此外还提供了 wg-quick(8) 脚本来实现设置 IP 地址,设置路由表等功能。 11 | 12 | 以下是我在不同系统下配置 WireGuard 的方法。 13 | 14 | 15 | 密钥生成 16 | -------- 17 | 18 | 要使用 WireGuard,首先要知道怎样生成密钥。 19 | 20 | - 私钥和公钥:每个机器上都要有一个密钥对,用 ``wg genkey`` 可以直接生成一个私钥,然后用 ``echo | wg pubkey`` 从私钥计算出公钥。在 WireGuard 的配置文件中,私钥填在 ``[Interface]`` 节的 ``PrivateKey`` 字段中,公钥填在对应端 ``[Peer]`` 节的 ``PublicKey`` 字段中。 21 | - 预共享密钥:预共享密钥是个可选项。用 ``wg genpsk`` 可以生成预共享密钥。预共享密钥为两端共享,要填在 ``[Peer]`` 节的 ``PresharedKey`` 字段中。 22 | 23 | 24 | Arch 25 | ---- 26 | 27 | 我的 VPS 安装的是 Arch. 在 Arch 上安装 WireGuard, 直接安装 ``wireguard-dkms`` 和 ``wireguard-tools`` 即可。VPS 只用于安全上网,只作为 WireGuard 服务端使用。 28 | 29 | 配置文件 ``/etc/wireguard/wg0.conf`` 如下(本文中的配置文件将敏感信息全部改为 ```` ):: 30 | 31 | [Interface] 32 | PrivateKey = 33 | ListenPort = 13394 34 | Address = 192.168.243.1/24 35 | 36 | [Peer] 37 | PublicKey = 38 | PresharedKey = 39 | AllowedIPs = 192.168.243.0/24 40 | 41 | 这里我用 UDP 端口 13394 (WireGuard 只用 UDP),服务端 IP 地址为 192.168.243.1,接受所有来自 192.168.243.0/24 的连接。 42 | 43 | 然后用 ``systemctl enable wg-quick@wg0`` 和 ``systemctl start wg-quick@wg0`` 设置系统启动时启动 WireGuard,之后启动 WireGuard. 44 | 45 | Devuan 46 | ------ 47 | 48 | 由于新版本 Debian 默认使用 systemd,所以我们社团的一位大佬让社团服务器改用 Devuan,最近我把 Devuan 升级到了 testing 版本 Ascii. 49 | 50 | Devuan Ascii 官方源没有 WireGuard,因此我下源码,按官网的教程安装,过程很简单,在这里就省略。 51 | 52 | 由于 Devuan 不用 systemd,WireGuard 源码包没有 sysvinit 的模板,所以我就用 OpenVPN 的改了一个,然后用 ``update-rc.d`` 让它在系统启动时启动:: 53 | 54 | #!/bin/sh -e 55 | 56 | ### BEGIN INIT INFO 57 | # Provides: wireguard 58 | # Required-Start: $network $remote_fs $syslog 59 | # Required-Stop: $network $remote_fs $syslog 60 | # Should-Start: network-manager 61 | # Should-Stop: network-manager 62 | # X-Start-Before: $x-display-manager gdm kdm xdm wdm ldm sdm nodm 63 | # X-Interactive: true 64 | # Default-Start: 2 3 4 5 65 | # Default-Stop: 0 1 6 66 | # Short-Description: WireGuard VPN service 67 | # Description: This script will start WireGuard tunnels as specified 68 | # in /etc/wireguard/*.conf 69 | ### END INIT INFO 70 | 71 | . /lib/lsb/init-functions 72 | 73 | test $DEBIAN_SCRIPT_DEBUG && set -v -x 74 | 75 | WGQUICK=/usr/bin/wg-quick 76 | DESC="WireGuard virtual private network daemon" 77 | CONFIG_DIR=/etc/wireguard 78 | test -x $WGQUICK || exit 0 79 | test -d $CONFIG_DIR || exit 0 80 | 81 | case "$1" in 82 | start) 83 | log_daemon_msg "Starting $DESC" 84 | 85 | for wg in $CONFIG_DIR/*.conf 86 | do 87 | $WGQUICK up `basename $wg .conf` 88 | done 89 | ;; 90 | stop) 91 | log_daemon_msg "Stopping $DESC" 92 | 93 | for wg in $CONFIG\_DIR/*.conf 94 | do 95 | $WGQUICK down `basename $wg .conf` 96 | done 97 | ;; 98 | *) 99 | echo "Usage: $0 {start|stop|reload|restart|force-reload|cond-restart|soft-restart|status}" >&2 100 | exit 1 101 | ;; 102 | esac 103 | 104 | exit 0 105 | 106 | # vim:set ai sts=2 sw=2 tw=0: 107 | 108 | 这个机器要连接我的 VPS 做客户端用于安全上网,也要作为服务端让我用这个机器做路由上国外网站。首先是我连接 VPS 的配置文件 ``/etc/wireguard/wg-vps.conf``:: 109 | 110 | [Interface] 111 | Address = 192.168.243.2/24 112 | PrivateKey = 113 | 114 | [Peer] 115 | PublicKey = 116 | PresharedKey = 117 | Endpoint = []:13394 118 | AllowedIPs = 192.168.243.0/24 119 | AllowedIPs = 8.0.0.0/8, 52.0.0.0/8, 74.125.0.0/16, 173.194.0.0/16, 172.217.0.0/16 120 | AllowedIPs = 207.0.0.0/8, 216.56.0.0/14, 104.0.0.0/8, 199.59.0.0/16 121 | 122 | 我把这个机器的 IP 设为 192.168.243.2, ``AllowedIPs`` 里面除了 VPS 那端的 IP 外,还加入了我要连接的各个墙外网站的 IP,因为那些网站的流量也会发往 WireGuard 接口,因此要加入 ``AllowedIPs`` 的列表里面。 123 | 124 | 这个机器也要作为 WireGuard 的服务端,和 Arch 上配置 WireGuard 服务端类似,我使用 69 端口:: 125 | 126 | [Interface] 127 | Address = 192.168.189.1/24 128 | PrivateKey = 129 | ListenPort = 69 130 | 131 | [Peer] 132 | PublicKey = 133 | PresharedKey = 134 | AllowedIPs = 192.168.189.0/24 135 | 136 | 137 | LEDE 138 | ---- 139 | 140 | `LEDE `_ 是一个基于 OpenWrt 的用于路由器等嵌入式设备的操作系统。要在 LEDE 中使用 WireGuard,需要安装 wireguard 和 wireguard-tools. 141 | 142 | `LEDE的wiki中介绍了如何配置WireGuard. `_ 我在LEDE上的 ``/etc/config/network`` 的 WireGuard 部分配置如下(此处省略了很多 ``allowed_ips`` ):: 143 | 144 | config interface 'vpn' 145 | option proto 'wireguard' 146 | list addresses '192.168.189.2/24' 147 | option private_key '' 148 | 149 | config wireguard_vpn 150 | option public_key '' 151 | option preshared_key '' 152 | option endpoint_host '' 153 | option endpoint_port '69' 154 | option persistent_keepalive '60' 155 | list allowed_ips '192.168.189.0/24' 156 | list allowed_ips '162.105.129.65/32' 157 | # 0.x.x.x to 95.x.x.x 158 | list allowed_ips '0.0.0.0/2' 159 | list allowed_ips '64.0.0.0/3' 160 | option route_allowed_ips '1' 161 | 162 | 首先 ``interface`` 部分的写法和OpenWrt/LEDE里面其他网络接口的写法一样, ``proto`` 要设为 ``wireguard`` ,接下来是针对 peer 的配置,和 wg(8) 所读取的ini格式的配置文件类似,填上公钥、预共享密钥、 ``allowed_ips`` 等信息就行了,最后设置 ``route_allowed_ips`` 选项用于设置路由表。 163 | -------------------------------------------------------------------------------- /install/old/install.tex: -------------------------------------------------------------------------------- 1 | \documentclass{beamer} 2 | \usepackage[adobefonts,UTF8]{ctexcap} 3 | \usepackage{stmaryrd} 4 | \usepackage{amsmath} 5 | %\usepackage{multicol} 6 | 7 | \title{Linux Install Party} 8 | %\author{} 9 | %\date{\today} 10 | \begin{document} 11 | 12 | \begin{frame} 13 | \titlepage 14 | \end{frame} 15 | \begin{frame} 16 | %\begin{multicols}{2} 17 | \tableofcontents[part=1] 18 | %\end{multicols} 19 | \end{frame} 20 | 21 | \begin{frame} 22 | \tableofcontents[part=2] 23 | \end{frame} 24 | 25 | \part{1} 26 | \section{准备工作} 27 | \begin{frame}{如何获取Linux} 28 | 各Linux发行版的安装镜像都能在网上找到。为了便于发行,很多发行版在世界各地都有镜像源,镜像源中包含了该发行版的软件包和安装镜像。 29 | 在教育网中,建议从镜像源下载Linux的安装镜像,常见的镜像源有: 30 | \begin{itemize} 31 | \item \url{http://mirrors.tuna.tsinghua.edu.cn} 32 | \item \url{http://mirrors.ustc.edu.cn} 33 | \item \url{http://mirrors.163.com} 34 | \end{itemize} 35 | \end{frame} 36 | 37 | \begin{frame}{单系统,多系统,还是虚拟机?} 38 | \begin{itemize} 39 | \item 几乎所有能用计算机做的工作都可以在Linux下完成,因此,如果没特殊需求,可以直接用Linux单系统。 40 | \item 不过还是有不少人选择保留原有的系统(Windows,Mac,不同的Linux发行版),这时可以让多系统共存。 41 | \item 使用虚拟机,可以让用户同时使用多个系统。可以在Linux下用虚拟机安装其他系统, 42 | 也可以在其他系统用虚拟机安装Linux. 43 | \end{itemize} 44 | \end{frame} 45 | 46 | \begin{frame} 47 | \section{选择一个发行版} 48 | \subsection{我是新手} 49 | 新手对Linux中的很多概念都不了解,有的甚至是刚接触电脑,这时应该用一个适合新手的发行版。 50 | \begin{itemize} 51 | \item Ubuntu: 很流行,但是经常被黑,主要问题是和上游关系不好,Unity桌面等。 52 | \item Fedora: 小白鼠发行版,常常瞻前不顾后,有的软件会出些问题。 53 | \item Redhat 9: 很多老Linux教程中提到的发行版,已经过时。 54 | \end{itemize} 55 | 56 | 因此,我推荐的新手发行版是\ldots 57 | \end{frame} 58 | 59 | \begin{frame}{推荐新手使用的发行版} 60 | \begin{itemize} 61 | \item Deepin: 基于Ubuntu的国产发行版,非常适合国人使用,有独立开发的桌面环境,搜狗拼音输入法,QQ,迅雷等软件。 62 | \item openSUSE: 华丽的发行版,有最好的KDE桌面,系统配置工具强大,不错的文档和社区支持。 63 | \item Linux Mint: Debian系的发行版,常年排名靠前,有传统而又现代的Cinnamon桌面。 64 | \end{itemize} 65 | \end{frame} 66 | 67 | \subsection{中级用户} 68 | \begin{frame}{中级用户} 69 | 如果已经有了一定的水平,想用一个定制性稍高的发行版,那么可以用下列发行版。 70 | \begin{itemize} 71 | \item Debian: 老牌发行版,稳定,拥有强大的包管理和配置工具。 72 | \item Arch: 崇尚极简主义,前卫的发行版,强大的文档和社区支持。 73 | \item Gentoo: 超高定制性的基于源码的发行版,拥有最强大的包管理器。 74 | \end{itemize} 75 | 76 | \end{frame} 77 | 78 | \subsection{高级用户} 79 | \begin{frame}{高级用户} 80 | 如果你是高级用户,已经非常熟悉Linux,那就没必要来这里选发行版了\ldots 81 | \end{frame} 82 | 83 | \part{2} 84 | \section{安装方法} 85 | \begin{frame}{安装Linux} 86 | 很多发行版都有一个图形化的安装程序,只要按照向导安装就能装好系统。 87 | 我们这里要更深入地讨论系统的安装,了解其中的关键流程。 88 | \end{frame} 89 | 90 | \subsection{Debian,Arch,Gentoo的安装} 91 | \begin{frame}{使用debootstrap安装Debian} 92 | debootstrap可以用于创建一个基础的Debian系统,在很多发行版中都有此工具。用它安装Debian的大致流程如下: 93 | \begin{enumerate} 94 | \item 分区并挂载。 95 | \item 用debootstrap在目标根目录下做一个基础系统。 96 | \item chroot进去用apt安装内核和引导器(bootloader)。 97 | \item 配置fstab,设置root密码,把bootloader安装到磁盘的引导区,配置bootloader。 98 | \item 退出chroot环境,重新启动。 99 | \end{enumerate} 100 | \end{frame} 101 | 102 | \begin{frame}{安装Arch} 103 | Arch的LiveCD中有一个install.txt,详细地讲解了安装方法。 104 | \begin{enumerate} 105 | \item 仍然是分区,挂载。 106 | \item 用pacstrap把base组的包全部装到目标根文件系统,其中包含基本工具和内核。 107 | \item 用pacstrap安装bootloader. 108 | \item 利用arch-chroot把bootloader安装到引导区,配置bootloader,设置root密码。 109 | \item 利用genfstab生成fstab. 110 | \item 重新启动。 111 | \end{enumerate} 112 | \end{frame} 113 | 114 | \begin{frame}{安装Gentoo} 115 | 按照Gentoo Handbook,Gentoo的安装方法大致如下: 116 | \begin{enumerate} 117 | \item 仍然是分区,挂载。 118 | \item 下载一份stage3,解压至目标根文件系统。 119 | \item 下载一份portage树,解压至目标的/usr下,并用emerge --sync同步portage树至最新。 120 | \item chroot进入目标系统。 121 | \item emerge一份内核源码,配置,编译,安装内核。 122 | \item emerge一份bootloader,并将其安装至引导区,配置bootloader。 123 | \item emerge其他常用的工具,用于连网,记录日志,执行计划任务等。 124 | \item 退出chroot并重启。 125 | \end{enumerate} 126 | \end{frame} 127 | 128 | \begin{frame}{要点} 129 | 从Debian,Arch,Gentoo的安装过程可以看出一些共同点: 130 | \begin{itemize} 131 | \item 都构建了一个基本系统(debootstrap,pacstrap,stage3). 132 | \item 使用了一个叫做chroot的手段。 133 | \end{itemize} 134 | 135 | 什么叫做chroot(change root)?简单地说,就是让用户进入一个环境,其根目录为一个指定目录。 136 | \end{frame} 137 | 138 | \subsection{总结} 139 | \begin{frame}{安装Linux系统的关键是\ldots} 140 | \Huge 基本系统 + chroot \normalsize 141 | \end{frame} 142 | 143 | \subsection{常见问题} 144 | \begin{frame}{常见问题} 145 | \begin{itemize} 146 | \item chroot前请先挂载/proc,/dev,/sys 147 | \item 别忘了设置root密码及配置fstab 148 | \item 重启前请确认必要的包都装了,最好先配置好网络 149 | \end{itemize} 150 | \end{frame} 151 | 152 | \section{LiveUSB的制作} 153 | \begin{frame}{LiveUSB的制作} 154 | 现在用光盘安装系统已经不流行了,对于可以自由下载的Linux发行版更是如此。以下介绍LiveUSB的制作方法。 155 | \end{frame} 156 | 157 | \subsection{直接写盘法} 158 | \begin{frame}{直接写盘法} 159 | 这种方法是直接把ISO镜像写入U盘,然后电脑启动时会把U盘作为一个光盘启动。 160 | \begin{itemize} 161 | \item 常用工具为dd,简单粗暴。 162 | \item 写入ISO镜像后,U盘基本上就没别的用途了。 163 | \item 效果不好。 164 | \end{itemize} 165 | 166 | 因此本人不推荐这种做法。 167 | \end{frame} 168 | 169 | \subsection{辅助工具法} 170 | \begin{frame}{辅助工具法} 171 | 有一些工具可以利用LiveCD的ISO制作LiveUSB,效果还不错。 172 | 常用的有UnetBootin, Universal USB installer, Linux Live USB Creater等, 173 | 这类工具的使用很简单,按照工具的图形界面的提示制作就行了。 174 | \begin{itemize} 175 | \item 方法简单。 176 | \item 一般来说U盘无需格式化。 177 | \item 只能把一个ISO制作成LiveUSB,似乎也有多重启动U盘的制作工具。 178 | \end{itemize} 179 | \end{frame} 180 | 181 | \subsection{手工制作} 182 | \begin{frame}{手工制作} 183 | 不借助LiveUSB制作工具,直接手工操作,可以打造出一个高度定制的LiveUSB. 184 | 我们需要的,是一个引导器,常用的有syslinux,grub4dos,grub2 185 | 186 | ArchWiki上有手工制作Arch的LiveUSB的方法: 187 | \begin{enumerate} 188 | \item 把LiveCD里面的所有文件复制到U盘 189 | \item 安装syslinux到U盘,并给U盘的分区设定可引导标志 190 | \item 修改syslinux配置文件 191 | \end{enumerate} 192 | 193 | \end{frame} 194 | 195 | \begin{frame}{制作LiveUSB的一般方法} 196 | 手工制作LiveUSB的要点: 197 | \begin{itemize} 198 | \item 安装引导器 199 | \item 复制必要的文件 200 | \item 编写/修改配置文件 201 | \end{itemize} 202 | 203 | 提示: 204 | \begin{itemize} 205 | \item 最重要的是要学会模仿,主要是iso镜像自身和各种工具生成的syslinux.cfg 206 | \item memdisk等小工具使用于小镜像 207 | \item 如果制作的LiveUSB出了问题,还是要看看相关文档 208 | \end{itemize} 209 | 210 | \end{frame} 211 | 212 | \section{其他} 213 | \begin{frame}{其他} 214 | 一些安装中遇到的问题: 215 | \begin{itemize} 216 | \item 多系统共存 217 | \item UEFI和GPT分区表 218 | \item 虚拟机的使用 219 | \end{itemize} 220 | 221 | 我们将在剩下的时间解决这些问题。 222 | \end{frame} 223 | 224 | \end{document} 225 | -------------------------------------------------------------------------------- /install/install-archlinux.md: -------------------------------------------------------------------------------- 1 | ## 安装Arch Linux:一步一步了解Linux系统 2 | 3 | 现在,我们开始安装Linux系统。我们选用Arch Linux这个发行版,通过安装Arch Linux,可以帮助我们了解很多Linux的基本概念和构建Linux系统的方式。 4 | 5 | 在下文中,我们会在真实的机器上安装Arch Linux.对于对Linux不熟悉的读者,可以选择使用虚拟机安装,也可以买一块硬盘,在这块硬盘上安装(一块二手的320G硬盘的价格大约为140元)。总之,在安装前请先保证自己的数据不会丢失! 6 | 7 | ### 准备工作 8 | 首先,我们需要一个安装盘。 9 | 10 | 我们可以从Arch Linux的[官方网站](https://www.archlinux.org/)下载用于安装Arch Linux的iso镜像。而为了加速,世界上有很多开源社区建立了开源镜像站,里面提供很多发行版的iso镜像及软件源。下面我们从中科大的开源镜像站([http://mirrors.ustc.edu.cn/](http://mirrors.ustc.edu.cn/))下载Arch Linux的iso.在这里,我们下载2015.09版本的镜像,文件名为archlinux-2015.09.01-dual.iso. 11 | 12 | ![USTC镜像站](img/01-download.png) 13 | ![iso文件](img/02-download-2.png) 14 | 15 | 下载了iso文件后,可以直接把这个文件刻录为光盘。现在很多的机器已经没有光驱了,因此我们要把它做成USB启动盘。以后我会讲解在Linux下制作启动盘的方法,考虑到很多人还在用Windows系统,因此接下来我们将要用[Rufus](https://rufus.akeo.ie/)制作启动盘。 16 | 17 | 首先下载Rufus.Rufus不需要安装,直接打开就能看到主界面。插入U盘之后,可以看到Rufus可以识别出U盘。Rufus有很多设置项,其中有一项叫“新卷标”,这一项要正确地填写,因为Arch的安装镜像启动时默认根据卷标判断启动所需文件的位置。我们可以先在Windows中挂载下载下来的iso文件,如果你所用的Windows版本没有虚拟光驱功能,可以安装[ImDisk](http://www.ltr-data.se/opencode.html/#ImDisk)后用它挂载iso. 18 | 19 | ![mount iso](img/03-mount.png) 20 | 21 | 可以看到,镜像的名字叫做`ARCH_201509`.接着,我们在Rufus的“新卷标”处填写`ARCH_201509`,分区方案选择“用于BIOS或MBR计算机的UEFI分区方案”(似乎翻译有问题,应该是用于BIOS和UEFI的MBR方案,大家可以回忆一下关于[系统固件](from-firmware-to-userspace.md#固件firmware)的内容。),其他都用默认配置。然后在“创建一个启动盘使用”那里,右边有个光盘的图标,点击并选择下载下来的iso文件。最后点“开始”制作启动U盘。 22 | 23 | ![Rufus](img/04-rufus.png) 24 | 25 | 接着Rufus会提示下载syslinux,选择“是”。 26 | 27 | ![syslinux](img/05-dlsyslinux.png) 28 | 29 | 然后提示选择写盘模式,我们使用推荐的ISO模式。 30 | ![isohybrid](img/06-hybridiso.png) 31 | 32 | 最后有个格式化的警告,点击确定,即可格式化U盘并制作启动盘。 33 | ![format](img/07-format.png) 34 | 35 | ### 启动系统 36 | 制作好了安装盘之后,可以用这个安装盘启动系统了。启动之后,我们要先做一些安装前的准备工作。 37 | 38 | #### 命令行工具的使用 39 | 启动之后,我们可以看到一个字符用户界面,有一个提示符,用户可以在上面输入命令,按下回车即可执行。对于没接触过Linux的用户,我们先学习一些常用命令行工具的使用。 40 | 41 | * ls: 输入`ls`后回车,可以列出当前所在目录下的文件。Arch Linux的安装盘带有一个install.txt文件,执行ls后可以看到有这个文件。 42 | * nano: 我们先学习一个简单的文本编辑器。执行`nano hello.txt`,在里面输入一些东西,然后按`Ctrl-X`,nano会提示是否保存修改,按y即可保存并退出。然后执行`ls`,看看目录下有什么文件?再执行一次`nano hello.txt`,看看刚才写的东西在不在里面? 43 | * cat和less: 接着上面的的操作,执行`cat hello.txt`,可以发现,刚才往hello.txt写进去的东西都输出了出来。再执行`cat install.txt`看看是什么结果?再用`less install.txt`试试,可以使用上下键移动行,PgUp和PgDn翻页,也可以试试j,k,Ctrl-V,Alt-V这几个键,看完了之后按q键退出。 44 | 45 | 好了,学会了这几个命令之后,就可以列出当前目录下的文件,以及编辑和查看文件了。在之后的安装过程中,还会用到这些工具。 46 | 47 | #### 配置网络 48 | 首先,我们执行`ip addr`,可以看到系统识别出的网卡。其中lo为一虚拟网卡,处理127.x.x.x这类特殊IP地址。以en开头的是有线网卡,以wl开头的是无线网卡。不同的网络环境下,配置网络的方式也不一样。下面讲解几种比较常用的网络的配置方法。假设所用有线网卡的名称为enp2s0,无线网卡为wlp4s0. 49 | 50 | * 使用静态IP的有线网络: 假设要配置的IP地址为192.168.0.50,子网掩码为255.255.255.0(即最高24位均为1,后面为0),则执行`ip addr add 192.168.0.50/24 dev enp2s0`,并在`/etc/resolv.conf`中配置DNS服务器,如 51 | ``` 52 | # /etc/resolv.conf, DNS server is 192.168.0.1 53 | nameserver 192.168.0.1 54 | ``` 55 | * 使用DHCP配置的有线网络: 执行`dhcpcd enp2s0`,没有看到错误提示,提示成功获得IP,则配置成功。 56 | * 无线网络: Arch Linux的安装盘提供一个叫`wifi-menu`的工具,执行`wifi-menu`,选择要连接的无线热点,根据提示输入密码即可。 57 | 58 | #### 选择镜像源 59 | Arch Linux是通过网络进行安装的,为了以更快的速度下载软件包,建议先配置镜像源。配置镜像源的方法是编辑`/etc/pacman.d/mirrorlist`这个文件,将想用的镜像源的放到第一个非井号开头的行即可。如下可将中科大镜像源作为首选镜像源。 60 | ``` 61 | # /etc/pacman.d/mirrorlist 62 | # This is the USTC mirror 63 | Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch 64 | 65 | # and other mirrors 66 | ## Score: 4.6, China 67 | Server = http://mirrors.163.com/archlinux/$repo/os/$arch 68 | # ... 69 | ``` 70 | 71 | 配置完成后可以执行`pacman -Syy`试一下,可以看一下pacman从镜像站下载文件的速度。 72 | 73 | ### 安装系统 74 | 进行准备工作之后,就可以装系统了。我们会把需要的文件(包括内核)安装至磁盘,随后安装引导加载器,这样就完成了一个可启动系统的安装。 75 | 76 | #### 分区 77 | 为了把系统安装到硬盘上,我们需要对硬盘进行分区。如果对分区和文件系统的概念不了解的话,先学习一些基础知识吧。 78 | * [分区和文件系统](fs-partition.md) 79 | 80 | 考虑到现在很多的机器都使用了UEFI固件和相应的启动方式,因此我们使用UEFI标准中推荐的GPT分区表。Linux下的GPT分区工具是gdisk. 81 | 82 | 为了方便,我们在这里分3个区,挂载点和功能如下: 83 | 1. /boot: 我们把EFI系统分区挂载到/boot下,从而Arch Linux可以把内核安装在EFI系统分区中,便于一些引导加载器加载内核。一般来说,这个分区给200M就够了。 84 | 2. /: 根文件系统,系统文件都放在这个分区中,我们给它分个50G,这样可以多装软件。事实上,对于不用大型应用的用户,10G就够了。 85 | 3. /home: 存放用户文件用,硬盘上的剩余空间都放在这里。 86 | 87 | 对于内存小的机器,建议多分一个和内存大小相当的分区作为交换分区。在这里,为了方便,我们就不要这个分区了。 88 | 89 | 我们开始用gdisk分区。一般来说,对于只有一个硬盘的机器,硬盘为`/dev/sda`.于是我们执行`gdisk /dev/sda`. 90 | 91 | 在gdisk中,有一个提示符,输入命令后回车就能让gdisk执行相应操作。h命令可以查看gdisk的使用说明,p命令可以列出磁盘的分区状况。 92 | 93 | 我们现在把手上的硬盘重新分区,首先用o命令,它可以在硬盘上建立一个新的GPT分区表。 94 | 95 | > 96 | ``` 97 | Command (? for help): o 98 | This option deletes all partitions and creates a new protective MBR. 99 | Proceed? (Y/N): Y 100 | ``` 101 | 102 | 接着执行n命令,建立一个分区。按照如下方法,即可建立一个200M的,类型为'EFI System'的分区(用它作为EFI分区),分区号为1. 103 | 104 | > ``` 105 | > Command (? for help): n 106 | > Partition number (1-128, default 1): 107 | > First sector (34-10485726, default = 2048) or {+-}size{KMGTP}: 108 | > Last sector (2048-10485726, default = 10485726) or {+-}size{KMGTP}: +200M 109 | > Current type is 'Linux filesystem' 110 | > Hex code or GUID (L to show codes, Enter = 8300): ef00 111 | > Changed type of partition to 'EFI System' 112 | > ``` 113 | 114 | 执行p可以看到: 115 | 116 | > ``` 117 | > Number Start (sector) End (sector) Size Code Name 118 | > 1 2048 411647 200.0 MiB EF00 EFI System 119 | > ``` 120 | 121 | 同理可以建立我们想建的剩下两个分区,注意到提示'Hex code or GUID'时,我们使用默认的8300就行了,它表示的类型为'Linux filesystem',这个是Linux系统的分区的默认类型。而'Last sector'那个提示用默认回答时,则表示使用硬盘后面的分区之前的所有空间(后面没有分区时则是用完所有的硬盘空间). 122 | 123 | 分区完成之后可以执行p看看效果,确认没有错误后执行w保存退出。 124 | 125 | #### 格式化,挂载分区 126 | 分区是把硬盘分成了几个单独的部分,但是那些单独的分区需要一定的结构才能使用,因此需要格式化这些分区。我们一个一个分区地来吧。 127 | 128 | 首先是/dev/sda1.这个分区时EFI分区,按照标准,使用FAT32文件系统,我们执行`mkfs.vfat /dev/sda1`格式化。 129 | 130 | 接着是/dev/sda2.我们使用比较常用的ext4文件系统,执行`mkfs.ext4 /dev/sda2`格式化。 131 | 132 | 最后是/dev/sda3.我们使用xfs文件系统,和上面的方法类似,执行`mkfs.xfs /dev/sda3`即可。 133 | 134 | 格式化之后的分区就可以使用了。我们暂时把整个文件系统挂载在/mnt下,这样把文件放到/mnt下就可以把文件写入硬盘。在挂载的过程中,要注意按照挂载点的层次按顺序挂载,先挂载最顶层的/. 135 | ``` 136 | mount /dev/sda2 /mnt 137 | ``` 138 | 139 | 接着挂载/boot和/home,注意要先建立目录才能挂载。 140 | ``` 141 | install -d /mnt/{boot,home} 142 | mount /dev/sda1 /mnt/boot 143 | mount /dev/sda3 /mnt/home 144 | ``` 145 | 146 | 就这样,我们的硬盘的每个分区都挂载到了/mnt及其子目录下,往其中写文件就是往硬盘写文件。而且往/mnt/boot写入的文件都会写到/dev/sda1这个分区,往/mnt/home写入的文件都会写到/dev/sda3这个分区,往其他目录写入的文件都会写到/mnt/sda2这个分区,这就是分区和挂载点的对应关系。 147 | 148 | #### 软件安装 149 | 安装Arch Linux的软件很简单,执行下面这条命令就行了: 150 | ``` 151 | pacstrap /mnt 152 | ``` 153 | 154 | 考虑到不少用户需要使用无线上网功能,我们安装networkmanager: 155 | ``` 156 | pacstrap /mnt networkmanager 157 | ``` 158 | 159 | 还有常用的开发工具最好也装上: 160 | ``` 161 | pacstrap /mnt base-devel 162 | ``` 163 | 164 | 以上三类软件可以用一条命令进行安装(`pacstrap /mnt`相当于`pacstrap /mnt base`): 165 | ``` 166 | pacstrap /mnt base base-devel networkmanager 167 | ``` 168 | 169 | #### chroot 170 | 做完了上面的工作之后,我们已经把Linux内核和需要的用户程序都安装到硬盘里面了。在安装bootloader之前,我们先了解一个叫做chroot的操作。 171 | 172 | 我们已经知道,文件系统是一个树形结构,它有一个根目录/,每个文件路径都可以从/一步一步走下去找到。而chroot的功能就是把一个进程(及其子进程)的根目录改为指定的路径,这样这个进程找一个文件时,便会从chroot指定的目录开始查找。 173 | 174 | 在这里,我们chroot到已经安装好的那个文件系统里面,这样就很容易对我们新安装的系统进行操作了。 175 | 176 | 一般来说,为了在进入新的文件系统后仍可以方便地操作内核,要挂载/proc,/dev,/sys到新的文件系统中。Arch的安装工具中提供了一个叫`arch-chroot`的脚本,它封装了这些操作,简化了chroot的过程。 177 | 178 | 现在我们执行`arch-chroot /mnt`,这样就以chroot的方式进入了新的系统。 179 | 180 | #### bootloader 181 | 我们用的是UEFI的启动方式,对此我们使用gummiboot作为bootloader.gummiboot可以直接引导Linux内核,可以加载其他的EFI程序,从而可以引导其他系统,加载其他的bootloader或者执行一些特殊的EFI应用。 182 | 183 | 最新的systemd里面已经有一份gummiboot的安装程序,我们用它把gummiboot程序安装到EFI分区里面。 184 | 185 | 在chroot里面,执行`bootctl install`.接着可以看到安装过程的信息,bootctl程序把gummiboot安装到了/boot/EFI/Boot/BOOTX64.EFI并且添加了一条EFI启动项。 186 | 187 | **注意: 有的UEFI实现支持添加EFI启动项,但是有的只支持默认路径efi/boot/bootx64.efi.因此bootctl在添加启动项的同时把文件安装到efi/boot/bootx64.efi是个稳妥的做法。** 188 | 189 | 接下来要配置gummiboot.我们创建并编辑/boot/loader/entries/archlinux.conf. 190 | ``` 191 | title Arch Linux 192 | linux /vmlinuz-linux 193 | initrd /initramfs-linux.img 194 | options root=/dev/sda2 ro 195 | ``` 196 | 197 | 它的意思是创建一个标题为Arch Linux的启动项,它用bootloader所在分区(/dev/sda1)根目录下的vmlinuz-linux作为Linux内核,initramfs-linux.img作为initramfs镜像(可以认为是一个临时rootfs镜像),并且用`root=/dev/sda2 ro`作为内核参数。 198 | 199 | 再编辑/boot/loader/loader.conf. 200 | ``` 201 | timeout 3 202 | default archlinux 203 | ``` 204 | 205 | 意思是默认用archlinux.conf的配置启动,等待3秒没有键盘操作即使用默认配置启动。 206 | 207 | #### 配置系统 208 | 现在系统启动需要的几个部件都装好了,剩下的是配置一下系统。 209 | 210 | 首先,我们要设置root密码,不然重启后就进不了系统了。在chroot环境下执行`passwd`,按要求输入两次密码即可。 211 | 212 | 然后是生成/etc/fstab文件,它的作用是指示init程序挂载分区到指定的挂载点。我们先执行exit或者按Ctrl-D退出chroot环境,然后执行`genfstab -U /mnt | tee /mnt/etc/fstab`,然后我们可以在终端上看到生成的fstab内容,并且这些内容已经写入/mnt/etc/fstab中了。 213 | 214 | *tee的作用是在终端打印输入内容的同时写文件。这里用到了shell的管道(|符号),它的作用是把|之前的命令的输出作为|后面命令的输入。* 215 | 216 | *此外,genfstab的-U参数表示在fstab中用UUID表示分区。而之前在gummiboot配置中用/dev/sda2表示sda的第二个分区,是种比较简便的方法,但容易混乱。在多硬盘的情形下建议用UUID,内核命令行中可以写root=UUID=uuid-of-partition.* 217 | 218 | ### 重新启动 219 | 如果你一步一步地走到了这里,恭喜你,Arch Linux系统已经安装在你的机器上了。重新启动看看效果吧。 220 | 221 | 在退出了chroot环境之后,在终端下执行`reboot`命令,即可重新启动系统。然后,如果你看到了一个启动菜单,那就是gummiboot的界面,接着系统启动,最后出现一个登陆提示,说明你已经安装成功了! 222 | --------------------------------------------------------------------------------