YangMame

В мире где ты и я


Explore Me
YangMame
В мире где ты и я
28
2
44
极限建站
日常划水 YangMame · 2周前

前言

有很多人可能还用着一键脚本/面版安装的网站

优点是轻松傻瓜式,缺点是浪费时间/空间 学习成本可能比我的文章还大(前提是愿意琢磨
如果你的VPS只有/剩余5G Disk,显然用这些脚本是不太现实的

但是如果自己安装配置 你大概只需要不到1G的空间就能搭建个和我一样的网站


预览


购买VPS

VPS推荐最低配置:

Mem: >=512M
CPU: >=1Core
Disk: >=5G

我的网站运行在搬瓦工年付19刀的KVM VPS上(流下了没钱的泪)

但是推荐新手买VultrDigitalOcean(请使用我的链接注册,这样我也能受益 注册后需要充值五美元才能使用,但请放心 这俩家都是大牌)

至于买什么地区,什么配置 自己定夺

系统请选择Debian 9 x86_64 (若出现其他问题需要自行解决,例如systemd版本太低造成参数无效导致权限不足

记得检查VPS的IP是否能访问,否则请更换IP(给VPS商发工单or新开VPS)


购买域名

域名推荐去Godaddy购买(无需实名制or备案)

你要是有更好的选择也行

这里说下我知道的主要域名类型

.com: 一般网站

.net: 与com类似

.org: 公益 无盈利网站

.me: 个人个性网站

.info: 信息类网站

.blog: 博客网站

.moe: 二次元类网站

.cn: 中国网站(需要备案)
  • 如果仅仅写博客推荐.me 有钱人上.blog
  • 如果和我一样推荐.org或.info
  • ACG爱好者推荐.moe
  • 如果自己也不确定推荐.com 有钱人上.net

配置Cloudflare

首先去注册Cloudflare

然后添加你的网站,在域名商(Godaddy)中更换域名的DNS为CLoudflare提供给你的DNS地址

等待生效后

在Cloudflare中转到DNS设置

添加A记录:Name填@ IPv4 address填你VPS的IP地址 点击Add Record完成添加

添加子域名:(例如blog.yangmame.org),添加CNAME记录:Name填你想添加的子域名(例如blog) Domain name填你的根域名(例如yangmame.org) 点击Add Record完成添加(如果想网站和我一样,则请添加blog,www,file.admin,git,bt子域名,之后的配置按此配置)

screenshot.png

转到Crypto页面

将SSL设置为Full(strict)

启用下面的Always use HTTPS

还有些选项如果你了解也可以开启(比如HSTS)


配置VPS

ssh连接VPS

运行如下命令更新系统:

apt update
apt dist-upgrade
apt --purge autoremove
reboot

开启BBR(KVM):

modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

Caddy

安装Caddy并配置权限 创建用户 创建必要文件/文件夹:

wget https://getcaddy.com -O caddy.sh
bash caddy.sh personal http.filemanager,http.nobots,tls.dns.cloudflare
chown root:root /usr/local/bin/caddy
chmod 755 /usr/local/bin/caddy
groupadd caddy
useradd -g caddy --home-dir /var/www --no-create-home --shell /usr/sbin/nologin --system caddy
mkdir /etc/caddy
touch /etc/caddy/Caddyfile
chown -R root:caddy /etc/caddy
chown caddy:caddy /etc/caddy/Caddyfile
chmod 444 /etc/caddy/Caddyfile
mkdir /etc/ssl/caddy
chown -R caddy:root /etc/ssl/caddy
chmod 770 /etc/ssl/caddy
mkdir /var/www
chown caddy:caddy /var/www

创建Caddy服务:

nano /etc/systemd/system/caddy.service

写入(注意查看并删除or修改中文注释):

[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
#Restart=on-failure
StartLimitInterval=864000
StartLimitBurst=500

; User and group the process will run as.
User=caddy
Group=caddy

; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy
Environment=CLOUDFLARE_API_KEY=这里改为你的API Key,在这个页面点击Global API Key--->View API Key即可看到:https://www.cloudflare.com/a/profile
Environment=CLOUDFLARE_EMAIL=这里改为你cloudfalre的邮箱

; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=64

; Use private /tmp and /var/tmp, which are discarded after caddy stops.
PrivateTmp=true
; Use a minimal /dev
PrivateDevices=true
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
;   This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/etc/ssl/caddy

; The following additional security directives only work with systemd v229 or later.
; They further restrict privileges that can be gained by Caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
;NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

编辑Caddy配置:

nano /etc/caddy/Caddyfile

写入并自行删除你不需要的网站配置(注意查看并删除中文注释):

#主站,将后面的所有yangmame.org换成你自己的域名
https://yangmame.org {
        tls {
                dns cloudflare
        }
        gzip
# 这里的root为网站的根目录,记得创建文件夹并修改权限,之后的root也请自行创建文件夹并修改权限
# 例如:mkdir /var/www/www.yangmame.org && chown caddy:caddy /var/www/www.yangmame.org
        root /var/www/www.yangmame.org
}

#主站
https://www.yangmame.org {
    tls {
        dns cloudflare
    }
        gzip
    root /var/www/www.yangmame.org
}

#博客
https://blog.yangmame.org {
    tls {
        dns cloudflare
    }
    gzip
    root /var/www/blog.yangmame.org
        #typecho安装时请删掉下一行的注释
        #fastcgi / 127.0.0.1:9000 php
        #typecho安装完成之后删掉掉下面的注释(千万不要在安装时删掉下面的注释)
        #rewrite / {
        #        if {path} not_match (/usr/|/admin/)
        #        to /index.php{uri}
        #}
}

#”云盘“,只能访问网站根目录,无需登录
https://file.yangmame.org {
    tls {
        dns cloudflare
    }
    gzip
    root /var/www/file.yangmame.org
    
#这里是V2ray
    proxy /download localhost:1234 {
        websocket
        header_upstream -Origin
    }

    filemanager / /var/www/file.yangmame.org {
        locale zh-cn
        no_auth
        show /var/www/file.yangmame.org/
        alternative_recaptcha true
        allow_edit false
        allow_new false
        allow_publish false
        allow_commands false
    }
}

#另一个”网盘“,不过这个可以访问系统的根目录并上传修改和运行命令
https://admin.yangmame.org {
        tls {
                dns cloudflare
        }
        gzip
    filemanager / / {
                locale zh-cn
                show /
                alternative_recaptcha true
        }
}

#Git网站
https://git.yangmame.org {
    tls {
        dns cloudflare
    }
        gzip
    proxy / localhost:3000
}

#qBittorrent的Web控制端
https://bt.yangmame.org {
        tls {
                dns cloudflare
        }
        gzip
        proxy / localhost:8080
}

给予权限并启用服务:

chown root:root /etc/systemd/system/caddy.service
chmod 644 /etc/systemd/system/caddy.service
systemctl daemon-reload
systemctl enable caddy
systemctl start caddy

PS:请务必过了一俩分钟后检查caddy的运行状态,如果看到错误,请多重启几次(因为申请证书可能失败):systemnctl restart caddy,如果每次报错都一样 请确保Cloudflare添加了对应的子域名CNAME记录or仔细检查配置 > 自行谷歌 > 联系我

Mariadb

安装数据库:

apt install mysql-server

配置mysql:

mysql_secure_installation

要求输入密码时直接回车,然后会让你设置密码,之后的选项一路Y就行

创建数据库和用户:

# 输入刚刚设置的root密码登录mysql:
mysql -u root -p
# 创建typecho的数据库:
create database typecho;
# 创建typecho用户并赋予typecho数据库的权限:
grant all privileges on typecho.* to '用户名,推荐typecho'@'localhost' identified by '密码';
# 如果你想恢复数据库则运行(第一次使用请忽略):
use typecho;
source /path/to/typecho.sql;
# 创建gitea的数据库:
create database gitea;
# 创建gitea用户并赋予gitea数据库的权限:
grant all privileges on gitea.* to '用户名,推荐gitea'@'localhost' identified by '密码';
# 如果你想恢复数据库则运行(第一次使用请忽略):
use gitea;
source path/to/gitea.sql
# 刷新数据库:
flush privileges;
# 退出
exit

启动Mysql:

systemctl enable mysql
systemctl start mysql

PHP

安装PHP及Typecho需要的扩展(如果直接安装php会依赖apache2):

apt install php-fpm
apt install php php-mysql php-gd php-xml

编辑php-fpm配置:

nano /etc/php/7.0/fpm/pool.d/www.conf

将如下中的www-data修改为caddy:

user = www-data
group = www-data

还有:

listen.owner = caddy
listen.group = caddy

找到listen = xxxx修改为:

listen = 127.0.0.1:9000

启动php-fpm:

systemctl enable php7.0-fpm
systemctl start php7.0-fpm
systemctl restart php7.0-fpm

V2ray

安装V2ray:

wget https://install.direct/go.sh -O v2ray.sh
bash v2ray.sh

更改配置:

rm /etc/v2ray/config.json
nano /etc/v2ray/config.json

写入(请注意并删除中文注释):

{
  "outbound": {
    "streamSettings": null,
    "tag": null,
    "protocol": "freedom",
    "mux": null,
    "settings": null
  },
  "log": {
    "access": "/var/log/v2ray/access.log",
    "loglevel": "info",
    "error": "/var/log/v2ray/error.log"
  },
  "outboundDetour": [{
      "tag": "direct",
      "protocol": "freedom",
      "settings": null
    },
    {
      "tag": "blocked",
      "protocol": "blackhole",
      "settings": null
    }
  ],
  "inbound": {
    "streamSettings": {
      "network": "ws",
      "kcpSettings": null,
      "wsSettings": {
        "path": "/download" #这里必须和Caddy配置中”proxy /download localhost:1234“的路径一样
      },
      "tcpSettings": null,
      "tlsSettings": {},
      "security": ""
    },
    "settings": {
      "ip": null,
      "udp": true,
      "clients": [{
        "alterId": 100,
        "security": "none",
        "id": "xxxx-xxxx-xxxx-xxxx" #请访问 https://www.uuidgenerator.net/ 获取UUID并改入
      }],
      "auth": null
    },
    "protocol": "vmess",
    "port": 1234, #这里的端口也必须和Caddy配置中”proxy /download localhost:1234“的端口一样
    "listen": null
  },
  "inboundDetour": null,
  "routing": {
    "settings": {
      "rules": [{
        "ip": [
          "0.0.0.0/8",
          "10.0.0.0/8",
          "100.64.0.0/10",
          "127.0.0.0/8",
          "169.254.0.0/16",
          "172.16.0.0/12",
          "192.0.0.0/24",
          "192.0.2.0/24",
          "192.168.0.0/16",
          "198.18.0.0/15",
          "198.51.100.0/24",
          "203.0.113.0/24",
          "::1/128",
          "fc00::/7",
          "fe80::/10"
        ],
        "domain": null,
        "type": "field",
        "port": null,
        "outboundTag": "blocked"
      }],
      "domainStrategy": null
    },
    "strategy": "rules"
  },
  "dns": null
}

启动V2ray服务:

systemctl enable v2ray
systemctl start v2ray

Typecho

进入网站的根目录:

cd /var/www/blog.yangmame.org #注意路径改为自己的

下载Typecho(自行检查实际下载地址):

wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz
tar -xf *.tar.gz
mv build/* .
rm -rf build *.tar.gz

然后在浏览器中访问你的博客,例如:blog.yangmame.org

这时候应该会显示安装界面

数据库和用户均填写typecho,密码为配置数据库时的密码,其它内容自行填写

然后你就可以愉快的写作了

至于安装主题什么的就自己琢磨吧

本博客使用的主题是Cat

Gitea

创建git用户并切换:

adduser git # 这里除了密码都可以留空(adduser命令为Debian类系统独有)
su git

下载Gitea(自行检查最新的实际下载地址

mkdir /home/git/gitea
cd /home/git/gitea
wget https://github.com/go-gitea/gitea/releases/download/v1.4.0/gitea-1.4.0-linux-amd64 # 请自己检查最新的下载地址
mv gitea-1.4.0-linux-amd64 gitea # 注意文件名
chmod +x gitea
exit

新建Gitea服务:

nano /etc/systemd/system/gitea.service

写入:

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
#After=mysqld.service
#After=postgresql.service
#After=memcached.service
#After=redis.service

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gitea
ExecStart=/home/git/gitea/gitea web
Restart=always
Environment=USER=git HOME=/home/git

[Install]
WantedBy=multi-user.target

启动Gitea:

systemctl enable gitea
systemctl start gitea

然后在浏览器中访问,例如:git.yangmame.org

数据库和用户皆为gitea,密码为配置数据库时的密码,其它内容自行填写

qBitttorrent

安装qBittorrent:

apt install qbittorrent-nox

添加用户:

adduser qbtuser # 这里除了密码都可以留空

创建qBittorrent服务:

nano /etc/systemd/system/qbittorrent.service

写入:

[Unit]
Description=qBittorrent Daemon Service
After=network.target

[Service]
User=qbtuser
ExecStart=/usr/bin/qbittorrent-nox
ExecStop=/usr/bin/killall -w qbittorrent-nox

[Install]
WantedBy=multi-user.target

配置qBittorrent:

su qbtuser
qbittorrent-nox

然后在浏览器中访问,例如:bt.yangmame.org

默认用户为admin,密码为adminadmin,登录之后在设置中修改用户名 密码和语言

然后在终端中按Ctrl+C停止

启动qBittorrent服务:

exit # 退出qbtuser
systemctl daemon-reload
systemctl enable qbittorrent
systemctl start qbittorrent

PS:下载目录需要更改所有者,例如:chown qbtuser:qbtuser dir

Email

如果你不想拥有自己的域名邮箱,则可以跳过

这里推荐使用Zoho的服务

注册之后按照它的说明在cloudflare添加MX和TXT记录即可(很简单的)我就懒得说了

结束

如果你觉得此文章帮上忙了,还请支持我:

PayPal

到了这里,你就已经搭建完成了,这这时你的VPS磁盘占用应该没有超过2G

至于V2ray

客户端的配置:

协议为vmess

服务器:

主机填你的域名
端口填443(不是v2的1234端口)如果你在caddy中修改了端口则改为相同值
用户ID填v2配置文件中的UUID
AlterID填100
加密方式填none
用户等级为0

传输:

网络填WebSocket
加密填tls
服务器域名证书不填
允许不安全连接随意 (不建议开)
WebSocket/WS路径填/download(如果你修改了,改为相同字符)
HTTP头不需要管
其它设置就随意了(保持默认)

如果你找到的桌面/手机客户端不支持这些选项请更换

如果你使用v2ray-core(注意并删除中文注释):

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": ""
  },
  "inbound": {
    "port": 1080, # 这里为本地的代理端口
    "listen": "0.0.0.0",
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
      "udp": true,
      "ip": "127.0.0.1",
      "clients": null
    },
    "streamSettings": null
  },
  "outbound": {
    "tag": "agentout",
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "这里改为你自己的域名",
          "port": 443,
          "users": [
            {
              "id": "这里改为服务端的UUID",
              "alterId": 100,
              "security": "none"
            }
          ]
        }
      ],
      "servers": null
    },
    "streamSettings": {
      "network": "ws",
      "security": "tls",
      "tcpSettings": null,
      "kcpSettings": null,
      "wsSettings": {
        "connectionReuse": true,
        "path": "/download", # 这里为服务端的路径
        "headers": null
      }
    },
    "mux": {
      "enabled": true
    }
  },
  "inboundDetour": null,
  "outboundDetour": [
    {
      "protocol": "freedom",
      "settings": {
        "response": null
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      },
      "tag": "blockout"
    }
  ],
  "dns": {
    "servers": [
      "8.8.8.8",
      "8.8.4.4",
      "localhost"
    ]
  },
  "routing": {
    "strategy": "rules",
    "settings": {
      "domainStrategy": "IPIfNonMatch",
      "rules": [
        {
          "type": "field",
          "port": null,
          "outboundTag": "direct",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "domain": null
        }
      ]
    }
  }
}
善用搜索
日常划水 YangMame · 2周前

前言

国内不知道为什么,总是有一大票人在网上喜欢直接问人,而且一条龙问到底。不但给回答者造成了困扰还可能让回答者生气

他们却大部分都不喜欢仔细翻阅搜索结果或者根本不愿搜索

我大部分时间都是自己搜索,如果搜索出来看不懂也尽量尝试理解,还是不行就先不管。因为我觉得即使去问人了,你也不能真正解决这个问题,一旦出现了类似的问题就又废了(紧急情况除外

搜索引擎

谷歌!谷歌!谷歌!

即使再麻烦也要用谷歌,千万千万不要用百度

必应也不建议用

如果一时间不能上谷歌

请用 searx.me + 英语

如何描述问题

虽然好的搜索引擎要方便很多 但还是需要你有相应的技巧

  1. 关键词尽量准确,去掉无关紧要的词字。比如:那个,猫是怎么叫的啊 ---> 猫的叫声
  2. 关键词用空格分开,除非你确定它们应该写在一起。比如:猫的叫声 ---> 猫 叫声
  3. 中文和英文用空格分开。
  4. 如果中文搜索无果,请务必使用英语。比如:猫的叫声 ---> cat voice

如何寻找内容

这里很重要。一般来说,搜索结果的第一二条应该是你需要的(百度除外

然后你需要注意时间,远古时期的内容可能并不适用

如果你一时间找不到需要的内容可以设置时间或者使用高级搜索

页面充满广告的页面你可以粗略看下如果没有想要的内容就关掉吧

页面缺图片 各种资源加载失败的也是如此

找到内容之后不要急于实践,先全篇看完,确定符合情况再实践

如何搜索

有时候你可能并不知道你确切的想找什么

这时候你可以先搜索一些可能有关系的关键词,搜索出另外的关键词之后再删增关键词再次搜索

如此循环,大部分情况下能找到你需要的内容

还有些东西,具有实时性或者专业性,这时候你需要去相应的论坛/报告网站搜索

比如你的Linux今天更新时发现有个包过不去

这时候你可以去它项目的github页面搜索,如果是发行版的问题则去对应发行版的bug report/bugzilla搜索

红米刷机之路
日常划水 YangMame · 3周前

这台手机性能。。。也就那样吧 , 反正我不玩垃圾优化的游戏(没错,说的就是你们腾讯的游戏),也不是重度手机使用者

解锁

如果你是小米老用户,应该可以不用等待或者俩天后就能解锁了

但是如果你解锁时提示需要等待15天的话,这里有条路可以走:

你需要一个已经注册小米账号且已绑定手机解锁的手机号和一个未注册小米账号的手机号

假设你已尝试过并提醒等待15天解锁了,这个时候去新注册个小米账号,并申请解锁,申请之后(大概五分钟,申请理由随意)注销老账号,登录新账号,但是不要绑定手机解锁,直接进入fastboot模式,运行解锁工具登录新账号开始解锁。

下载ROM

至于ROM,国内的红米Note5是外国的Redmi Note 5 Pro , 且叫whyred(不叫vince)

XDA上的ROM页面在这里

建议使用LineageOS,目前我只尝试过这个没什么问题(还有个AOSP有很多问题),链接在这里

下载最新的ROM(建议挂代理)复制到SD卡中

刷入TWRP

在这里下载

或者你也可以使用这个

下载到电脑之后手机连接电脑进入fastboot

运行fastboot flash recovery /path/to/twrp.img刷入TWRP

刷机

刷入TWRP之后长按电源键+音量加进入TWRP,选择ROM包

当然你也可以再刷入GAPPS(必须刷完ROM之后立刻刷入才可开机使用)


又水了一篇文章

红米Note5评测
日常划水 YangMame · 1月前

配置

红米Note5配置:

  • CPU :高通骁龙636(最高频率为1.8Ghz)
  • GPU:Adreno 509
  • RAM:4GB(LPDDR4X)
  • Disk:64GB eMMC5.1
  • Battery:4000mAh Li-Po
  • Screen:5.99吋 2160x1080 FHD+
  • Camera:主摄像头(双摄像头)1200万像素、副摄像头500万像素
  • 接口为Micro USB(无Type-C版)、无NFC、支持人脸解锁、蓝牙5.0
  • 价格为1399RMB

华为荣耀8高配版配置(对比用):

  • CPU:麒麟950 4 x Cortex A72 2.3GHz + 4 x Cortex A53 1.8GHz + 微智核I5
  • GPU:Mali T880
  • RAM:4GB(不明)
  • Disk:64GB(不明)
  • Battery:3000mAh 锂聚合物电池
  • Screen:5.2英寸负向液晶,1080 x 1920像素
  • Camera:主摄像头(双摄像头)1200万像素、副摄像头800万像素
  • 接口为Type-C(USB3.0)、有NFC、不支持人脸识别、蓝牙未知
  • 价格为2000+RMB

测试

网络抢占

连接在同一个网络环境

同时开始下载同一个游戏(Vainglory

红米碾压性的以宽带满速率先下载完成,荣耀则是在红米下载完成(此时已下载约30%)之后才有了速度

软件安装速度

软件安装文件为刚刚下载的XAPK文件

荣耀为Android 7,红米为Android 8

红米领先俩三秒

游戏解压速度

游戏还是为Vainglory

仍然是红米领先

红米完成解压时荣耀进度仍在30%

启动游戏

游戏还是这个

红米流畅进入,荣耀略微卡顿

开始游戏后荣耀人物像素很明显,且自动为中等画质,红米为高画质 像素不明显

电池使用

整个过程红米耗电3%,荣耀耗电5%

小米无发热(仅有点温热),荣耀发热较厉害明显

结尾

这还是刚买来时的情况,15天解锁之后还会再次测试

lFS安装教程
操作系统 YangMame · 1月前

声明

请不要把本文章当作你的主要参考处 请以官方文档为准

除非你知道你在做什么 否则请跟着官方文档一步一步走

我的宿主系统为Gentoo,其他linux大小异同

准备分区并下载源码

检查系统是否符合要求:

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else 
  echo "awk not found" 
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF

bash version-check.sh

确保所有需要的包已安装且达到最低版本要求后再继续

创建挂载的目录

mkdir /mnt/lfs

声明变量

export LFS=/mnt/lfs

挂载分区(需事先进行分区 格式化)

mount /dev/xxxx $LFS

创建编译源码目录

mkdir -v $LFS/sources&&chmod -v a+wt $LFS/sources

下载源码列表

wget http://www.linuxfromscratch.org/lfs/view/stable-systemd/wget-list

下载源码(建议事先export声明代理)

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

校验md5(确保所有源码已下载且校验OK)

pushd $LFS/sources
wget http://www.linuxfromscratch.org/lfs/view/stable-systemd/md5sums
md5sum -c md5sums
popd

创建编译目录

mkdir -v $LFS/tools
ln -sv $LFS/tools /

添加用户并开始编译

添加lfs用户:

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs #设置lfs用户的密码

更改目录权限并切换到lfs用户:

chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs

设置lfs用户的环境变量:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

source ~/.bash_profile

编译临时系统

设置编译线程数(建议设置为CPU的核心数+1):

export MAKEFLAGS='-j X' # 将X替换为数字

然后到了最关键的地方

这里我当然不会一个一个说XXX包怎么编译安装

首先进入工作目录:

cd $LFS/sources

示例编译个Binutils(具体请看官方文档,请善用Tab补全):

tar -xf binutils-2.30.tar.xz # 解压
cd binutils-2.30 # 进入解压目录

mkdir -v build # 创建编译目录
cd build # 进入编译目录

../configure --prefix=/tools            \
             --with-sysroot=$LFS        \
             --with-lib-path=/tools/lib \
             --target=$LFS_TGT          \
             --disable-nls              \
             --disable-werror # 准备编译

make # 如果你没有设置线程数则make -j X

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac # 在X86_64上的配置

make install # 安装

cd ../.. # 返回目录
rm -rf binutils-2.30 # 清理编译目录(重要!如果不清理,之后编译很可能出错)

其它包也是类似如此一路编译,但是具体的编译/安装步骤还是需要跟着官方文档走(可以不进行测试)

有些章节是小包,被包括在别的包里面
比如Libstdc++是被GCC包括的(它开头也说明了 需要自己注意)

有些包需要编译俩次,所以需要删除目录防止编译出错

编译完成之后可以清理下并恢复权限:

exit # 退出lfs用户回到root用户

strip --strip-debug /tools/lib/*
/usr/bin/strip --strip-unneeded /tools/{,s}bin/*

rm -rf /tools/{,share}/{info,man,doc}
find /tools/{lib,libexec} -name \*.la -delete

chown -R root:root $LFS/tools # 恢复root权限

进入Chroot环境

创建挂载目录并挂载:

mkdir -pv $LFS/{dev,proc,sys,run}

mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

mount -v --bind /dev $LFS/dev

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

进入Chroot环境:

chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

创建必要目录:

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v  /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}

case $(uname -m) in
 x86_64) mkdir -v /lib64 ;;
esac

mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

创建必要文件和链接:

ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin
ln -sv /tools/bin/{env,install,perl} /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib
for lib in blkid lzma mount uuid
do
    ln -sv /tools/lib/lib$lib.so* /usr/lib
done
ln -svf /tools/include/blkid    /usr/include
ln -svf /tools/include/libmount /usr/include
ln -svf /tools/include/uuid     /usr/include
install -vdm755 /usr/lib/pkgconfig
for pc in blkid mount uuid
do
    sed '[email protected]@[email protected]' /tools/lib/pkgconfig/${pc}.pc \
        > /usr/lib/pkgconfig/${pc}.pc
done
ln -sv bash /bin/sh

ln -sv /proc/self/mounts /etc/mtab

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF # passwd文件(重要)

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
kvm:x:61:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
nogroup:x:99:
users:x:999:
EOF # group文件(重要)

重新登录并设置目录权限:

exec /tools/bin/bash --login +h

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

编译安装基本系统

这里和编译临时系统部分是差不多的,不过到了这里就基本不会出错了,但是包多了很多,你可以自行选择剔除不需要的包

过掉了前面的几个包之后需要调整工具链:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

gcc -dumpspecs | sed -e '[email protected]/[email protected]@g'                   \
    -e '/\*startfile_prefix_spec:/{n;[email protected]*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;[email protected][email protected] -isystem /usr/[email protected]}' >      \
    `dirname $(gcc --print-libgcc-file-name)`/specs

在这里最好检查一下:

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log

readelf -l a.out | grep ': /lib'
grep -B1 '^ /usr/include' dummy.log
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep "/lib.*/libc.so.6 " dummy.log
grep found dummy.log

正常情况应该显示这些:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

/usr/lib/../lib/crt1.o succeeded
/usr/lib/../lib/crti.o succeeded
/usr/lib/../lib/crtn.o succeeded

#include <...> search starts here:
 /usr/include

SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib")

attempt to open /lib/libc.so.6 succeeded

found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

删除测试文件:

rm -v dummy.c a.out dummy.log

之后就是继续解包 切换目录 编译 安装 配置 删除编译目录了(同样可以不进行测试)

但是注意不要一昧的复制粘贴

比如Groff包:

PAGE=<paper_size> ./configure --prefix=/usr

需要指定<paper_size>:

PAGE=A4 ./configure --prefix=/usr
make -j1 # 且必须单线程编译
make install

PS:GRUB和VIM你可以选择不安装

最后还需要调整工具链:

save_lib="ld-2.27.so libc-2.27.so libpthread-2.27.so libthread_db-1.0.so"

cd /lib

for LIB in $save_lib; do
    objcopy --only-keep-debug $LIB $LIB.dbg 
    strip --strip-unneeded $LIB
    objcopy --add-gnu-debuglink=$LIB.dbg $LIB 
done    

save_usrlib="libquadmath.so.0.0.0 libstdc++.so.6.0.24
             libmpx.so.2.0.1 libmpxwrappers.so.2.0.1 libitm.so.1.0.0
             libcilkrts.so.5.0.0 libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug $LIB $LIB.dbg
    strip --strip-unneeded $LIB
    objcopy --add-gnu-debuglink=$LIB.dbg $LIB
done

unset LIB save_lib save_usrlib

logout

chroot $LFS /tools/bin/env -i          \
    HOME=/root TERM=$TERM              \
    PS1='(lfs chroot) \u:\w\$ '        \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /tools/bin/bash --login

/tools/bin/find /usr/lib -type f -name \*.a \
   -exec /tools/bin/strip --strip-debug {} ';'

/tools/bin/find /lib /usr/lib -type f \( -name \*.so* -a ! -name \*dbg \) \
   -exec /tools/bin/strip --strip-unneeded {} ';'

/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \
    -exec /tools/bin/strip --strip-all {} ';'

清理:

rm -rf /tmp/*

chroot "$LFS" /usr/bin/env -i          \
    HOME=/root TERM="$TERM"            \
    PS1='(lfs chroot) \u:\w\$ '        \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /bin/bash --login

rm -f /usr/lib/lib{bfd,opcodes}.a
rm -f /usr/lib/libbz2.a
rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a
rm -f /usr/lib/libltdl.a
rm -f /usr/lib/libfl.a
rm -f /usr/lib/libfl_pic.a
rm -f /usr/lib/libz.a 
find /usr/lib -name \*.la -delete # 可选删除

配置系统

到了这里基本没什么好说的,跟着官方文档走一遍就是了 :-P
(如果你又不了解的地方评论给我就行 我会加上说明)

让LFS可启动

到这里就是先编译内核了

至于配置内核我就不累赘了(我博客有写

但是官方文档没说UEFI咋整

这里推荐在宿主系统上安装efibootmgr添加LFS的启动项

卸载一波文件系统就可以重启系统看看能不能正常启动了:

logout

umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/run
umount -v $LFS/proc
umount -v $LFS/sys

umount -v $LFS

umount -v $LFS/usr
umount -v $LFS/home
umount -v $LFS

shutdown -r now

最后你就可以按这个套路去折腾BLFS了,嘿嘿嘿

树梅派安装Gentoo
操作系统 YangMame · 1月前

前言

其实Gentoo的arm stage3已经很久没更新了
我曾也想自己维护个stage3,但是精力不够(主要还是因为树梅派上更新Gentoo太慢了)
如果你是Rpi3,请使用这个:gentoo-on-rpi3-64bit(带有桌面)
本教程安装的是32位的Gentoo系统
我这里呢 也只会说最简单粗暴的安装方法(因为我也没折腾交叉编译什么的,太麻烦了)

准备

  • 风扇(编译Gentoo发热很厉害)
  • 俩个耐操的TF卡(虽然一个也可以,但是不方便)
  • 一个已正常运行的Linux系统(我才懒得在Windows上折腾这个)
  • 一个局域网代理(下载/克隆源码用)

准备宿主系统

这里其实用什么系统都无所谓,但是要确保是32位的系统(已知Arch全部更新为64位系统)否则不能Chroot

这里就说Raspbian

这个安装最容易

写入镜像后

在TF卡中的Boot分区新建ssh文件

在你电脑的Linux系统中切换到root用户查看shadow文件:cat /etc/shadow复制root:xxxx一行

然后在root用户下编辑TF卡根目录中的etc/shadow文件删掉root一行并粘贴先前的内容

最后确保TF卡根目录中etc/ssd/sshd_confgPermitRootLogin没有被#注释且后面为yesPermitRootLogin yes

安装Gentoo

插卡,上电

找到树梅派的IP:ssh [email protected]

登录密码为你电脑系统中的root密码

自行简单配置下系统

用读卡器把另一个TF卡插入到树梅派

创建挂载目录:mkdir /mnt/gentoo

运行fdisk -l查看另一个TF卡的名字,例如/dev/sda

使用你自己喜欢的工具进行分区,例如:

/dev/sda1    100M    /boot
/dev/sda2    512M/1G    swap
/dev/sda3    Free    /

挂载分区:mount /dev/sda3 /mnt/gentoo

下载stage3:wget http://gentoo.osuosl.org/releases/arm/autobuilds/current-stage3-armv7a_hardfp/stage3-armv7a-20161129.tar.bz2 -O /mnt/gentoo/stage3.tar.bz2(请export http_proxy=ip:port设置代理下载,或去镜像站下载)

解压:tar xfpj /mnt/gentoo/stage3.tar.bz2 -C /mnt/gentoo/

挂载boot:mount /dev/sda1 /mnt/gentoo/boot

下载portage:wget http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2

解压portage:tar xjf portage-latest.tar.bz2 -C /mnt/gentoo/usr

安装内核和模块:

cd /tmp/
git clone --depth 1 https://github.com/raspberrypi/firmware/ #请为git设置代理,例如:git config --global https.proxy 'socks5://127.0.0.1:1080'
cd firmware/boot
cp -r * /mnt/gentoo/boot/
cp -r ../modules /mnt/gentoo/lib/

配置fstab:nano /mnt/gentoo/etc/fstab

修改为:

/dev/mmcblk0p1        /boot        auto        noauto,noatime    1 2
/dev/mmcblk0p3        /        ext4        noatime        0 1
/dev/mmcblk0p2        none        swap        sw        0 0

编辑启动参数:nano /mnt/gentoo/boot/cmdline.txt

写入:dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p3 rootfstype=ext4 elevator=deadline rootwait

设置时区:
cp /mnt/gentoo/usr/share/zoneinfo/Asia/Shanghai /mnt/gentoo/etc/localtime
echo "Asia/Shanghai" > /mnt/gentoo/etc/timezone

更新配置系统

chroot进入系统:

mount -t proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm

chroot /mnt/gentoo /bin/bash

设置root密码:passwd

配置make.conf:nano /etc/portage/make.conf

自行加入/修改:


GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/"
ACCEPT_LICENSE="*"
ACCEPT_KEYWORDS="~* ~arm"

L10N="en-US zh-CN en zh"
LINGUAS="en_US zh_CN en zh"

EMERGE_DEFAULT_OPTS="--verbose=y --keep-going --with-bdeps=y"
MAKEOPTS="-j1"

配置package.use:nano /etc/portage/package.use

写入:

dev-lang/python sqlite
net-misc/connman iptables
net-wireless/wpa_supplicant dbus

创建gentoo repo配置:

mkdir /etc/portage/repos.conf
nano /etc/portage/repos.conf/gentoo.conf

写入:

[DEFAULT]
main-repo = gentoo

[gentoo]
location = /usr/portage
sync-type = rsync
sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/
# sync-uri = https://github.com/gentoo/gentoo
auto-sync = yes

选择profile:

eselect profile list
eselect profile set X #选择自己需要的profile

更新系统:

emerge --sync
nohub emerge -auqDN @world > /tmp/emerge.log &

通过tail -f /tmp/emerge.log查看进度

现在你可以随时断开ssh连接

如果看到因为错误退出,运行emerge -auvDN @world进行排错

Raspbian可能会因为自己性能低下直接挂掉。。。这时候需要你重新挂载分区并chroot

(一万年过去之后)

清理旧包:emerge --depclean

安装配置一些必要东西

安装必要软件:emerge connman chronyd

配置服务:

rc-update add swclock boot
rc-update del hwclock boot
rc-update add chronyd default
rc-update add connman default
rc-update add sshd default

配置ssh:nano /etc/ssh/sshd_config,去掉PermitRootLogin前的#注释并修改后面为yesPermitRootLogin yes

结尾

到了这里你就可以关机换上TF卡启动了

找到IP并ssh [email protected]:port连接

至于细节的配置我就懒得说了

参考链接:Raspberry Pi/Quick Install Guide

Gentoo安装教程
操作系统 YangMame · 1月前

这可能是除了官方wiki写的最全的教程了

(可能还存在错误之处,欢迎指出)

准备:

  1. 至少一个人
  2. 一双能打字的手
  3. 一个能思考的脑袋
  4. 俩部电影
  5. 至少一台正常的电脑
  6. 一个正常的U盘
  7. 一个稳定的网络环境
  8. 一个稳定的电源
  9. 一个已能完美运行的系统.(如果你是Linux系统则不需要下一个)
  10. 一个Ubuntu ISO镜像文件

如果你是Windows系统:
下载Rufus刻录Ubuntu镜像
至于UEFI Legacy GPT和MBR等我就不说了,如果不熟悉这些玩Gentoo恐怕困难重重

如果你已有一个正常运行的Linux,恭喜,安装Gentoo会简单很多.
安装完并确定可用之后之后你可以tar打包已安装的系统使用live CD解压过去并修改相关配置

需要知道的一些东西

Gentoo有很多好用的工具
这里说下安装过程会遇到的

eselect可以用来配置系统

比如eselect python set X可以设置默认的python(eselect python list查看可用选项)
eselect fontconfig enable X可以启用xxx字体配置(eselct fontconfig list查看可用选项)

etc-update可以用来更新or生成配置文件

假如系统更新了软件 有新的配置文件 Gentoo会生成一个临时的配置文件,需要自己手动删除 合并或覆盖 可以通过运行etc-update进行

记住,要尽量保证emerge提示无可用更新的配置文件(特别是更新portage的配置文件的时候)

准备磁盘

启动到live CD(已有Linux系统忽略这句)
使用你喜欢的工具进行分区(或者直接用gparted)
这里会声明下分区,之后的过程将使用这些变量

UEFI(GPT):

sda1 ---/boot--->vfat                   >=200M     #注意分区设置flags为esp
sda2 ---/--->ext4,btrfs,xfs,jfs.etc     >=20G      #建议至少20G大小
sda3 ---swap--->                        >=2G       #除非你16G内存,即使你8G内存也建议设置2G的swap

Legacy(MBR):

sda1 ---/boot--->ext2                   >=200M     #可以不设置此分区
sda2 ---/--->ext4,btrfs,xfs,jfs.etc     >=20G      #建议至少20G大小
sda3 ---swap--->                        >=2G       #除非你16G内存,即使你8G内存也建议设置2G的swap

创建目录:

mkdir -v /mnt/gentoo

挂载目录:

mount -v /dev/sda2 /mnt/gentoo

安装基本文件

在这里你需要选择一个镜像站,在这里列出几个速度比较快的镜像站,请亲自测试选择镜像站:

USTC
TUNA
163

进入镜像站的/gentoo/releases/amd64/autobuilds/目录

如果你对systemd没有刚需则进入current-stage3-amd64/目录选择最新的stage3下载到本地的/mnt/gentoo目录,例如:stage3-amd64-20171019.tar.bz2

如果你需要systemd,则进入current-stage3-amd64-systemd/目录选择最新的stage3下载到本地的/mnt/gentoo目录,例如:stage3-amd64-systemd-20171018.tar.bz2

下载完成之后进入gentoo的根目录并解压文件:

cd /mnt/gentoo
tar vxpf stage3-*.tar.bz2或xz --xattrs-include='*.*' --numeric-owner

配置make.conf和Portage Mirror

以下参数在经过自己调整或选择之后加入到 /mnt/gentoo/etc/portage/make.conf

  1. USE: 首先,你可以删掉默认的USE标记 (不了解USE的情况下建议如此)
  2. CFLAGS: 将CFLAGS修改为CFLAGS="-march=native -O2 -pipe" 或者你也可以指定.例如大部分Intel桌面级CPU都是haswell,将native换成haswell就行(不确定就不要指定)
  3. MAKEOPTS: 根据你的CPU核心数设置MAKEOPTS例如硬双核设置为MAKEOPTS="-j5"
  4. GENTOO_MIRRORS: 设置为GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/" 请自行选择速度最快的Mirror
  5. EMERGE_DEFAULT_OPTS: 设置为EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y"是个不错的选择,keep going意为安装一堆软件时遇到编译错误自动跳过这个软件继续编译安装
  6. FEATURES: 在这里最好写成# FEATURES="${FEATURES} -userpriv -usersandbox -sandbox",最好在前面加上#注释掉,在你编译软件遇到权限不足时去掉注释即可解决问题
  7. ACCEPT_KEYWORDS: 如果你不想你的系统里面有千年前的垃圾软件就加上ACCEPT_KEYWORDS="~amd64"
  8. ACCEPT_LICENSE: 加上ACCEPT_LICENSE="*"表示此系统接受所有软件许可证,即不论非自由还是自由软件都接受,我们这样的桌面非商业用户基本不需要考虑
  9. L10N: 设置为L10N="en-US zh-CN en zh"
  10. LINGUAS: 设置为LINGUAS="en_US zh_CN en zh"
  11. VIDEO_CARDS: 根据你的显卡类型设置假如你是NVIDIA单显卡则设置为VIDEO_CARDS="nvidia"(闭源驱动)VIDEO_CARDS="nouveau"(开源驱动).还有radeon和intel,但如果你是双显卡例如Intel+NVIDIA则设置为VIDEO_CARDS="intel i965 nvidia"(只要不是远古的集成显卡都是用i965)
  12. GRUB_PLATFORMS: 如果你使用GRUB且使用UEFI启动则添加GRUB_PLATFORMS="efi-64"(我现在用efibootmgr,也推荐在系统能使用且内核是自己配置精简的情况下使用这个)
  13. Portage Mirror: 这个不是make.conf的选项.mkdir /mnt/gentoo/etc/portage/repos.conf创建repos.conf目录并添加如下到/mnt/gentoo/etc/portage/repos.conf/gentoo.conf文件里面(自行选择速度最快的镜像站):
[gentoo]
location = /usr/portage
sync-type = rsync
#sync-uri = rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage/
sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/
auto-sync = yes
  1. 这里还有个CPU_FLAGS_X86,在后面的步骤emerge --sync之后安装app-portage/cpuid2cpuflags并配置:
emerge --ask app-portage/cpuid2cpuflags
cpuid2cpuflags #将输出值改入CPU_FLAGS_X86

进入Chroot环境

复制DNS:

cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

挂载必要文件系统:

mount -t proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

Debian等发行版可能需要:

test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm

进入Chroot:

chroot /mnt/gentoo /bin/bash
source /etc/profile

如果你有boot分区则在这里挂载上去:

mount /dev/sda1 /boot

选择Profile并更新系统

使用快照更新Portage:

emerge-webrsync

使用rsync同步:

emerge --sync

使用eselect news read命令阅读新闻

列出profile:

eselect profile list

如果你使用systemd则需要选上带有systemd字样的选项

如果你不使用systemd则不建议使用GNOME桌面,因为GNOME桌面依赖systemd(辣鸡)

例如不使用systemd且使用KDE桌面则选择19 default/linux/amd64/17.0/desktop/plasma:

eselect profile set 19

然后就是漫长的更新了(有钱人当我没说):

emerge -auvDN --with-bdeps=y @world

如果碰到未满足的xxx或者其它提示:

emerge -auvDN --with-bdeps=y --autounmask-write @world
etc-update # 然后输入-3就能更新配置,确保再次运行时没有可更新的文件
emerge -auvDN --with-bdeps=y @world

如果以上还是不能解决问题,则进入/etc/portage目录删掉package.use,package.mask和package.unmask文件或目录再次尝试

到了这里,你可以去看电影了...

等它跑完了,先别急
运行下这几个命令:

emerge @preserved-rebuild
perl-cleaner --all
emerge -auvDN --with-bdeps=y @world

确定没有更新之后再继续

配置时区和地区

echo "Asia/Shanghai" > /etc/timezone
emerge --config sys-libs/timezone-data

echo "en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8" >> /etc/locale.gen

locale-gen

eselect locale list

这里建议使用英语易于排错,之后你可以自行换成中文:

eselect locale set 2

配置fstab,安装文件系统工具

如果你和我一样懒

可以下载此脚本自动配置fstab(引自Arch的genfstab):

wget https://raw.githubusercontent.com/YangMame/Gentoo-Installer/master/genfstab
chmod +x genfstab
#可选 cp genfstab /usr/bin/
./genfstab / > /etc/fstab
nano /etc/fstab #最好检查下此文件,删掉无用挂载点

上面的脚本在chroot环境下不能正常使用-U参数在fstab写入分区的UUID

挂载点主要有俩种格式:

/dev/sda1    /boot    vfat或ext2    defaults    0 0
/dev/sda2    /    ext4或btrfs,jfs,xfs.etc    defaults    0 0
/dev/sda3    none    swap    defaults    0 0

这里的UUID通过blkid查看

UUID=xxxxxxxxxxx   /boot    vfat或ext2    defaults    0 0
UUID=xxxxxxxxxxx    /    ext4或btrfs,jfs,xfs.etc    defaults    0 0
UUID=xxxxxxxxxxx    none    swap    defaults    0 0

如果你使用非ext4文件系统则在编译内核前需要另外安装相应的工具:

btrfs: emerge sys-fs/btrfs-progs
xfs: emerge sys-fs/xfsprogs
jfs: emerge sys-fs/jfsutils

安装NetworkManager

没错,我很懒,又加上我是KDE桌面用户,所以我选择使用NetworkManager连接网络:

emerge -av networkmanager

如果它说有未满足的xxxx或者其它提示:

emerge --autounmask-write networkmanager
etc-update --automode -3
emerge networkmanager

openRC(即非systemd)添加开机服务:

rc-update add NetworkManager default

systemd添加开机服务:

systemctl enable NetworkManager

在/etc/conf.d/hostname内修改主机名,例如:

echo hostname=\"Test\" > /etc/conf.d/hostname

安装一些必要工具并配置

emerge app-admin/sysklogd sys-process/cronie sudo layman grub
sed -i 's/\# \%wheel ALL=(ALL) ALL/\%wheel ALL=(ALL) ALL/g' /etc/sudoers
passwd #是时候设置root密码了

如果你是systemd:

sed -i 's/\# GRUB_CMDLINE_LINUX=\"init=\/usr\/lib\/systemd\/systemd\"/GRUB_CMDLINE_LINUX=\"init=\/usr\/lib\/systemd\/systemd\"/g' /etc/default/grub
ln -sf /proc/self/mounts /etc/mtab
systemd-machine-id-setup

非systemd系统:

rc-update add sysklogd default
rc-update add cronie default

配置编译安装内核

有以下推荐内核可供选择:

gentoo-sources
ck-sources
git-sources

这里示例使用gentoo-sources:

emerge -av gentoo-sources

如果你不会配置内核或者时间不允许可以先用genkernel:

emerge -av genkernel
genkernel --menuconfig all
genkernel --install initramfs

手动配置内核:

cd /usr/src/linux
make menuconfig

关于配置内核

本站有写内核配置的文章

你也可以选择去看金步国的文章

配置完之后:

make -jX #将X替换为你想编译时的线程数
make modules_install
make install
genkernel --install initramfs

安装GRUB并创建用户

如果你是UEFI:

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Gentoo
grub-mkconfig -o /boot/grub/grub.cfg

如果出现No space left on device

请运行:

mount -t efivarfs efivarfs /sys/firmware/efi/efivars
rm /sys/firmware/efi/efivars/dump-*

然后重试(由 @Chara 提议加上)

如果你是Legacy:

grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

创建一个管理员并设置密码:

useradd -m -G users,wheel,portage,usb,video 这里换成你的用户名(小写)
passwd 用户名

显卡驱动

NVIDIA单显卡:

emerge -av x11-drivers/nvidia-drivers

Intel单显卡:

emerge -av x11-drivers/xf86-video-intel

Intel+NVIDIA双显卡请看这篇文章

其它显卡硬件待补坑 欢迎提出

检查系统可用性

到了这里你应该可以重启查看系统是否能正常启动,然后在安装桌面

重启前最好检查下的东西:

  1. boot目录是否有相应文件
  2. GRUB是否正确生成配置并显示内核等文件
  3. fstab是否正确无误

安装桌面

首先需要确保已安装xorg-server和显卡驱动:

emerge -av xorg-server
emerge xf86-video-intel #Intel显卡驱动
emerge nvidia-drivers #nvidia显卡驱动

如遇需要更新配置则运行etc-update --automode -3并再次运行命令

KDE:

emerge -av plasma-desktop plasma-nm plasma-pa sddm konsole

如遇需要更新配置则运行etc-update --automode -3并再次运行命令

如果你是systemd:

systemctl enable sddm

openrc则编辑/etc/conf.d/xdmDISPLAYMANAGER的值改为sddm并:

rc-update add xdm default

GNOME:

emerge -av gnome-shell gdm gnome-terminal
systemctl enable gdm

如遇需要更新配置则运行etc-update --automode -3并再次运行命令

这里只说明systemd,因为openrc并不能满足GNOME的依赖

不使用initramfs启动系统

进入目录并打开配置界面:

cd /usr/src/linux
make menuconfig

进入 General Setup关掉Initial RAM filesystem and RAM disk (initramfs/initrd) support

如果你的fstab用的是UUID,则建议先改成/dev/sdX的格式

把你所有的modules编译进内核即built-in状态

然后开始编译吧

这里我就不说GRUB相关的配置了,因为我没有尝试过,具体请看这里

用的是接下来要说的efibootmgr启动系统

使用efibootmgr启动系统

进入目录并打开配置界面:

cd /usr/src/linux
make menuconfig

你要确保已启用所有必须的efi相关选项

进入 Processor type and features 搜索 Built-in kernel command line 并启用
然后会出现 Built-in kernel command string
填入 root=/dev/sda2或者root=PARTUUID=xxxx
sda2换成你实际的根目录所在分区或通过blkid查看根分区的PARTUUID

然后开始编译吧

首先确保efibootmgr已安装:

emerge -av efibootmgr

创建目录(可选):

mkdir -p /boot/efi/boot

将你的内核复制到对应目录(或者直接复制到boot):

cp /boot/vmlinuz-* /boot/efi/boot/bootx64.efi

查看是否已挂载efivars:

mount | grep efivars

重新挂载efivars为可读写:

mount -o remount,rw -t efivarfs efivarfs /sys/firmware/efi/efivars

这里说下efibootmgr的参数:

--create (-c) 创建新的启动项
--part (-p) efi分区的的序号,假设是/dev/sda2 则值为2
--disk (-d) efi分区所在的磁盘,例如/dev/sda
--label (-L) 启动项的名称
--loader (-l) 可启动的efi文件所在处(efibootmgr路径用的是\不是/)

示例添加启动项:

efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo" --loader "\efi\boot\bootx64.efi"

这里也简单说下删除启动项的参数:

--bootnum (-b) 启动项的识别号(通过efibootmgr -v查看,例如Boot0001则值为1)
--delete-bootnum (-B) 进行删除

删除示例:

efibootmgr -b 2 -B

Intel-ucode编译进内核

进入目录并打开配置:

cd /usr/src/linux
make menuconfig

确保在Processor type and features里已选上CPU microcode loading support和你对应的CPU microcode loading support例如Intel CPU选中Intel microcode loading support

然后进入Device Drivers ---> Generic Driver Options启用Include in-kernel firmware blobs in kernel binary

Firmware blobs root directory填入: /lib/firmware/

另开终端安装源文件(注意查看这里的输出):

emerge -av sys-firmware/intel-microcode

查看你的microcode:

dmesg | grep microcode

查看sig值,例如sig=0x306c3

然后查看intel-ucode文件:

ls /lib/firmware/intel-ucode

你就会找到与sig值对应的06-3c-03(前面安装时会输出对应的microcode)

最后在External firmware blobs to build into the kernel binary填入:

intel-ucode/06-3c-03

如果在编译时无报错就OK了

更新内核重启之后运行dmesg | grep microcode应该看到类似如下的输出:

[    0.000000] microcode: microcode updated early to revision 0x22, date = 2017-01-27
[    0.579838] microcode: sig=0x306c3, pf=0x20, revision=0x22
[    0.579948] microcode: Microcode Update Driver: v2.2.

让内核显示中文

需要打patch:

0000-feature-univt.patch

运行:
patch -p1 -N -d /usr/src/linux < /path/to/0000-feature-univt.patch

然后重新编译即可

等我想到,暂时就写这么多