ltspbaremetalInstall

Hardware/OS/Software info:

dash@i9server:~$ cat /etc/issue
Ubuntu 22.04.5 LTS \n \l

dash@i9server:~$ uname -a
Linux i9server 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov  6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
dash@i9server:~$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    64M  1 loop /snap/core20/2379
loop1         7:1    0  63.7M  1 loop /snap/core20/2434
loop2         7:2    0    87M  1 loop /snap/lxd/29351
loop3         7:3    0  89.4M  1 loop /snap/lxd/31333
loop4         7:4    0  38.8M  1 loop /snap/snapd/21759
loop5         7:5    0  44.3M  1 loop /snap/snapd/23258
sda           8:0    0   1.8T  0 disk 
└─sda1        8:1    0   1.8T  0 part 
sr0          11:0    1  1024M  0 rom  
nvme0n1     259:0    0 476.9G  0 disk 
├─nvme0n1p1 259:1    0     1G  0 part /boot/efi
└─nvme0n1p2 259:2    0 475.9G  0 part /
dash@i9server:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:           64079         565       60533           2        2981       62859
Swap:           8191           0        8191
dash@i9server:~$ cat /proc/cpuinfo | grep -i model
model		: 165
model name	: Intel(R) Core(TM) i9-10900 CPU @ 2.80GHz

Install ltsp:

sudo add-apt-repository ppa:ltsp
sudo apt update
sudo apt install --install-recommends ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
sudo gpasswd -a dash epoptes

Prepare the image:

# ls *.img -l -h
-rw-r--r-- 1 dash dash 4.0G Dec  5 02:33 kylin.img
-rw-r--r-- 1 dash dash 2.6G Dec  5 02:35 ubuntu2004.img
-rw-r--r-- 1 dash dash 3.2G Dec  5 02:34 uos613.img
-rw-r--r-- 1 dash dash 4.4G Dec  5 02:34 zkfd613.img

Create the dns/dhcp, import the images:

ltsp dnsmasq --proxy-dhcp=0
vim  /etc/dnsmasq.d/ltsp-dnsmasq.conf
    dhcp-range=192.168.1.34,192.168.1.250,600h
mkdir /srv/ltsp && cd /srv/ltsp
ln -s /home/dash/ubuntu2004.img .
ltsp image ubuntu2004
ltsp ipxe
ltsp nfs
    Installed /usr/share/ltsp/server/nfs/ltsp-nfs.exports in /etc/exports.d/ltsp-nfs.exports
ltsp initrd
useradd -m test1
useradd -m test2
passwd test1
passwd test2

more images:

 rm -f *.img
 ln -s /home/dash/uos613.img .
 ltsp image uos613 && ltsp ipxe && ltsp initrd
 rm -f *.img
 ln -s /home/dash/zkfd613.img .
 ltsp image zkfd613 && ltsp ipxe && ltsp initrd
 rm -f *.img
 ln -s /home/dash/kylin.img .
 ltsp image kylin && ltsp ipxe && ltsp initrd

Result: zkfd behaves bad

deepin image:

cd /srv/ltsp
ln -s /var/lib/libvirt/trueimages/deepin.img .
ltsp image deepin && ltsp ipxe && ltsp initrd

ltspInstallationandTrial

安装ltspserver

Configuration:

/images/20241203_112055_x.jpg

Installation:

/images/20241203_112039_x.jpg

选择正常安装:

/images/20241203_112128_x.jpg

用户名创建:

/images/20241203_112203_x.jpg

配置:

sudo apt update
sudo apt install -y openssh-server vim nethogs iotop
sudo add-apt-repository ppa:ltsp && sudo apt update
sudo apt install --install-recommends ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
sudo usermod -aG epoptes test
sudo apt upgrade -y && sudo shutdown -h now

添加一个isolated网卡:

/images/20241203_113522_x.jpg

在网络管理下,配置其ip地址为10.17.18.18:

/images/20241203_113929_x.jpg

sudo ltsp dnsmasq --proxy-dhcp=0
sudo vim /etc/dnsmasq.d/ltsp-dnsmasq.conf
    dhcp-range=10.17.18.20,10.17.18.250,12h
sudo ltsp image /
sudo ltsp ipxe
sudo ltsp nfs
sudo ltsp initrd
sudo useradd -m test1
sudo useradd -m test2
sudo ltsp initrd

测试

/images/20241203_114432_x.jpg

4C 4G:

/images/20241203_114456_x.jpg

命名:

/images/20241203_114516_x.jpg 网络:

/images/20241203_114552_x.jpg

引导:

/images/20241203_114613_x.jpg

virtualbox创建镜像

/images/20241203_142035_x.jpg

/images/20241203_142130_x.jpg

/images/20241203_142428_x.jpg

/images/20241203_142443_x.jpg

/images/20241203_142550_x.jpg

pre-allocate Full size:

/images/20241203_142609_x.jpg

10G size:

/images/20241203_142629_x.jpg

/images/20241203_142908_x.jpg

enable 3d acceleration.

虚机分区:

/images/20241203_143521_x.jpg

其他按默认安装完毕。

gnome桌面:

/images/20241203_143731_x.jpg

进入系统后,关闭lock/sleep等选项。

cd /srv/ltsp/
ls
rm -f debian12_1.img 
ln -s /home/test/ubuntu1-flat.vmdk ./ubuntu1.img
ltsp image ubuntu1
ltsp ipxe

Next time reboot then you could enter ubuntu1.

debian got some errors.

kylin problem:

root@ltscserver:/srv/ltsp# ln -s /home/test/kylin-flat.vmdk ./kylin.img
root@ltscserver:/srv/ltsp# ltsp image kylin
Running: losetup -rP /dev/loop6 /srv/ltsp/kylin.img
Running: mount -t tmpfs -o mode=0755 tmpfs /tmp/tmp.sV6xy2UAD1/tmpfs
Running: mount -t ext4 -o ro,noload /dev/loop6p1 /tmp/tmp.sV6xy2UAD1/tmpfs/0/looproot
Running: mount -t overlay -o upperdir=/tmp/tmp.sV6xy2UAD1/tmpfs/0/up,lowerdir=/tmp/tmp.sV6xy2UAD1/tmpfs/0/looproot,workdir=/tmp/tmp.sV6xy2UAD1/tmpfs/0/work /tmp/tmp.sV6xy2UAD1/tmpfs /tmp/tmp.sV6xy2UAD1/root/
Cleaning up kylin before mksquashfs...
Traceback (most recent call last):
  File "/usr/share/ltsp/client/login/pwmerge", line 440, in <module>
    main(sys.argv)
  File "/usr/share/ltsp/client/login/pwmerge", line 434, in main
    pwm = PwMerge(args[0], args[1], args[2], **dopts)
  File "/usr/share/ltsp/client/login/pwmerge", line 117, in __init__
    self.dpasswd, self.dgroup = self.read_dir(ddir, dur or dgr)
  File "/usr/share/ltsp/client/login/pwmerge", line 151, in read_dir
    with open("{}/passwd".format(xdir), "r") as file:
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmp.sV6xy2UAD1/root/etc/passwd'
LTSP command failed: /usr/share/ltsp/client/login/pwmerge --ltsp --quiet /tmp/tmp.sV6xy2UAD1/root/tmp/pwempty /tmp/tmp.sV6xy2UAD1/root/etc /tmp/tmp.sV6xy2UAD1/root/tmp/pwmerged
Aborting ltsp

kylin tips

Add repository:

wget https://ltsp.org/misc/ltsp-ubuntu-ppa-focal.list -O /etc/apt/sources.list.d/ltsp-ubuntu-ppa-focal.list
wget https://ltsp.org/misc/ltsp_ubuntu_ppa.gpg -O /etc/apt/trusted.gpg.d/ltsp_ubuntu_ppa.gpg
apt update
sudo apt install --install-recommends ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
sudo gpasswd -a test epoptes

tipsoninnobasedlxc

config for lxc common:

# cat /usr/share/lxc/config/common.conf
# Default configuration shared by all containers

# Setup the LXC devices in /dev/lxc/
lxc.tty.dir = lxc

# Allow for 1024 pseudo terminals
lxc.pty.max = 1024

# Setup 4 tty devices
lxc.tty.max = 4

# Drop some harmful capabilities
lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio

# Ensure hostname is changed on clone
lxc.hook.clone = /usr/share/lxc/hooks/clonehostname

# Default legacy cgroup configuration
#
# CGroup allowlist
lxc.cgroup.devices.deny = a
## Allow any mknod (but not reading/writing the node)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
## Allow specific devices
### /dev/null
lxc.cgroup.devices.allow = c 1:3 rwm
### /dev/zero
lxc.cgroup.devices.allow = c 1:5 rwm
### /dev/full
lxc.cgroup.devices.allow = c 1:7 rwm
### /dev/tty
lxc.cgroup.devices.allow = c 5:0 rwm
### /dev/console
lxc.cgroup.devices.allow = c 5:1 rwm
### /dev/ptmx
lxc.cgroup.devices.allow = c 5:2 rwm
### /dev/random
lxc.cgroup.devices.allow = c 1:8 rwm
### /dev/urandom
lxc.cgroup.devices.allow = c 1:9 rwm
### /dev/pts/*
lxc.cgroup.devices.allow = c 136:* rwm
### fuse
lxc.cgroup.devices.allow = c 10:229 rwm
## graphics. /dev/dri
lxc.cgroup.devices.allow = c 226:0 rwm
lxc.cgroup.devices.allow = c 226:128 rwm
## graphics. /dev/fb0
lxc.cgroup.devices.allow = c 29:0 rwm
### tty0, tty1, tty7, tty8
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
lxc.cgroup.devices.allow = c 4:7 rwm
lxc.cgroup.devices.allow = c 4:8 rwm
### sound
lxc.cgroup.devices.allow = c 116:* rwm
### input
lxc.cgroup.devices.allow = c 13:* rwm

# Default unified cgroup configuration
#
# CGroup allowlist
lxc.cgroup2.devices.deny = a
## Allow any mknod (but not reading/writing the node)
lxc.cgroup2.devices.allow = c *:* m
lxc.cgroup2.devices.allow = b *:* m
## Allow specific devices
### /dev/null
lxc.cgroup2.devices.allow = c 1:3 rwm
### /dev/zero
lxc.cgroup2.devices.allow = c 1:5 rwm
### /dev/full
lxc.cgroup2.devices.allow = c 1:7 rwm
### /dev/tty
lxc.cgroup2.devices.allow = c 5:0 rwm
### /dev/console
lxc.cgroup2.devices.allow = c 5:1 rwm
### /dev/ptmx
lxc.cgroup2.devices.allow = c 5:2 rwm
### /dev/random
lxc.cgroup2.devices.allow = c 1:8 rwm
### /dev/urandom
lxc.cgroup2.devices.allow = c 1:9 rwm
### /dev/pts/*
lxc.cgroup2.devices.allow = c 136:* rwm
### fuse
lxc.cgroup2.devices.allow = c 10:229 rwm
## graphics. /dev/dri
lxc.cgroup2.devices.allow = c 226:0 rwm
lxc.cgroup2.devices.allow = c 226:128 rwm
## graphics. /dev/fb0
lxc.cgroup2.devices.allow = c 29:0 rwm
## tty0, 1, 7, 8
lxc.cgroup2.devices.allow = c 4:0 rwm
lxc.cgroup2.devices.allow = c 4:1 rwm
lxc.cgroup2.devices.allow = c 4:7 rwm
lxc.cgroup2.devices.allow = c 4:8 rwm
### sound
lxc.cgroup2.devices.allow = c 116:* rwm
### input
lxc.cgroup.devices.allow = c 13:* rwm

# Setup the default mounts
#lxc.mount.auto = cgroup:mixed proc:mixed sys:mixed
lxc.mount.auto = cgroup:mixed proc:rw sys:mixed
lxc.mount.entry = /sys/fs/fuse/connections sys/fs/fuse/connections none bind,optional 0 0

lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

# Block some syscalls which are not safe in privileged
# containers
lxc.seccomp.profile = /usr/share/lxc/config/common.seccomp

# Lastly, include all the configs from /usr/share/lxc/config/common.conf.d/
lxc.include = /usr/share/lxc/config/common.conf.d/

config added :

lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/dri/renderD128 dev/renderD128 none bind,optional,create=file
### allow tty8
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.mount.entry = /dev/tty8 dev/tty8 none bind,optional,create=file
lxc.mount.entry = /dev/tty0 dev/tty0 none bind,optional,create=file
#lxc.mount.entry = /dev/tty1 dev/tty1 none bind,optional,create=file
#lxc.mount.entry = /dev/tty2 dev/tty2 none bind,optional,create=file
#lxc.mount.entry = /dev/tty3 dev/tty3 none bind,optional,create=file
### allow all of the input
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
### allow all of the snd
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

The others are the same as previous ones.

lxcbaremetal

1. Host侧准备

安装必要的包,禁止ipv6后重启.

sudo apt update
sudo apt-get install -y lxc lxcfs
sudo vim /etc/default/grub
...
ipv6.disable=1
...
sudo update-grub2
sudo reboot

更换subuid/subgid:

idvnext@idvnext-PC:~$ cat /etc/subuid
idvnext:100000:65536
root:100000:65536
idvnext@idvnext-PC:~$ cat /etc/subgid
idvnext:100000:65536
root:100000:65536

编辑 /usr/share/lxc/config/common.conf:

......
# CGroup allowlist
#lxc.cgroup.devices.deny = a
lxc.cgroup.devices.allow = a
......
### /dev/random
lxc.cgroup.devices.allow = c 1:8 rwm
### tty0, tty1, tty7, tty8
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
lxc.cgroup.devices.allow = c 4:7 rwm
lxc.cgroup.devices.allow = c 4:8 rwm
### sound
lxc.cgroup.devices.allow = c 116:* rwm
### /dev/urandom
......
# CGroup allowlist
#lxc.cgroup2.devices.deny = a
lxc.cgroup2.devices.allow = a
......
### fuse
lxc.cgroup2.devices.allow = c 10:229 rwm
### customization
## graphics. /dev/dri
lxc.cgroup2.devices.allow = c 226:0 rwm
lxc.cgroup2.devices.allow = c 226:128 rwm
## graphics. /dev/fb0
lxc.cgroup2.devices.allow = c 29:0 rwm
## tty0, 1, 7, 8
lxc.cgroup2.devices.allow = c 4:0 rwm
lxc.cgroup2.devices.allow = c 4:1 rwm
lxc.cgroup2.devices.allow = c 4:7 rwm
lxc.cgroup2.devices.allow = c 4:8 rwm
### sound
lxc.cgroup2.devices.allow = c 116:* rwm

# Setup the default mounts
#lxc.mount.auto = cgroup:mixed proc:mixed sys:mixed
lxc.mount.auto = cgroup:mixed proc:rw sys:mixed
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
......

因为容器中需要对tty的完整控制,在host侧添加以下命令:

$ sudo crontab -e
......
@reboot chmod 777 /dev/tty* && chmod 777 -R /dev/dri/ && chmod 777 /dev/fb0

2. zkfd

创建一个名为zkfd的lxc实例:

# lxc-create -t local -n zkfdlxc -- -m /root/meta.tar.xz -f /root/zkfdlxc.tar.xz
Unpacking the rootfs

---
You just created an Ubuntu jammy amd64 (20241021_07:42) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

手动添加透传设备规则:

# vim /var/lib/lxc/zkfdlxc/config
......
lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/dri/renderD128 dev/renderD128 none bind,optional,create=file
### allow tty8
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.mount.entry = /dev/tty8 dev/tty8 none bind,optional,create=file
lxc.mount.entry = /dev/tty0 dev/tty0 none bind,optional,create=file
#lxc.mount.entry = /dev/tty1 dev/tty1 none bind,optional,create=file
#lxc.mount.entry = /dev/tty2 dev/tty2 none bind,optional,create=file
#lxc.mount.entry = /dev/tty3 dev/tty3 none bind,optional,create=file
### allow all of the input
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
### allow all of the snd
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

更改lightdm:

# vim /var/lib/lxc/zkfdlxc/rootfs/etc/lightdm/lightdm.conf 
......
[LightDM]
......
minimum-vt=8
......

更改events:

# mv /var/lib/lxc/zkfdlxc/rootfs/etc/acpi/events /var/lib/lxc/zkfdlxc/rootfs/etc/acpi/events.bak

2.1 鼠标输入

此时可以看到界面,但是无法用鼠标操作,需要进行修改:

# lxc-attach -n zkfdlxc

cat >/usr/local/bin/preX-populate-input.sh  << __EOF__
#!/usr/bin/env bash

### Creates config file for X with all currently present input devices
#   after connecting new device restart X (systemctl restart lightdm)
######################################################################

cat >/etc/X11/xorg.conf.d/10-lxc-input.conf << _EOF_
Section "ServerFlags"
     Option "AutoAddDevices" "False"
EndSection
_EOF_

cd /dev/input
for input in event*
do
cat >> /etc/X11/xorg.conf.d/10-lxc-input.conf <<_EOF_
Section "InputDevice"
    Identifier "\$input"
    Option "Device" "/dev/input/\$input"
    Option "AutoServerLayout" "true"
    Driver "evdev"
EndSection
_EOF_
done
__EOF__

chmod +x /usr/local/bin/preX-populate-input.sh
mkdir -p /etc/systemd/system/lightdm.service.d
cat > /etc/systemd/system/lightdm.service.d/override.conf << __EOF__
[Service]
ExecStartPre=/bin/sh -c '/usr/local/bin/preX-populate-input.sh'
SupplementaryGroups=video render input audio tty
__EOF__
reboot

此时,鼠标应该是可以使用的状态。

2.2 音频配置

安装测试软件:

sudo apt install -y smplayer mplayer

添加:

usermod -aG audio test
/usr/bin/pactl load-module module-alsa-card device_id=1 ; /usr/bin/pactl load-module module-alsa-card device_id=0

2.3 快速创建记录

via:

vim /var/lib/lxc/zkfdlxc1/config 
cp preX-populate-input.sh /var/lib/lxc/zkfdlxc1/rootfs/usr/local/bin/
chmod 777 /var/lib/lxc/zkfdlxc1/rootfs/usr/local/bin/preX-populate-input.sh 
mkdir -p /var/lib/lxc/zkfdlxc1/rootfs/etc/systemd/system/lightdm.service.d
mkdir -p /var/lib/lxc/zkfdlxc1/rootfs/etc/X11/xorg.conf.d/
cp override.conf /var/lib/lxc/zkfdlxc1/rootfs/etc/systemd/system/lightdm.service.d
mv /var/lib/lxc/zkfdlxc1/rootfs/etc/acpi/events /var/lib/lxc/zkfdlxc1/rootfs/etc/acpi/events.back

3. kylin

创建:

lxc-create -t local -n kylinlxc -- -m /root/meta.tar.xz -f /root/kylinlxc.tar.xz

仿照2.3创建相关目录并拷贝相关文件。
创建成功后,需要手动安装:

lxc-attach -n kylinlxc
# dhclient eth0
# apt update
# apt install -y xserver-xorg-input-evdev

rebuildkernelforfc40

安装编译内核所需要的所有依赖:

sudo dnf install fedpkg
git config --global http.proxy 'socks5://192.168.1.6:21080'
fedpkg clone -a kernel
cd kernel
sudo dnf builddep kernel.spec

FEdora dist-git内核包:

mkdir fc_dist-git
cd fc_dist-git
git clone https://src.fedoraproject.org/rpms/kernel.git

根据发行版的版本号,切换到对应的分支:

root@localhost:~/Code/fc_dist-git# cat /etc/redhat-release 
Fedora release 40 (Forty)
root@localhost:~/Code/fc_dist-git# cd kernel/
root@localhost:~/Code/fc_dist-git/kernel# git switch f40
分支 'f40' 设置为跟踪 'origin/f40'。
切换到一个新分支 'f40'

为了防止与现有的内核版本冲突,设置一个自定义的buildid, 为了加速编译,最好可以全局fanqiang:

# vim kernel.spec
...
%define buildid .fucktyy
# fedpkg local
...

/images/20241121_150632_x.jpg

这里需要注意,之前安装过较低版本的手动编译的pahole, 需要恢复之前的:

rm -f /usr/lib/libdwarves* /usr/lib64/libdwarves*
yum reinstall libdwarves1 dwarves
pahole --version
v1.26