rootfs

导航

 

文章目录

一、环境准备

1.1下载安装 ubuntu20.04根文件系统

1.2解压根文件系统

1.3配置根文件系统

1.4挂载根文件系统

二、构建根文件系统

2.1安装依赖软件

#跟新软件源
apt update
#跟新
apt upgrade
#安装必要软件
apt install vim bash-completion net-tools iputils-ping ifupdown ethtool ssh rsync udev htop rsyslog curl openssh-server apt-utils dialog nfs-common psmisc language-pack-en-base sudo kmod apt-transport-https network-manager -y

2.2设置主机名和主机解析

#主机名
echo "PX30" > etc/hostname
#主机IP
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 PX30" >> /etc/hosts
echo "127.0.0.1 localhost PX30" >> /etc/hosts

2.3配置网卡

Network-Manager 服务会自动配置网卡,但其默认配置文件将 ethernet 加入了黑名单,为此需要将它加入白名单当中

#打开文件
vim /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf 
#修改为
[keyfile]
unmanaged-devices=*,except:type:ethernet,except:type:wifi,except:type:gsm,except:type:cdma

将网卡默认配置为自动DHCP获取

#打开文件
vim /etc/network/interfaces
#修改为
auto eth0
iface eth0 inet dhcp
source-directory /etc/network/interfaces.d

在实际测试中网口必须接入网线系统才能正常启动,在不联网的情况下每次开机都要等待5分钟

#修改文件
vim /lib/systemd/system/networking.service
#修改为
TimeoutStartSec=5sec

实际测试,使用ssh 登陆,会出现密码正确无法登陆的情况,需修改以下文件

#打开文件
vim /etc/ssh/sshd_config
#将 #PermitRootLogin prohibit-password 修改为
PermitRootLogin yes

2.4串口调试设置root登陆

#打开文件
vim /lib/systemd/system/networking.service
#修改
ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM

2.5修改root用户密码

passwd root

2.6禁用系统休眠

systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
systemctl status sleep.target

2.7修改系统重启默认等待时间

#打开文件
vim etc/systemd/system.conf 
#修改
DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=1s
#DefaultTimeoutAbortSec=
DefaultRestartSec=100ms

2.8扩充emmc分区

首先创建一个脚本 vim etc/init.d/firstboot.sh ,并且添加可执行权限 chmod +x firstboot.sh

!/bin/bash -e   // !/bin/sh
# first boot configure
# resize filesystem mmcblk0p6
if [ ! -e "/usr/local/first_boot_flag" ] ;
then
  echo "Resizing /dev/mmcblk0p8..."
  resize2fs /dev/mmcblk0p8
  touch /usr/local/first_boot_flag
fi

其次创建一个服务去实现脚本 vim /lib/systemd/system/firstboot.service
然后再启动该脚本 systemctl enble firstboot.service

#start
[Unit]
Description=Setup rockchip platform environment
Before=lightdm.service
After=resize-helper.service
[Service]
Type=simple
ExecStart=/etc/init.d/firstboot.sh
[Install]
WantedBy=multi-user.target
#end

最后,增加该分区的可执行权限

#打开文件
vim /etc/fstab 
#修改为
/dev/mmcblk0p8 / ext4 rw,relatime,data=ordered 0 1

三、对文件系统增加对adbd的支持

3.1创建脚本文件 vim /etc/init.d/adbd.sh

adbd.sh
#!/bin/bash -e
### BEGIN INIT INFO
# Provides:          adbd
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
# Short-Description:
# Description:       Linux ADB
### END INIT INFO

# setup configfs for adbd, usb mass storage and MTP....

UMS_EN=off
ADB_EN=off
MTP_EN=off
NTB_EN=off
ACM_EN=off
UAC1_EN=off
UAC2_EN=off
UVC_EN=off
RNDIS_EN=off

USB_ATTRIBUTE=0x409
USB_GROUP=rockchip
USB_SKELETON=b.1

CONFIGFS_DIR=/sys/kernel/config
USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP}
USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE}
USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions
USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON}

make_config_string()
{
	tmp=$CONFIG_STRING
	if [ -n "$CONFIG_STRING" ]; then
		CONFIG_STRING=${tmp}_${1}
	else
		CONFIG_STRING=$1
	fi
}

parameter_init()
{
	while read line
	do
		case "$line" in
			usb_mtp_en)
				MTP_EN=on
				make_config_string mtp
				;;
			usb_adb_en)
				ADB_EN=on
				make_config_string adb
				;;
			usb_ums_en)
				UMS_EN=on
				make_config_string ums
				;;
			usb_ntb_en)
				NTB_EN=on
				make_config_string ntb
				;;
			usb_acm_en)
				ACM_EN=on
				make_config_string acm
				;;
			usb_uac1_en)
				UAC1_EN=on
				make_config_string uac1
				;;
			usb_uac2_en)
				UAC2_EN=on
				make_config_string uac2
				;;
			usb_uvc_en)
				UVC_EN=on
				make_config_string uvc
				;;
			usb_rndis_en)
                               RNDIS_EN=on
                               make_config_string rndis
                               ;;

		esac
	done < $DIR/.usb_config


	case "$CONFIG_STRING" in
		ums)
			PID=0x0000
			;;
		mtp)
			PID=0x0001
			;;
		adb)
			PID=0x0006
			;;
		mtp_adb | adb_mtp)
			PID=0x0011
			;;
		ums_adb | adb_ums)
			PID=0x0018
			;;
		acm)
			PID=0x1005
			;;
		*)
			PID=0x0019
	esac
}

configfs_init()
{
	mkdir -p ${USB_CONFIGFS_DIR} -m 0770
	echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor
	echo $PID > ${USB_CONFIGFS_DIR}/idProduct
	mkdir -p ${USB_STRINGS_DIR}   -m 0770

	SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'`
	if [ -z $SERIAL ];then
		SERIAL=0123456789ABCDEF
	fi
	echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber
	echo "rockchip"  > ${USB_STRINGS_DIR}/manufacturer
	echo "rk3xxx"  > ${USB_STRINGS_DIR}/product
	mkdir -p ${USB_CONFIGS_DIR}  -m 0770
	mkdir -p ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}  -m 0770
	echo 500 > ${USB_CONFIGS_DIR}/MaxPower
	echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration

}

configure_uvc_resolution()
{
	mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H
	echo $UVC_DISPLAY_W > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wWidth
	echo $UVC_DISPLAY_H > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wHeight
	echo 666666 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwDefaultFrameInterval
	echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*80)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMinBitRate
	echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*160)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxBitRate
	echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxVideoFrameBufferSize
	echo -e "666666\n1000000\n2000000" > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwFrameInterval
}

function_init()
{
	# UAC must be first setup when multi function composite.
	if [ $UAC1_EN = on ];then
		if [ ! -e "${USB_FUNCTIONS_DIR}/uac1.gs0" ] ;
		then
			mkdir ${USB_FUNCTIONS_DIR}/uac1.gs0
			ln -s ${USB_FUNCTIONS_DIR}/uac1.gs0 ${USB_CONFIGS_DIR}/uac1.gs0
		fi
	fi

	if [ $UAC2_EN = on ];then
		if [ ! -e "${USB_FUNCTIONS_DIR}/uac2.gs0" ] ;
		then
			mkdir ${USB_FUNCTIONS_DIR}/uac2.gs0
			ln -s ${USB_FUNCTIONS_DIR}/uac2.gs0 ${USB_CONFIGS_DIR}/uac2.gs0
		fi
	fi

	if [ $UMS_EN = on ];then
		if [ ! -e "${USB_FUNCTIONS_DIR}/mass_storage.0" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/mass_storage.0
			echo /dev/disk/by-partlabel/userdata > ${USB_FUNCTIONS_DIR}/mass_storage.0/lun.0/file
			ln -s ${USB_FUNCTIONS_DIR}/mass_storage.0 ${USB_CONFIGS_DIR}/mass_storage.0
		fi
	fi

	if [ $ADB_EN = on ];then
		if [ ! -e "${USB_FUNCTIONS_DIR}/ffs.adb" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/ffs.adb
			ln -s ${USB_FUNCTIONS_DIR}/ffs.adb ${USB_CONFIGS_DIR}/ffs.adb
		fi
	fi

	if [ $MTP_EN = on ];then
		if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/ffs.mtp" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/ffs.mtp
			ln -s ${USB_FUNCTIONS_DIR}/ffs.mtp ${USB_CONFIGS_DIR}/ffs.mtp
		fi
	fi

	if [ $NTB_EN = on ];then
		if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/ffs.ntb" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/ffs.ntb
			ln -s ${USB_FUNCTIONS_DIR}/ffs.ntb ${USB_CONFIGS_DIR}/ffs.ntb
		fi
	fi

	if [ $ACM_EN = on ];then
		if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/acm.gs6" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/acm.gs6
			ln -s ${USB_FUNCTIONS_DIR}/acm.gs6 ${USB_CONFIGS_DIR}/acm.gs6
		fi
	fi
	if [ $UVC_EN = on ];then
		mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6

		cat ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming_maxpacket
		echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/uvc.gs6/streaming_bulk

		mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/fs/h
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/ss/h

		mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m
		UVC_DISPLAY_W=640
		UVC_DISPLAY_H=480
		configure_uvc_resolution

		UVC_DISPLAY_W=1280
		UVC_DISPLAY_H=720
		configure_uvc_resolution

		UVC_DISPLAY_W=1920
		UVC_DISPLAY_H=1080
		configure_uvc_resolution

		UVC_DISPLAY_W=2560
		UVC_DISPLAY_H=1440
		configure_uvc_resolution

		mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/uncompressed/u ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/u
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/m
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/fs/h
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/hs/h
		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/ss/h

		ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6 ${USB_CONFIGS_DIR}/uvc.gs6
	fi
	if [ $RNDIS_EN = on ];then
		if [ ! -e "${USB_FUNCTIONS_DIR}/rndis.gs0" ] ;
		then
			mkdir -p ${USB_FUNCTIONS_DIR}/rndis.gs0
			ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/rndis.gs0
		fi
	fi
}

case "$1" in
start)
	DIR=$(cd `dirname $0`; pwd)
	if [ ! -e "$DIR/.usb_config" ]; then
		echo "$0: Cannot find .usb_config"
		exit 0
	fi

	parameter_init
	if [ -z $CONFIG_STRING ]; then
		echo "$0: no function be selected"
		exit 0
	fi
	configfs_init
	function_init

	if [ $ADB_EN = on ];then
		if [ ! -e "/dev/usb-ffs/adb" ] ;
		then
			mkdir -p /dev/usb-ffs/adb
			mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
		fi
		export service_adb_tcp_port=5555
		start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /usr/local/bin/adbd --background
		sleep 1
	fi

	if [ $MTP_EN = on ];then
		if [ ! -e "/dev/usb-ffs/mtp" ] ;
		then
			mkdir -p /dev/usb-ffs/mtp
			mount -o uid=2000,gid=2000 -t functionfs mtp /dev/usb-ffs/mtp
		fi
		start-stop-daemon --start --oknodo --pidfile /var/run/mtp.pid --startas /usr/local/bin/umtprd --background
		sleep 1
	fi

	if [ $NTB_EN = on ];then
		if [ ! -e "/dev/usb-ffs/ntb" ] ;
		then
			mkdir -p /dev/usb-ffs/ntb
			mount -o uid=2000,gid=2000 -t functionfs ntb /dev/usb-ffs/ntb
		fi
	fi

	UDC=`ls /sys/class/udc/| awk '{print $1}'`
	 echo $UDC > ${USB_CONFIGFS_DIR}/UDC
	;;
stop)
	echo "none" > ${USB_CONFIGFS_DIR}/UDC
	if [ $ADB_EN = on ];then
		start-stop-daemon --stop --oknodo --pidfile /var/run/adbd.pid --retry 5
	fi
	;;
restart|reload)
	;;
*)
	echo "Usage: $0 {start|stop|restart}"
	exit 1
esac

exit 0
对文件添加可执行权限 chmod +x adbd.sh 创建脚本 vim etc/init.d/.usb_config
usb_adb_en

3.2 设置开机自启动脚本

#打开文件
vim /lib/systemd/system/rc-local.service
#在文件末尾增加
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

创建 rc.local文件

#创建文件
vim /etc/rc.local
#文件内容
#!/bin/bash
mount -rw -o remount /

echo 56  > sys/class/gpio/export
echo out > sys/class/gpio/gpio56/direction
echo 1   > sys/class/gpio/gpio56/value


sh /etc/init.d/adbd.sh start &
exit 0
#增加权限
chmod 755 etc/rc.local
#创建软链接
ln -s /lib/systemd/system/rc-local.service /etc/systemd/system

四、打包根文件系统

posted on 2025-06-11 10:01  君子索酒  阅读(122)  评论(0)    收藏  举报