# OS特定机型 deb包安装实现方案

 （UT customizable system configuration scheme）

作者：陈浩



# **背景**

在广泛的定制需求和适配需求下，针对不同的硬件机型和外设类型，需要安装不同的解决方案包。

 

# **方案设计**





### 现在添加了utcs的方案

![image-20220315105201410](image-20220315105201410.png)

@设备识别在对应的定制包安装脚本中进行处理.



## 大体实现

安装器只需要一条命令调用/sbin/utcs。该命令会遍历/etc/utcs/scripts/下的定制包安装脚本文件。

定制包安装脚本文件，通过sysfs信息，识别主机硬件信息并执行相应的包安装命令。

/etc/utcs/func/func.sh提供了常见的硬件识别函数，在包安装脚本中可以直接调用，如：

```
#识别主机产品信息
is_productname_exists() {
  local NAME="$1"
  grep -q "${NAME}" /sys/class/dmi/id/product_name 2>/dev/null
}

# Check PCI device with id
is_pci_exists() {
  local PCI_ID="$1"
  local PCI_INFO
  PCI_INFO=$(lspci -d "${PCI_ID}" 2>/dev/null)
  test -n "${PCI_INFO}"
}

#识别usb设备信息
is_usb_exists() {
  local USB_ID="$1"
  local USB_INFO
  USB_INFO="$(lsusb -d "${USB_ID}" 2>/dev/null)"
  test -n "${USB_INFO}"
}
```



```
shell包安装脚本脚本内容：安装器中有两种安装包的方式：
	1. 组件包的安装：包是集成在本地仓库的，通过apt的方式安装，可以通过仓库解决依赖问题
	2. 定制包安装，通过dpkg方式安装的，包是放置在镜像的oem/deb目录下的，依赖需要用户自己解决后放置

eg:
	apt install htop
	dpkg -i backport-iwlwifi-dkms.deb
```

/usr/sbin/utcs：遍历/etc/utcs/scripts并执行其中的包安装脚本。

##  文件路径规划：

```
.
├── debian
│   ├── ######
├── etc
│   └── utcs
│       ├── func
│       │   └── func.sh
│       └── scripts
│           ├── 06_install_drivers.sh
│           ├── 08_fix_network_drivers.sh
│           └── 08_fix_wifi_drivers.sh
└── usr
    └── sbin
        └── utcs
```





# 定制包升级会不会掉的影响

对应的包升级会不会掉，这个由包的格式保证。

1）对于dkms，由于源码存放在文件系统中，升级会重新编译安装，这种升级不会掉。

2）对应一些系统配置的deb包，这种升级会被覆盖，需要考虑如何才能升级不掉。

```
# Fix wireless issue of lenovo y700
fix_lenovo_y700() {
  if is_productname_exists "80NV"; then
    if is_pci_exists "8086:3166"; then
      msg "fix lenovo y700"

      # Add ideapad to blacklist of kernel module.
      echo "blacklist ideapad_laptop" | tee -a /etc/modprobe.d/ideapad.conf
    fi
  fi
}
@这种修改应该移到内核。可以保证升级不掉。
```
