页次: 1
原因
PulseAudio和Pipewire经常同时安装到系统中,于是gentoo对其各自增加了USE标志,由用户来控制使用哪一个作为声音服务。
解决
cd /etc/portage/package.use/
touch ./list ##同目录底下还有一个zz-autounmask文件,list是自己的
我是使用PipeWire作用声音服务的,所以需要在/etc/portage/package.use/list中添加
media-video/pipewire sound-server
media-sound/pulseaudio -daemon
如果是使用PulseAudio作为声音服务,则在/etc/portage/package.use/list中添加
media-video/pipewire -sound-server
media-sound/pulseaudio daemon
然后更新系统
emerge -a -uvDU @world
最后重启下pipewire.socket pipewire-pulse.socket或者pulseaudio.service pulseaudio.socket
新二进制快速配置手册页:https://wiki.gentoo.org/wiki/Binary_package_quickstart
旧二进制配置手册页:https://wiki.gentoo.org/wiki/Binary_package_guide
国内新闻页:https://linux.cn/article-16528-1.html
我的配置
sudo mkdir -p /etc/portage/binrepos.conf/
sudo touch /etc/portage/binrepos.conf/gentoobinhost.conf
sudo nano /etc/portage/binrepos.conf/gentoobinhost.conf
##nano start##
[binhost]
priority = 9999
sync-uri = https://mirrors.tuna.tsinghua.edu.cn/ge … .1/x86-64/
#sync-uri = https://mirrors.aliyun.com/gentoo/relea … .1/x86-64/
#sync-uri = https://mirrors.ustc.edu.cn/gentoo/rele … .1/x86-64/
#国内有同步镜像源,可自己找喜欢的源
##nano end##
软件包签名验证
现在,启用Portage功能,要求验证GPG签名:binpkg-request-signature
sudo nano /etc/portage/make.conf
##nano start##
FEATURES="${FEATURES} binpkg-request-signature"
##nano end##
在过去,/etc/portage/gnupg可能是用于验证Gentoo仓库的旧方法。如果这个文件存在,/etc/portage/getuto将不会覆盖它,但可能缺少正确的设置。如果在校验二进制包时遇到问题,请备份旧目录,然后再次运行 getuto:
sudo mv /etc/portage/gnupg /etc/portage/gnupg.bak
sudo getuto ###生成二进制包校验密钥环,getuto是新工具
#要使用二进制安装单个软件包,请使用以下命令:
sudo emerge --ask --verbose --getbinpkg app-editors/nano
#或者使用等价简写:
sudo emerge -avg app-editors/nano
#系统更新
#要使用二进制包执行完整的系统更新,请使用:
sudo emerge --ask --verbose --update --deep --changed-use --getbinpkg @world
#或者使用等价简写:
sudo emerge -avuDUg @world
在正常情况下,如果服务器没有现成的二进制包,将拉取源代码进行编译。
以下是emerge时一些有用的设置,可以通过emerge命令行或在emerge命令行上应用,以改善使用Gentoo二进制包的体验。EMERGE_DEFAULT_OPTSmake.conf
--getbinpkg (-g)
当服务器上有合适的二进制包时,添加将自动下载并使用二进制包。如果没有找到合适的二进制包,则会像往常一样从源码编译包。--getbinpkg
--usepkgonly (-K)
使用会告诉Portage只使用二进制包,如果本地找不到合适的二进制包或(用-g)下载,则退出。--usepkgonly
--with-bdeps=y
这可以设置为 y(es) 或 n(o),并控制是否下载和/或安装包的构建依赖项。 对于二进制包安装,默认为 no。对于基于源代码的安装,生成依赖项 是必需的,因此也相应地安装。
--binpkg-respect-use=y
本文介绍构建 gentoo 系统的编译器选择方案,及一些尤其引起的 bug 的解决方案,不涉及选择编译器的专业观点。
简介
众所周知 Gentoo 系统完全在本地构建。因此编译器的选择很大程度上决定了编译系统的耗时以及整个系统的性能。
用于构建整个 Gentoo 系统的编译器只推荐两个,gcc 与 clang。
gcc 由 GNU 出品,与 GNU linux 自然匹配度更高。因此选择 gcc 作为编译器是最稳妥的方案。
clang 被苹果公司支持,近年来发展速度迅速,也具备许多 gcc 不具备的特性。但 clang 编译 linux 系统尚不稳定。
目前,绝大多数使用 clang 编译出错的 bug 已有解决方案。但部分软件,比如 gcc、linux 内核等必须使用 gcc 构建。因此即便你选择 clang 作为主编译器,也必须保留 gcc 作为辅助编译器。
使用 gcc 作为主编译器
gcc 是 gentoo 的默认编译器,且比较稳定,这里不作太多说明。
只是需要注意一点,测试分支的 gcc 存在许多不稳定因素,可能会造成编译错误。考虑到编译器对于系统的重要性,强烈建议保留稳定分支的 gcc。
gcc 版本选择
# 查看系统中的gcc版本
gcc-config --list-profiles
# 选择需要的gcc
gcc-config number
# 刷新配置
source /etc/profile
使用 clang 作为主编译器
详见gentoo wiki
关于 clang 的安装,可以参考上面的链接。这里主要介绍将 clang 作为主编译器的必要配置。
首先,在make.conf中作如下设置。
CC = clang
CXX = clang++
此时,clang 已经成为系统的默认编译器。接下来设置备选方案,即当软件无法用 clang 编译时,使用 gcc 编译。
在/etc/portage/env目录下创建compiler-gcc,写入
CC = gcc
CXX = g++
然后在/etc/portage/package.env文件中写入如sys-devel/gcc compiler-gcc的内容,即可将该包的编译器设置为 gcc。
这一步可以通过app-portage/flaggie工具自动完成。其指令为flaggie app-foo/bar +compiler-gcc。
至此,配置完毕。当发现 clang 无法编译某软件而 gcc 可行时只需将其加入上述文件即可。
编译选项
这里的编译选项主要指优化选项。为提高系统性能,你可以设置编译优化选项。但由此带来的问题是编译时间大大增长,更容易遇到 bug,过多的或者不合理的优化选项导致性能反而下降。
这里不介绍配置优化选项的具体内容,只通过大致的感受给出一个建议。基于亲身体会,优化与不优化差别并不大,至少以人的感官很难感觉出来。因此这里建议新手不要开启优化选项,至少是过多的优化选项,除非你是为了折腾。
就前文提到的 gcc 备选方案的配置,你也可以将其运用到为具体的包选择性开启优化选项。比如编辑/etc/portage/env/compiler-gcc-flto。
CC="gcc"
CXX="g++"
CFLAGS="-flto -march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
AR="gcc-ar"
NM="gcc-nm"
RANLIB="gcc-ranlib"
再在/etc/portage/package.env中设置包的编译方案即可。
原文链接:https://blog.csdn.net/niuiic/article/details/109151174
sudo emerge --ask v2rayA
* IMPORTANT: 3 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.
These are the packages that would be merged, in order:
Calculating dependencies... done!
Dependency resolution took 1.13 s.
!!! All ebuilds that could satisfy "v2rayA" have been masked.
!!! One of the following masked packages is required to complete your request:
- net-proxy/v2rayA-9999::gentoo-zh (masked by: missing keyword)
- net-proxy/v2rayA-2.0.4::gentoo-zh (masked by: ~amd64 keyword)
For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.
wget https://objects.githubusercontent.com/g … tet-stream
or go to https://github.com/v2rayA/v2rayA/releases get one debain*amd.deb
dpkg to install it
启动 v2rayA
sudo systemctl start v2raya.service
设置开机自动启动
sudo systemctl enable v2raya.service
通过 2017 端口 如 http://localhost:2017 访问 UI 界面。
or to use
net-proxy/v2ray
dev-libs/v2ray-geoip-bin
dev-libs/v2ray-domain-list-community-bin
一、计算机基础
《深入理解计算机系统》
《鸟哥的Linux私房菜》
《TCP/IP详解(卷1:协议)》
《HTTP权威指南》
《Wireshark数据包分析实战》
《Wireshark网络分析的艺术》
《Wireshark网络分析就这么简单》
二、网络渗透
《白帽子讲Web安全》
《Web安全深度剖析》
《SQL注入天书》
《Web前端黑客技术揭秘》
《黑客攻防技术宝典:Web实战篇》
《metasploit渗透测试指南》
《黑客大曝光》
三、逆向分析
《加密与解密》
《IDA权威指南》
《C++反汇编与逆向分析技术揭秘》
《Windows PE权威指南》
《Android软件安全与逆向分析》
《iOS应用逆向工程(第2版)》
《逆向工程权威指南》
《恶意代码分析艺术》
《软件调试》
四、漏洞攻击
《漏洞战争》
《0day安全:软件漏洞分析技术(第2版)》
《CTF竞赛权威指南》《黑客之道漏洞发掘的艺术》
五、系统内核安全
《Windows内核原理与实现》
《Linux内核设计与实现》
《Rootkits——Windows内核的安全防护》
《天书夜读:从汇编语言到Windows内核编程》
《寒江独钓:Windows内核安全编程》
看完才入门
如果是家庭版安装 Hyper-V 失败可以尝试另一个脚本 Install_Hyper-V.bat
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
安装 Stage 3
在 Gentoo mirror 找符合自己电脑架构的 stage3 文件
若要用 cuda 不建议选带 musl 的,因为 cuda 只支持 glibc
若要用 mingw 建议不用 clang 的,gentoo 上对 clang-mingw 支持不佳
我选了 stage3-amd64-openrc-20221002T170543Z.tar.xz
解压成 tar 放到一个文件夹里(WSL 貌似只支持 tar.gz 和 tar),运行
wsl --import <取个名字> <安装位置> <stage3 tar文件> --version 2
# 例如
wsl --import Gentoo . stage3-amd64-openrc-20221002T170543Z.tar --version 2
# wsl --set-default <名字> # 如果有多个 WSL 发行版,设为默认
稍等片刻就能拿到热腾腾的、包含stage3的 ext4.vhdx 了。接着就靠 WSL 自带的 kernel 启动我们的Gentoo!
wsl -d <名字>
配置 Stage 3
参考 Gentoo AMD64 Handbook
配置编译选项
nano -w /etc/portage/make.conf
# 这些设置是由自动构建此阶段的“催化”(catalyst)构建脚本设置的。
# 请查阅 /usr/share/portage/config/make.conf.example
# 以获取一个更详细的示例。
COMMON_FLAGS="-O2 -pipe -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
MAKEOPTS="-j4" # make 时使用四线程
# 注意:这个阶段是在启用了 bindist Use 标志的情况下构建的
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"
# 这将把构建输出的语言设置为英语。在报告错误时,请保持此设置不变。
LC_MESSAGES=C
USE="-X " # 禁用图形
ACCEPT_LICENSE="*" # 允许一切证书 _(:з」∠)_
# 镜像
GENTOO_MIRRORS="https://mirrors.163.com/gentoo/ https://mirrors.aliyun.com/gentoo/"
按 Ctrl+x 保存退出
配置 Portage
# 创建repos.conf目录
mkdir --parents /etc/portage/repos.conf
# 复制 Portage 提供的 Gentoo 仓库配置文件到这个(新创建的)目录
cp /usr/share/portage/config/repos.conf /etc/portage/repos.conf/gentoo.conf
# 更新内容
emerge-webrsync
配置 CPU_FLAGS_*
一些架构(包括 AMD64/X86、ARM、PPC)有称为 CPU_FLAGS_ARCH 的 USE_EXPAND 变量(请酌情将 ARCH 替换为相关的系统架构)。
用于构建编译特定的汇编代码或其他内置函数——通常是手写的或其他额外的, 并且与要求编译器输出针对某个 CPU 功能的优化代码不同。
emerge app-portage/cpuid2cpuflags
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
# emerge sys-kernel/linux-firmware # 不建议,占用空间大
语言设置*
echo zh_CN.UTF-8 UTF-8 >> /etc/locale.gen
locale-gen
eselect locale list
eselect locale set <选择 zh_CN.UTF-8 UTF-8 >
echo LC_COLLATE=\"C.UTF-8\" >>/etc/env.d/02locale
. /etc/profile
env-update
其他配置
# 设置历史记录格式
echo export HISTTIMEFORMAT=\"%F %T \`whoami\` \">>/etc/profile
# sed -i.bak '/[c|C]lear/'d /etc/skel/.bash_logout # 取消注销时清屏
# 添加用户
groupadd admin
emerge app-admin/sudo dev-vcs/git
echo %admin ALL=\(ALL\) ALL >> /etc/sudoers
useradd <你的名字> -g admin
# echo min=1,1,1,1,1>> /etc/security/passwdqc.conf # 禁用密码强度检查
passwd <你的名字>
echo <user> >>/etc/wsl.conf
echo default = <你的名字> >>/etc/wsl.conf
su <你的名字>
# 解决 libcuda.so.1 is not a symbolic link
CUDAPATH=/mnt/c/Windows/System32/lxss/lib
rm $CUDAPATH/libcuda.so.1 $CUDAPATH/libcuda.so
ln -s $CUDAPATH/libcuda.so.1.1 $CUDAPATH/libcuda.so.1
ln -s $CUDAPATH/libcuda.so.1.1 $CUDAPATH/libcuda.so
~/.bashrc
# If not running interactively, don't do anything
if [[ $- != *i* ]] ; then
# Shell is non-interactive. Be done now!
return
fi
# history
HISTSIZE=100000
HISTFILESIZE=2000000
HISTIGNORE="pwd:history"
shopt -s histappend
# alias from Ubuntu
alias ll='ls -lF'
alias la='ls -A'
alias l='ls -CF'
# wsl proxy
export ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
alias wget="wget -c"
alias pwget="wget -e https-proxy=https://$ip:7890 -e http-proxy=http://$ip:7890 -c"
git config --global http.https://github.com.proxy socks5://$ip:7890
git config --global https.https://github.com.proxy socks5://$ip:7890
# Put your fun stuff here.
export PATH=$PATH:/usr/lib/wsl/lib
最近扩展 Linux 分区的时候,由于年少轻狂,没有进行全盘备份,导致系统出现了灾难性事故,软件、配置,还有最近学习 Vim,写了快一个星期的配置文件,全部丢失。重装系统后便开始寻找适合备份的文件系统,便有了这篇文章。
为什么是 Btrfs
Btrfs 是 B-tree 文件系统,通常念做 「Butter FS」、「Better FS」或「B-tree FS」。是一种支持写入时复制(CoW)的 Linux 文件系统。相对于 ext4 文件系统有以下几个优点:
Btrfs 支持快照,方便备份与恢复;
Btrfs 支持透明压缩,节省存储空间;
Btrfs 支持子卷功能,便于管理;
Btrfs 支持数据与元数据校验。
这些优点使我产生了向 Btrfs 迁移的念头,幸运的是,Btrfs 支持从 ext4 转换。
转换步骤
以下步骤是在我自用电脑上操作的,磁盘 /dev/nvme0n1p4 挂载为 Linux 根分区,下文命令可能需要调整。由于操作时需要对根分区进行操作,强烈建议操作前进行全盘备份并在 LiveCD 环境下进行操作。
注意:任何对数据的操作都是充满风险的,如果你不能承受数据丢失的风险,请勿操作。 注意:如果转换中出现任何异样,你都可以使用备份子卷 /ext2_saved 来回滚。请勿强行对转换失败的分区做出更改。使用 btrfs-convert -r /dev/target_partition 命令进行回滚。
检查文件系统
首先使用 fsck 检查磁盘,保证现有分区没有问题。
# fsck.ext4 /dev/nvme0n1p4
开始文件系统转换
分区检查通过后就可以开始转换。执行以下命令进行转换。
# btrfs-convert /dev/nvme0n1p4
待出现 conversion complete 表明转换完成。现在分区的文件系统已经是 Btrfs 了,但是还不能重启,还需要对现有的文件进行修改才能顺利引导进系统。
挂载分区并修改 fstab
首先需要挂载分区,方便我们修改文件。这里我们将分区挂载到 /mnt 目录下。
# mount /dev/nvme0n1p4 /mnt
使用磁盘工具检查分区的 UUID,这里使用 lsblk 命令。
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
nvme0n1
...
└─nvme0n1p4 btrfs ... 82xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxeb xxG xx% /mnt
使用文本编辑工具修改 /mnt/etc/fstab 文件,修改挂载到根目录的分区类型(type)为 btrfs、文件系统检查顺序(pass)为 0(启动时不进行磁盘检查),并检查转换后的分区 UUID 是否改变,修改挂载分区(file system)。
需要重新生成fstab 建议genfstab -U / >> /etc/fstab 要把全部的系统区挂载上,注意内核需要支持btrfs支持和安装btrfs文件系统支持
重建初始化内存盘
重建初始化内存盘需要在 chroot 环境中进行。首先需要设置对应的挂载点。
# mount -t proc none /mnt/proc
# mount -t sysfs none /mnt/sys
# mount -o bind /dev /mnt/dev
随后使用 chroot 命令进入原系统。
# chroot /mnt bash
进入原系统后,使用 mkinitcpio 重建初始化内存盘。这里可能需要替换命令参数,如果提示 Fail to load preset,需要检查 /etc/mkinitcpio.d 目录下是否存在对应的预设文件名。
# mkinitcpio --preset linux
如果使用 GRUB 启动,还需要重建 GRUB 引导。
TLP 设置
如果使用了 TLP 高级电源管理功能,需要对 TLP 进行设置,防止文件系统损坏。编辑位于 /mnt/etc/tlp.conf 的配置文件,找到 SATA_LINKPWR_ON_BAT 条目,取消注释并在选项中添加 max_performance 参数。
SATA_LINKPWR_ON_BAT="med_power_with_dipm max_performance"
启用透明压缩
为了能够利用 Btrfs 的透明压缩功能,可以对转换好的分区进行压缩并修改 fstab 挂载选项。
首先需要对转换好的分区进行全盘压缩。
# btrfs filesystem defragment -r -v -czstd /mnt
随后需要修改 fstab 文件,在根目录文件系统的挂载选项(options)一栏中增加 compress=zstd 选项,以便系统启动时应用压缩选项。
使用新文件系统启动及后续操作
完成上述步骤后,便可以使用转换后的分区启动。启动后,可以删除 /ext2_saved 子卷完成转换。
# btrfs subvolume delete /ext2_saved
最后通过 Balance 来回收数据。
# btrfs balance start /
# btrfs balance status /
至此,分区文件系统转换就结束了。感受新文件系统所带来的惊喜吧。
配置文件系统检修
在转换结束后,可以配置定时对根目录 / 的检修任务。
# systemctl enable --now btrfs-scrub@-.timer
或者你也可以手动执行。
# btrfs scrub start /
# btrfs scrub status /
在OpenZFS上安装Gentoo Linux
前言本指南将向您展示如何在x86_64上安装Gentoo Linux:
* UEFI-GPT (EFI System Partition - Unencrypted FAT32 partition as per UEFI Spec)
* /boot on ZFS (Featureless & Unencrypted)
* /, /home on ZFS (Encrypted ZFS if desired)
* swap on a regular partition
* OpenZFS 2.1.4
* GRUB 2.04+
* OpenRC (or systemd)
* Gentoo Stable (x86_64)
所需工具
您将需要一个包含OpenZFS的ISO。幸运的是,Gentoo管理光盘提供了所需的软件包。你可以从Gentoo下载页面下载“管理光盘”。之后,我们将使用它来制作可启动的USB。
Linux目录
对于以下命令,我们将假设您的 USB 是 /dev/sda。
格式化 USB
root #dd if=admincd-amd64-20220612T170541Z_OpenZFS_2.1.4.iso of=/dev/sda bs=1M status=progress
root #sync
windows系统
Rufus是我在Windows上推荐的USB实用程序。refus
启动refus
从“设备”下拉列表中选择您的 USB 设备。
通过单击选择选择您的 ISO。
分区方案:MBR
目标系统:BIOS 或 UEFI
卷标: 管理光盘
文件系统:FAT32
群集大小:4096 字节(默认)
单击“开始”。
通用写入磁盘镜像 balenaEtcher
gui 操作
选择gentoo_live.iso
选择驱动器
flash!!!
这应该是拥有可启动 USB 所需的全部内容。
假设
只在单个驱动器上安装Gentoo(同一池中的多个驱动器应该会自动工作)。
/boot 池是无特征且未加密的。
/boot/efi 是符合 UEFI 规范的未加密 FAT32 分区。
交换分区位于 ZFS 外部且位于专用分区上。
正在使用 GRUB 2.04+
Gentoo Admin CD (包含 OpenZFS)
Kernel: gentoo-kernel-bin
Initramfs: Bliss-initramfs
初始化:OpenRC
您可以自由地用上述任何内容代替您想要的任何内容。但是,支持将 仅在使用上述配置时由我提供。此外,本指南是方式 我安装Gentoo,不完全是手册上的方式。
将系统引导至 ISO
由于这高度依赖于计算机,因此您需要弄清楚如何启动USB 在您的系统上,然后进入实时环境。如果出现这种情况,您可能需要禁用安全启动 导致您的 USB 被拒绝。确保您的系统 BIOS/UEFI 设置为启动 UEFI 设备, 而不是 BIOS 设备(旧版)。
确认您在 UEFI 模式下启动
启动到 Live CD 后,请确保通过键入以下内容引导到 UEFI 模式:
root #ls /sys/firmware/efi
如果上述目录为空或不存在,则您未处于 UEFI 模式。 重新启动并启动到 UEFI 模式。
警告
在不处于 UEFI 模式的情况下继续安装 很可能会产生无法启动的系统。如果要在 BIOS 模式下安装,则需要不同的设置。
分区
我们现在将对驱动器进行分区,并旨在创建以下布局(对于指南的其余部分,我们将假设 /dev/nvme0n1 是您的主驱动器):
/dev/nvme0n1p1 | 512 MiB | EFI System Partition | /boot/efi
/dev/nvme0n1p2 | 1024 MiB | Boot Partition (ZFS, No Feature Flags) | /boot
/dev/nvme0n1p3 | 2048 MiB | swap | swap
/dev/nvme0n1p4 | Rest of Disk | ZFS (or Encrypted ZFS) | /, /home, ...
警告
有许多 UEFI 主板固件非常有问题。我们将尝试使用 512 MiB FAT32 分区配置来提高成功率。
在 GNU parted 中打开您的驱动器并告诉它使用最佳对齐方式:
root #parted -a optimal /dev/nvme0n1
警告
请记住,以下所有操作将立即影响磁盘。GNU parted 不会像 fdisk 或 gdisk 那样进行更改。
将单位设置为兆字节
(parted)unit mib
创建 GPT 分区布局
这将删除所有分区并创建新的 GPT 表。
(parted)mklabel gpt
创建并标记分区
(parted)mkpart esp 1 513
(parted)mkpart boot 513 1537
(parted)mkpart swap 1537 3585
(parted)mkpart rootfs 3585 -1
在 ESP 分区上设置可引导标志
(parted)set 1 boot on
最终视图
(parted)print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/nvme0n1: 40960MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1.00MiB 513MiB 512MiB primary
2 513MiB 1537MiB 1024MiB boot
3 1537MiB 3585MiB 2048MiB swap
4 3585MiB 40959MiB 37374MiB rootfs
退出应用程序
(parted)quit
格式化驱动器
创建启动分区
root #mkfs.fat -F32 /dev/nvme0n1p1
警告
此分区必须是 FAT32,因为它是 UEFI 要求。否则,您的系统将无法启动!
创建你的 zpool
创建您的 zpool,其中包含您的驱动器和数据集:
root #zpool create -f -o ashift=12 -o cachefile= -O compression=lz4 -O atime=off -m none -R /mnt/gentoo tank /dev/nvme0n1p4
如果要使用本机 zfs 加密(带有密码),只需同时指定 -O 加密=on -O keyformat=passphrase 选项即可。
创建您的 zfs 数据集
我们将保持简单,只为 / 和 /home 创建一些数据集。ZFS 非常灵活,您将来可以轻松添加或删除数据集。
root #zfs create tank/os
root #zfs create -o mountpoint=/ tank/os/main
root #zfs create -o mountpoint=/home tank/home
创建启动池
对我们来说,创建一个单独的 zpool 会更安全,该 zpool 禁用了所有功能标志。这是因为即使 grub 当前支持 ZFS 0.6.5 版本的最新功能标志,在没有适当引导加载程序支持的情况下添加到 ZFS 的新功能标志也会使您的系统无法引导。由于 GRUB 2 对没有功能标志的 zpool 有坚实的支持,我们将创建一个单独的无功能引导池。但是,我们的主系统仍将启用所有功能。
root #zpool create -f -d -o ashift=12 -o cachefile= -m /boot -R /mnt/gentoo boot /dev/nvme0n1p2
警告
切勿在启动池上进行 zpool 升级或启用加密!这样做会使您的系统无法启动。
创建您的交换
root #mkswap -f /dev/nvme0n1p3
root #swapon /dev/nvme0n1p3
注意
不要以任何容量(数据集或 zvol)将交换放入 ZFS 中。当我的 RAM 为 100% 并且系统在 ZFS 上交换时开始交换时,我经历过锁定。当交换位于正常分区上时,它不会崩溃。
验证一切正常
您可以通过运行以下命令来验证所有这些操作是否正常工作:
root #zpool status
pool: boot
state: ONLINE
status: The pool is formatted using a legacy on-disk format. The pool can
still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'. Once this is done, the
pool will no longer be accessible on software that does not support
feature flags.
scan: none requested
config:
NAME STATE READ WRITE CKSUM
boot ONLINE 0 0 0
nvme0n1p2 ONLINE 0 0 0
errors: No known data errors
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
nvme0n1p4 ONLINE 0 0 0
errors: No known data errors
root #zfs list
NAME USED AVAIL REFER MOUNTPOINT
boot 36.2M 742M 35.1M /boot
tank 315G 402G 192K none
tank/home 320K 402G 320K /home
tank/os 310G 402G 310G /
tank/os/main 310G 402G 310G /
现在我们已经准备好安装Gentoo了!
安装Gentoo浏览器
设置日期和时间
假设现在是 18 年 2022 月 11 日 @ 48:23 下午(48 小时内为 24:<>),我们将执行以下操作:
root #date 061823482022
注
06 18 2348 2022(月、日、24小时时间、年)。目前将是UTC,但您可以在重新启动后修复它。
准备唱歌
首先,让我们将 EFI 引导分区挂载在 chroot 目录中:
root #cd /mnt/gentoo
root #mkdir boot/efi
root #mount /dev/nvme0n1p1 boot/efi
并在此处下载 OpenRC(或 systemd)amd64 映像并将其解压缩:
root #wget <file>
root #tar xpf <file>
注意:
您还可以在我的服务器上找到管理员 CD 的镜像副本:https://xyinn.org/gentoo/livecd/。
复制 zpool 缓存
root #mkdir etc/zfs
root #cp /etc/zfs/zpool.cache etc/zfs
复制网络设置
root #cp /etc/resolv.conf etc/
安装所需设备
root #mount --rbind /dev dev
root #mount --rbind /proc proc
root #mount --rbind /sys sys
root #mount --make-rslave dev
root #mount --make-rslave proc
root #mount --make-rslave sys
进入您的环境
root #env -i HOME=/root TERM=$TERM chroot . bash -l
编辑 fstab
一切都在 zfs 上,所以除了 efi 目录和交换条目之外,我们不需要任何东西。 我的 fstab 如下所示:
root #nano /etc/fstab
/dev/nvme0n1p1 /boot/efi vfat noauto 1 2
/dev/nvme0n1p3 none swap sw 0 0
警告
不要自动挂载 /boot/efi 分区。如果这样做,init 系统将创建 /boot/efi 文件夹(如果不存在),这将阻止引导 zpool 挂载。
修改 make.conf
让我们修改我们的 /etc/portage/make.conf,这样我们就可以开始安装具有良好基础的东西(将其更改为您需要的内容):
root #nano /etc/portage/make.conf
USE="-branding"
# This should be your number of processors + 1
MAKEOPTS="-j5"
EMERGE_DEFAULT_OPTS="--with-bdeps=y --keep-going=y --quiet-build=y"
FEATURES="buildpkg"
LINGUAS="en en_US"
# This is required so that when we compile GRUB later, EFI support is built.
GRUB_PLATFORMS="efi-64"
获取搬运树
复制默认示例搬运配置
root #cp /usr/share/portage/config/repos.conf /etc/portage/repos.conf
root #emerge --sync
内核安装
为了简单起见,我们将只使用预构建的gentoo内核。
禁用“initramfs”USE标志
由于我们使用的是 bliss-initramfs,我们将禁用 gentoo-kernel-bin 上的 'initramfs' USE 标志。
root #echo "sys-kernel/gentoo-kernel-bin -initramfs" >> /etc/portage/package.use/gentoo-kernel-bin
安装内核
root #emerge gentoo-kernel-bin
注意
考虑固定已安装的内核版本,以便在将来进行内核升级时,emerge --depclean 不会从 /boot 目录中删除我们的内核文件。如果出现安装的 gentoo-kernel ebuild 是:gentoo-kernel-bin-5.15.48,我们会做:
root #emerge --noreplace =gentoo-kernel-bin-5.15.48
安装所需的应用程序
在 GRUB 中启用 ZFS 支持
root #echo "sys-boot/grub libzfs" >> /etc/portage/package.use
现在安装应用程序:
root #emerge bliss-initramfs grub zfs
将引导加载程序安装到驱动器上
我们需要将引导加载程序安装到驱动器上。但是,在我们这样做之前,让我们看看 GRUB 是否可以检测到我们的 /boot 和 /boot/efi 文件系统类型:
root #grub-probe /boot
这应该说“zfs”。如果没有,则出现问题,您的系统将无法启动!
root #grub-probe /boot/efi
这应该说“胖”。如果没有,则出现问题,您的系统将无法启动!
在安装引导加载程序之前,我们需要对 efi nvram 变量具有读/写访问权限。现在让我们重新挂载我们的 efivar:
root #mount -o remount,rw /sys/firmware/efi/efivars/
现在运行以下命令将引导加载程序安装到驱动器:
root #grub-install --efi-directory=/boot/efi
上面的命令会将 grub 引导加载程序文件安装到 /boot 中,将 efi 文件安装到 /boot/efi 中。它应返回“安装已完成。未报告错误。如果没有,则出现问题,您的系统将无法启动!
警告
如果在重新启动后 UEFI 主板未检测到引导加载程序,则可能是因为主板固件有问题。尝试将“--可移动”标志传递给 grub 安装,然后重试。这会将 efi 文件安装到 EFI 规范的回退目录。
创建 GRUB 2 配置文件
您可以使用以下配置文件作为系统的基础:
root #nano /boot/grub/grub.cfg
set default=0
set timeout=1
insmod part_gpt
insmod fat
insmod efi_gop
insmod efi_uga
menuentry "Gentoo - 5.15.48-gentoo-dist" {
linux /@/vmlinuz-5.15.48-gentoo-dist root=tank/os/main by=id elevator=noop quiet logo.nologo refresh
initrd /@/initrd-5.15.48-gentoo-dist
}
如果您使用的是本机 ZFS 加密,请将加密标志也添加到内核行中。
在重新启动之前/之后生成新的 zpool.cache 文件
ZFS 对 zpool.cache 文件中包含的数据非常敏感,此时,当我们重新启动时,其中的信息可能并不完全准确。为了确保我们有一个好的缓存文件,我们在上面的引导加载程序配置中指示 bliss-initramfs,忽略系统上的当前缓存文件,并创建一个最新的新缓存文件。我们只需要这样做一次。
生成 initramfs 并将文件移动到正确的位置
在生成 initramfs 之前,请确保编辑 /etc/bliss-initramfs/settings.json 并包含引导系统所需的任何内核模块。在本指南中,我们需要加载 nvme 驱动程序,因为 gentoo-kernel-bin 将此驱动程序编译为模块。如果您的系统启动失败,则可能与未加载内核模块丢失有关。按照恢复部分中的说明返回到您的环境。
root #nano /etc/bliss-initramfs/settings.json
"modules": {
"files": ["nvme"]
},
现在生成你的 initramfs 并将其移动到正确的位置:
root #bliss-initramfs -k 5.15.48-gentoo-dist
root #mv initrd-5.15.48-gentoo-dist /boot
重新启动前的最后步骤
OpenRC
root # rc-config add zfs-import boot
root # rc-config add zfs-mount boot
systemd
root # systemctl enable zfs.target
root # systemctl enable zfs-import-cache
root # systemctl enable zfs-mount
root # systemctl enable zfs-import.target
现在是魔术命令(交叉手指哈哈):
root # passwd
root # exit
root # reboot
重新启动后
从引导加载程序配置中删除 zpool.cache 刷新标志
打开你的 grub.cfg并从内核行中删除刷新标志。
root #nano /boot/grub/grub.cfg
导入启动池
您现在可以挂载启动池,以便 /boot 目录在 后续重新启动。启动池将通过缓存文件自动记住:
root #zpool import -o cachefile= boot
拍摄新系统的快照
由于我们现在有一个工作系统,我们将在想要返回或恢复文件时对其进行快照:
root #zfs snapshot boot@2022-06-18-2241-55-INSTALL
root #zfs snapshot -r tank@2022-06-18-2241-55-INSTALL
您可以通过检查这些快照各自的隐藏 .zfs 目录来查看这些快照的内容:
root #ls /boot/.zfs/snapshots
root #ls /.zfs/snapshots
root #ls /home/.zfs/snapshots
注意
我们以这种格式命名快照,因为它是我的“bliss-zfs-scripts”使用的格式,而且它也非常可读。
限制 ARC 大小
如果你想限制 ZFS ARC 增长超过某个点,你可以将字节数放在 /etc/modprobe.d/zfs.conf 文件中,然后重新制作你的 initramfs。当系统启动并加载模块时,这些选项将传递给 zfs 内核模块。(临时)将正在运行的系统的最大 ARC 更改为 4 GB
root #echo 4294967296 >> /sys/module/zfs/parameters/zfs_arc_max
(永久)将 4 GB ARC 上限另存为可加载内核参数
root #echo "options zfs zfs_arc_max=4294967296" >> /etc/modprobe.d/zfs.conf
一旦我们创建了上面的文件,让我们重新生成 initramfs。Bliss-initramfs Will 自动检测此文件是否存在,并将其复制到 InitramFS 中。重新启动时 您的机器,Initramfs 将使用参数加载 ZFS 内核模块 在文件中找到。
root #bliss-initramfs -k 5.15.48-gentoo-dist
root #mv initrd-5.15.48-gentoo-dist /boot
恢复
如果您需要从 livecd 环境返回到 zpool,您只需使用以下命令再次导入池:
root #zpool import -R /mnt/gentoo tank
root #zpool import -R /mnt/gentoo boot
如果您的池是加密的,您还需要传递 -l(小写 L)选项,即上面的 zpool 导入命令(这将要求您输入池的密码短语并因此加载密钥),或者您可以在导入没有密钥的池后使用以下命令:
root #zpool load-key tank
这还会要求您输入密码并加载池的密钥。完成此操作后,您应该能够通过执行以下操作查看加密池的可用值:
root #zfs get keystatus tank
您可能还希望导入启动池和 efi 分区:
root #zpool import -R /mnt/gentoo boot
root #mount /dev/nvme0n1p1 /mnt/gentoo/boot/efi
{{注|如果在重新启动池时启动池时遇到问题,请尝试在启动期间添加刷新标志。
您可能想要安装的其他内容
极乐 ZFS 脚本
以下脚本允许您自动: *拍摄泳池快照 * 将池复制到另一个池(完整备份和增量备份) * 清理池中的旧快照。 您可以将脚本下载、自定义并安装到 /usr/local/sbin 目录中。Github。 仅此而已。享受!
这是我关于gentoo社区的建设建议
1.我们社区的网站的推流不够 ,主要体现在以下几个方面;
一 搜索社区的文章搜不到,可能受限于网站基础代码编写时的原因,我们发布在社区网站上的文章与帖子无法被主流的搜索引擎所搜素。解决方案:更改网站编写时的代码,让访客可见的内容可以被搜索引擎所搜索。
二 我们社区的引流的途径太少了,目前的途径有在搜索引擎上搜索gentoo中文社区,也有其他的中文社区,他们网站仍然还在,但是他们的社区已经停止活动,所以出现的情况就是我们社区会被其他不活跃的社区所分流。我认为目前可行的解决方案是在知乎,csdn,bili等技术和热度高的平台发布我们的日常文章,开头或结尾附上我们社区的网站url与qq群号
三 社区的文章对于新手来说看不懂,利用率也低,当然这可能与gentoo本身有关系--安装难度大,时间长。我的建议是希望各位社区成员能够把自己安装系统的过程发出来,引导如openrc与systemd,不同桌面dwm-plasma-gnome-xfce,不同应用场景如zfs文件储存服务器-代码代编译调试服务器,系统用到的硬件和安装过程中出现问题的解决方案。
四 我们社区发帖子,单条帖子的长度-行数有限制,提交的时候会出现404 这很大情况下限制了写帖子,搬运帖子的心情
五 使用gentoo的人还是太少了,如果我们有二进制包服务器的合作,我们出一个方案,提供安装基础系统和桌面的二进制包,那么我们社区可以快速扩张用户,这样对国内低配pc用户安装gentoo有帮助,但是这缺少资金支持,我希望可以有一个建设社区的资金获取途径,比如在网站设一个捐款的板块,定期公示钱使用的地方,比如服务器的租用,这条建议需要我们社区有很多用户时才能有用
六 使用gentoo的人都是对Linux比较熟悉的人,但不是喜欢折腾的人,会gentoo,就意味着其他发行版也玩的来,是否允许建立一个板块,让用户发布其他Linux/gnu发行版的问题,然后我们gentooer来解决,这一点程度也能起到推流作用
首先需要下载最新的ebuild
url:https://gpo.zugaina.org/AJAX/Ebuild/53902897
sudo cp /home/llyy/Downloads/gentoo-sources-6.2.8.ebuild /usr/local/portage/sys-kernel/gentoo-sources
把该文件复制到/usr/local/portage/sys-kernel/gentoo-sources 下(没有的文件夹,请自己动手建立)
然后编辑/etc/make.conf,增加下面的一行:
代码:
PORTDIR_OVERLAY=/usr/local/portage #(这一行是告诉系统我自己添加的ebuild在什么地方)
然后执行下面的命令(需要sudo权限)
cd /usr/local/portage/sys-kernel/gentoo-sources
ebuild gentoo-sources-6.2.8.ebuild digest #给ebulid签名
出现
>>> Creating Manifest for /usr/local/portage/sys-kernel/gentoo-sources
然后就可以通过emerge 安装了
如果sudo emerge gentoo-sources不能安装你给的ebuilid
那么你就需要cd /usr/local/portage/sys-kernel/gentoo-sources
然后sudo emerge ./gentoo-sources-6.2.8.ebuild
↳ eselect kernel list SIGINT(2) ↵ 12:56:14
Available kernel symlink targets:
[1] linux-5.15.88-gentoo
[2] linux-6.1.8-zen
[3] linux-6.1.12-gentoo
[4] linux-6.1.19-gentoo *
[5] linux-6.2.8-gentoo
sudo eselect kernel set 5
cd /usr/src/linux
genkernel all ##我用通用的办法安装内核
nvidia配置的详细内容,请看我的知乎文章
https://www.zhihu.com/tardis/sogou/art/591345160
由于有2个显卡
默认使用IntelGPU省电
把/etc/X11/xorg.conf的内容修改为:
##############################################################
Section "ServerLayout"
Identifier "layout"
Screen 0 "iGPU"
Option "AllowNVIDIAGPUScreens"
EndSection
Section "Device"
Identifier "iGPU"
Driver "modesetting"
BusID "PCI:0:2:0"
EndSection
Section "Screen"
Identifier "iGPU"
Device "iGPU"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:1:0:0"
EndSection
###################################################################
安装显卡驱动emerge -av x11-base/xorg-server x11-apps/xrandr x11-base/xorg-drivers media-libs/mesa x11-drivers/nvidia-drivers
emerge --ask sys-boot/grub sys-boot/os-prober sys-fs/ntfs3g sys-fs/btrfs-progs
nano /etc/default/grub
添加如下行,开启os探测#srart#
GRUB_DISABLE_OS_PROBER=false
#end#
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Gentoo
grub-mkconfig -o /boot/grub/grub.cfg
安装kde桌面
emerge sudo layman sys-apps/dbus kde-plasma/plasma-meta kde-apps/konsole kde-apps/dolphin
systemctl enable sddm
安装networkmanager
emerge networkmanager sys-apps/mlocate
systemctl enable NetworkManager
安装键盘鼠标驱动
emerge x11-drivers/xf86-input-void x11-drivers/xf86-input-evdev
安装蓝牙驱动
emerge net-wireless/bluez
systemctl enable bluetooth
声卡emerge media-sound/pulseaudio media-libs/pulseaudio-qt kde-apps/kmix
中文字体emerge wqy-zenhei ##可以自行添加字体,我选择的是通用型
其他锁项
emerge --ask acpiemerge thermaldemerge cpupower
passwd
##设定root密码
useradd --create-home semes #semes是我的用户名
passwd semes ##设定用户密码
usermod -aG wheel,users semes #添加用户到组
visudo找到root ALL=(ALL:ALL) ALL
在下面添加
semes ALL=(ALL:ALL) ALL
取消 # %wheel ALL=(ALL:ALL) ALL
echo "gentoo" >> /etc/hostname
nano /etc/hosts
--------------------
127.0.0.1 localhost
::1 localhost
127.0.1.1 gentoo.localdomain gentoo
更新@wordemerge --ask --verbose --update --deep --newuse @world
etc-update --automode -3
设置时区
ls /usr/share/zoneinfoln -sf ../usr/share/zoneinfo/Asia/Shanghai /etc/localtimeecho "en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
安装内核源码和固件微代码emerge --ask sys-kernel/linux-firmware sys-kernel/gentoo-sources sys-kernel/genkernel
eselect kernel list
eselect kernel set 1
##默认内核啥也没有,直接设置1 刚刚下载的内核源码cd /usr/src/linux
genkernel all ##使用genkernel锁定缩短内核配置时间,后续可自行优化内核禁用nouveau
mkdir /etc/modprobe.d/
touch /etc/modprobe.d/blacklist.conf
nano /etc/modprobe.d/blacklist.conf
#加入这些begin
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
#加入这些end
开始chrootcp --dereference /etc/resolv.conf /mnt/gentoo/etc/
mount --types 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
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
chroot /mnt/gentoo /bin/bash
##chroot后
source /etc/profile
export PS1="(chroot) ${PS1}"
更新数据库
emerge-webrsync
eselect profile list
我选的这个[11] default/linux/amd64/17.1/desktop/plasma/systemd/merged-usr (stable)
eselect profile set 11
emerge --ask app-portage/cpuid2cpuflags
cpuid2cpuflags出现以下内容,我的机子,仅供参考CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
稍作修改,将以下内容添加到/etc/portage/make.conf里
CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3"
emerge --ask ccache aria2
mkdir -p /var/cache/ccache
chown root:portage /var/cache/
ccache -R
chmod 2775 /var/cache/ccache -R
在make.conf添加以下内容
#start#
FEATURES="ccache -test"
CCACHE_DIR="/var/cache/ccache"FETCHCOMMAND="/usr/bin/
aria2c -d \${DISTDIR} -o \${FILE} --allow-overwrite=true --max-tries=5 --max-file-not-found=2 --max-concurrent-downloads=5 --connect-timeout=5 --timeout=5 --split=5 --min-split-size=2M --lowest-speed-limit=20K --max-connection-per-server=9 --uri-selector=feedback \${URI}"RESUMECOMMAND="${FETCHCOMMAND}"#end#
安装gentoo分为三个大步骤,分别是更新@word,编译内核,安装自己要用的软件/桌面
我选择的是清华源的stage3 包目录是/gentoo/releases/amd64/autobuilds/current-stage3-amd64-desktop-systemd-mergedusr/
由于我安装的是kde桌面,所以我最终选择的是stage3-amd64-desktop-systemd-mergedusr-*.tar.xz
2023年底systemd 将取消支持没有合并到/usr目录的发行版使用systemd,要用systemd请务必选择带mergedusr的stage3包
我使用的是archlinux作为安装live辅助
开始吧!
请注意archlinx由于更新速度快,其格式化的文件系统会有新的特性,如果使用arch格式化的ext4等文件系统。在gentoo安装完内核引导程序后,有可能启动时报错,用中文来说就是文件系统出错。因此,尽量使用旧版(指软件包不是最新的)的linux进行文件系统格式化操作,我个人建议使用diskgenius(win下)进行ext4的格式化操作,以下格式化命令仅做参考
mkfs.vfat -F 32 /dev/nvme0n1p1 ##efi分区
mkfs.ext4 /dev/nvme0n1p2 ##根目录分区
将stage3下载到本地,默认是下载到 /home/user/Downloads/ ##此处user是你的用户名
sudo mkdir -p /mnt/gentoo
sudo mount /dev/nvme0n1p2 /mnt/gentoo
sudo mkdir -p /mnt/gentoo/boot
sudo mount /dev/nvme0n1p1 /mnt/gentoo/boot
sudo cp /home/user/Downloads/stage3.*.tar.xz /mnt/gentoo/
sudo genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab
#使用arch aur上得到的命令,或者使用archlivecd来完成,请务必检查fstab内容,确保只有自己需要的分区
cd /mnt/gentoo/
sudo -s #切换到root用户
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
配置make
nano -w /mnt/gentoo/etc/portage/make.conf
在末尾追加以下内容
#start#
GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/" #使用清华源
ACCEPT_LICENSE="*"
VIDEO_CARDS="nvidia" #添加nvidia显卡支持
MAKEOPTS="-j12" #此处请根据你的cpu线程数和你的实际内存来确定,我是i9-8950hk(12线程) 32GB的memory
GRUB_PLATFORMS="efi-64" #使用amd64平台的grub进行引导
USE="-split-usr" #使用合并到/usr标记的软件
UNINSTALL_IGNORE="/bin /lib /lib64 /sbin"
VIDEO_CARDS="intel i965 iris nvidia" ##显卡支持配置
#end#
配置全局ebulid软件仓库
mkdir --parents /mnt/gentoo/etc/portage/repos.conf
cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
nano /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
把原来的sync-uri这一行注释
添加sync-uri = rsync://rsync.mirrors.tuna.tsinghua.edu.cn/gentoo-portage/
页次: 1