ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

openEuler不是Linux发行版,而是可生长的操作系统基座

2026/10/1 9:51:24 拓冰建站 浏览量
openEuler不是Linux发行版,而是可生长的操作系统基座 1. 项目概述openEuler不是“另一个Linux发行版”而是一套可生长的开源操作系统基座openEuler这个词最近在服务器运维圈、高校操作系统课程组、信创项目招标文件里出现的频率已经快赶上“Kubernetes”和“Rust”了。但很多人第一次看到它第一反应还是“哦又一个国产Linux”——这恰恰是最大的认知偏差。openEuler的本质不是试图复刻CentOS或Ubuntu的桌面体验而是面向云原生基础设施、边缘计算节点、嵌入式实时场景和全栈信创适配构建的一套“操作系统基座OS Base”。它把传统发行版里那些耦合度高、升级牵一发而动全身的组件像搭积木一样拆解成独立演进的模块内核支持x86/ARM/RISC-V多架构、用户态工具链glibc/musl双栈、容器运行时iSulad、轻量级虚拟化StratoVirt、安全可信框架SecGuard、AI加速调度器Ascend CANN集成层……这些模块之间通过清晰的ABI契约和版本生命周期管理协议协同工作而不是靠“整体打包发布”来维系一致性。我去年参与过三个openEuler落地项目一个是某省政务云平台从CentOS 7迁移到openEuler 22.03 LTS的替换工程一个是基于RK3588开发板的工业网关固件重构还有一个是给某AI芯片厂商做定制化内核裁剪。这三个场景毫无共性但都用到了openEuler同一个能力——按需组合、按场景裁剪、按生命周期演进。比如政务云需要长期稳定LTS就锁定22.03 SP3内核特定补丁集工业网关资源受限就启用musl libc minirootfs systemd-minimalAI芯片适配则直接拉取openEuler Codex分支集成厂商提供的驱动SDK和编译器工具链。这种“同一份源码多种形态输出”的能力才是它被称为“全球最具活力的操作系统开源社区之一”的底层原因——活力不来自PR数量而来自真实业务场景对OS基座的持续反向定义能力。如果你是刚接触openEuler的开发者别急着装图形界面或跑Hello World先搞清楚你手头的硬件是什么架构x86_64aarch64riscv64你的部署环境是裸金属、KVM、容器还是裸机启动如UEFI PXE再决定你要用的是标准ISO镜像、Cloud Image、Docker Base Image还是直接从src-openeuler仓库拉取spec文件自己构建。这个决策链条比“选哪个桌面环境”重要十倍。openEuler的文档里有一句很实在的话“我们不提供‘开箱即用’的完整系统我们提供‘按需组装’的可靠零件。”——这句话就是理解整个社区逻辑的钥匙。2. 社区运作机制与技术演进路径深度拆解2.1 “基座型社区”的本质从发行版到OS基座的范式迁移传统Linux发行版如Ubuntu、CentOS的社区模型是“中心化发布外围生态”。上游内核和GNU工具链由Linus和FSF主导发行版团队负责集成、测试、打包、发布下游用户和ISV基于发行版二进制包构建应用。这种模式在PC和通用服务器时代效率很高但在云原生和异构计算时代暴露出三个硬伤升级锁死一次内核升级可能破坏所有用户态二进制兼容性导致企业不敢升级架构割裂x86优化的软件包无法直接用于ARM服务器每次都要重打包安全响应滞后CVE修复需经发行版维护者审核、测试、打包、发布平均周期7–14天。openEuler社区选择了一条更激进的路放弃“发行版”定位转向“操作系统基座OS Base”定位。它的核心设计原则是分层解耦、契约驱动、生命周期自治。具体体现在三个关键层内核层Kernel不绑定单一内核版本而是维护多个内核流kernel-5.10-lts, kernel-6.1-rt, kernel-6.6-mainline每个流有独立的维护者、CI流水线和SLA承诺如LTS流提供5年安全更新。用户可根据业务需求选择内核而非被发行版强制绑定。用户态基础层Userland Base将glibc/musl、systemd/sysvinit、coreutils等划分为“基础运行时契约Base Runtime Contract”。只要满足该契约的ABI/API接口任何实现包括商业闭源组件都可插入。例如某金融客户要求使用自家加固版glibc只需通过契约测试套件即可集成无需修改openEuler源码。领域扩展层Domain Extension针对不同场景预置扩展包集合如cloud-native含iSulad/Kata Containers、edge-computing含EdgeGallery SDK、ai-acceleration含Ascend CANN 6.3适配层。这些扩展不进入主干仓库而是通过独立Git仓库统一YUM源管理用户按需安装互不影响。这种架构让openEuler能同时服务三类完全不同的用户政企用户锁定22.03 SP3 LTS内核标准用户态享受5年安全更新芯片厂商基于openEuler Codex分支注入自研驱动和工具链快速生成芯片专属镜像云服务商直接使用openEuler Cloud Image配合OpenStack或KubeSphere快速部署无需二次构建。提示不要在openEuler社区提“为什么不用最新内核”这类问题。它的版本策略不是“越新越好”而是“按需匹配”。就像汽车厂商不会给拖拉机装F1引擎openEuler也不会给边缘设备强推云原生内核。2.2 版本体系与发布节奏LTS、SP、Codex、Next的四维坐标系openEuler的版本命名看似混乱实则是一套精密的坐标系统横轴是时间维度LTS/SP/Next纵轴是场景维度Standard/Codex/Cloud/Edge。理解这套体系是避免踩坑的第一步。维度类型周期适用场景关键特征时间维度LTSLong Term Support每2年发布支持5年政务云、金融核心系统、工业控制内核锁定如22.03对应5.10仅接受安全补丁和关键缺陷修复SPService Pack每6个月发布如22.03 SP1/SP2/SP3企业生产环境升级在LTS基础上集成新硬件支持、性能优化、合规增强如SP3加入等保2.0加固模块Next每季度发布开发者预览、新技术验证包含主线内核如6.6、实验性特性如eBPF网络加速不承诺稳定性场景维度Standard所有LTS/SP版本均提供通用服务器部署完整GNU工具链X11图形支持可选Codex仅Next版本提供芯片厂商、硬件适配预置交叉编译工具链、SoC BSP模板、驱动开发框架Cloud所有版本提供Cloud Image云平台镜像市场无GUI、精简启动、预装cloud-init、支持热插拔网卡EdgeSP3起独立发布工业网关、车载终端musl libc、minirootfs、systemd-journald日志压缩举个实际例子某银行核心交易系统要求等保三级必须使用LTS版本。他们选了22.03 SP3因为SP3新增了TPM2.0可信启动支持和国密SM4加密模块。但他们的测试环境需要验证新数据库的ARM兼容性就用Next版本的aarch64镜像跑压力测试——两个环境用的是同一套内核补丁集只是用户态组件不同避免了“测试环境能跑生产环境报错”的经典陷阱。再看一个高频问题“openeuler 22.03 sp3重置密码”为什么比CentOS复杂因为SP3默认启用Secure Boot TPM2.0绑定单用户模式rd.break被禁用。重置密码必须通过以下任一方式使用管理员账号登录后执行passwd推荐从UEFI启动菜单进入救援模式需提前配置救援密钥通过BMC/IPMI远程挂载ISO执行chroot适用于物理服务器。这不是设计缺陷而是安全契约的体现openEuler把“易用性”让位于“可审计性”所有系统变更必须留下可追溯的审计日志。2.3 核心技术栈全景图从内核到AI加速的垂直整合openEuler的技术栈不是简单堆砌而是围绕“基础设施确定性”这一目标进行垂直整合。下面这张表列出了各层级的关键组件及其设计意图层级组件技术选型设计意图实操影响内核层主内核Linux 5.10LTS/6.1RT/6.6Next满足不同实时性/稳定性需求ARM服务器需确认内核是否包含特定SoC驱动如RK3588需6.1实时扩展PREEMPT_RT补丁集工业控制毫秒级响应启用RT需关闭KVM虚拟化二者资源争抢虚拟化层容器运行时iSulad轻量级OCI运行时替代Docker内存占用降低40%默认不兼容Docker Compose需改用iSulad-compose虚拟机监控器StratoVirtRust编写替代QEMU启动速度提升3倍仅支持KVM后端不支持Hyper-V或VirtualBox安全层可信启动OpenTitan TPM2.0硬件级启动链校验BIOS需开启Secure Boot否则无法加载签名内核权限模型SELinux SecGuard策略引擎细粒度进程隔离默认策略较严格部署新服务需先执行semanage permissive -a domainAI加速层异构调度Ascend CANN 6.3集成华为昇腾芯片原生支持x86服务器无法使用需专用昇腾硬件编译优化HiLens AI编译器自动向量化内存布局优化仅对Python/TensorFlow/PyTorch模型生效特别要强调iSulad和StratoVirt的选择逻辑。很多用户抱怨“为什么不用Docker”因为Docker daemon是单点故障风险源且其存储驱动overlay2在高并发IO下易产生inode泄漏。iSulad采用无守护进程架构每个容器直接调用runc启动延迟50msStratoVirt用Rust重写内存安全漏洞为零启动一个VM仅需120msQEMU需350ms。这不是技术炫技而是针对电信NFV场景“每秒启停数百个VNF”的硬需求。注意openEuler的man命令man 7 signal比CentOS更详细因为它集成了内核开发者注释。但man 3 pthread可能缺失——因为musl libc版本的man页未完全同步。遇到这种情况直接查/usr/share/doc/glibc-common/html/libc/下的HTML文档比man更权威。3. 实操核心环节从安装到生产环境调优的全链路指南3.1 安装阶段的三大决策点与避坑清单openEuler安装远不止“下一步”那么简单。安装过程中的三个关键决策直接决定后续运维成本决策1架构与镜像类型匹配x86_64服务器选Standard ISO带图形安装器或Cloud ImagePXE自动部署ARM64服务器如鲲鹏920必须用aarch64镜像Standard ISO自带UEFI引导RK3588开发板不能用Standard ISO必须用Edge版本的openEuler-22.03-Edge-rk3588.img.xz该镜像已预烧录U-Boot并配置DDR初始化参数RISC-V服务器目前仅Next版本支持需手动编译内核官方暂未提供预编译镜像。踩坑实录某客户用x86_64 Standard ISO刷写RK3588 SD卡结果卡在U-Boot阶段。原因是RK3588的ROM代码只识别特定分区表格式GPTESP分区而x86镜像使用MBR。解决方案用dd ifopenEuler-22.03-Edge-rk3588.img of/dev/sdX bs4M直接写入勿用balenaEtcher等GUI工具。决策2网络配置方式选择openEuler 22.03默认启用NetworkManager但生产环境强烈建议关闭它改用iproute2原生命令配置静态IP# 关闭NetworkManager避免与自定义脚本冲突 sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager # 配置静态IP以eth0为例 echo DEVICEeth0 BOOTPROTOstatic ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS1114.114.114.114 | sudo tee /etc/sysconfig/network-scripts/ifcfg-eth0 sudo ifup eth0为什么不用NetworkManager因为它的DHCP客户端在断网重连时会触发nmcli device reapply导致IP地址漂移违反金融系统“IP地址永久绑定”的合规要求。ifup脚本是原子操作失败即回滚符合确定性原则。决策3安全加固开关安装向导最后一步的“安全加固”选项不是勾选就完事。它实际执行三件事启用SELinux enforcing模式禁用root SSH登录强制密钥认证启用auditd日志审计记录所有sudo操作。如果勾选后无法SSH登录请立即通过本地console执行sudo setenforce 0 # 临时关闭SELinux sudo sed -i s/SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config然后检查/var/log/audit/audit.log找到被拒绝的操作如avc: denied { read } for pid1234 commsshd用ausearch -m avc -ts recent | audit2why分析原因再用semanage fcontext -a -t sshd_exec_t /usr/sbin/sshd修复上下文。3.2 单用户模式与密码重置SP3之后的全新流程“openeuler忘记密码用rd.break”在SP3已失效。因为SP3默认启用Secure Bootrd.break会破坏启动链完整性。正确流程如下场景1物理服务器有BMC/IPMI通过BMC Web界面挂载openEuler救援ISO设置BIOS启动顺序为“Remote CD/DVD”启动后进入救援环境执行# 挂载根分区假设为/dev/sda2 mkdir /mnt/root mount /dev/sda2 /mnt/root # chroot并重置密码 chroot /mnt/root passwd root exit # 重启并拔出ISO reboot场景2云服务器无物理访问在云平台控制台停止实例分离系统盘挂载为数据盘到另一台救援机在救援机上执行# 创建挂载点并挂载 mkdir /mnt/rescue mount /dev/vdb1 /mnt/rescue # vdb1为原系统盘 # 修改shadow文件需先解除chattr保护 chattr -i /mnt/rescue/etc/shadow sed -i s/^root:[^:]*:/root::/ /mnt/rescue/etc/shadow chattr i /mnt/rescue/etc/shadow # 重新挂载为系统盘并启动关键细节SP3的/etc/shadow文件被chattr i锁定直接vi编辑会提示“Permission denied”。必须先chattr -i否则重置无效。3.3 图形界面安装不是“装个桌面”而是“选对渲染栈”“openeuler安装图形界面”常被误解为dnf groupinstall Server with GUI。但openEuler的GUI策略是按硬件能力动态选择渲染后端Intel/AMD核显默认启用Xorg Mesa Gallium驱动NVIDIA独显需手动安装nvidia-driverSP3已内置470.141.03版本ARM Mali GPU必须用Wayland Panfrost驱动Xorg不支持无GPU服务器禁用GUI用Webmin或cockpit替代。安装步骤# 启用GUI仓库SP3需额外启用 sudo dnf install -y epel-release sudo dnf config-manager --set-enabled appstream-plus # 安装GNOMEWayland默认 sudo dnf groupinstall Server with GUI # 若需Xorg如旧外设兼容安装后执行 sudo nano /etc/gdm3/custom.conf # 取消注释WaylandEnablefalse验证渲染后端# 查看当前会话类型 loginctl show-session $(loginctl | grep current | awk {print $1}) -p Type # 查看GPU驱动 glxinfo | grep OpenGL renderer实测发现在RK3588上启用Xorg会导致HDMI输出黑屏必须用Wayland。这是因为Mali-G610 GPU的Xorg驱动尚未成熟而Wayland的Panfrost驱动已通过LTS认证。3.4 生产环境调优从内核参数到服务启停的12项必做动作装完系统只是开始。以下是我在三个大型项目中总结的12项生产环境调优动作每项都有明确依据禁用Transparent Huge PagesTHPecho never /sys/kernel/mm/transparent_hugepage/enabled echo vm.nr_hugepages 0 /etc/sysctl.conf依据THP在数据库场景会导致内存碎片MySQL 8.0官方文档明确要求禁用。调整swappiness至1echo vm.swappiness 1 /etc/sysctl.conf依据SSD普及后swap应仅作OOM最后防线过高值会引发频繁交换。启用NTP时间同步sudo timedatectl set-ntp true sudo systemctl enable chronyd依据Kubernetes要求节点时间误差1schronyd比ntpd精度更高。关闭IPv6若网络不支持echo net.ipv6.conf.all.disable_ipv6 1 /etc/sysctl.conf echo net.ipv6.conf.default.disable_ipv6 1 /etc/sysctl.conf依据某些老旧防火墙设备不识别IPv6 ACL导致连接超时。优化文件系统挂载参数# /etc/fstab中添加noatime,nobarrierSSD UUIDxxx / ext4 defaults,noatime,nobarrier 0 1依据noatime减少元数据写入nobarrier禁用写屏障SSD自带断电保护。限制core dump大小echo kernel.core_pattern /var/coredump/core.%e.%p.%h.%t /etc/sysctl.conf echo kernel.core_uses_pid 1 /etc/sysctl.conf ulimit -c 0 # 临时禁用依据防止磁盘被core文件占满符合等保2.0“日志存储空间管理”要求。禁用不必要的服务sudo systemctl disable avahi-daemon bluetooth firewalld依据avahiZeroconf在内网可能引发ARP风暴bluetooth在服务器无用。配置rsyslog集中日志# /etc/rsyslog.conf中添加 *.* 192.168.1.200:514 # UDP转发 *.* 192.168.1.200:514 # TCP转发推荐依据单机日志无法满足审计溯源要求必须集中存储。启用内核Kdumpsudo kdumpctl status # 检查是否启用 sudo systemctl enable kdump依据内核崩溃时生成vmcore是排查硬件故障的唯一证据。设置ulimitecho * soft nofile 65536 /etc/security/limits.conf echo * hard nofile 65536 /etc/security/limits.conf依据Java应用默认打开文件数上限1024高并发场景必然突破。禁用CPU节能模式echo performance /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor依据数据库和实时计算要求CPU频率恒定避免性能抖动。配置grub timeout为0sudo nano /etc/default/grub # GRUB_TIMEOUT0 sudo grub2-mkconfig -o /boot/grub2/grub.cfg依据自动化运维要求启动无交互避免人工干预。4. 常见问题与实战排查技巧实录4.1 高频问题速查表从安装失败到服务异常问题现象根本原因排查命令解决方案安装卡在“Checking media”ISO校验失败下载不完整sha256sum openEuler-22.03-LTS-x86_64-dvd.iso对比官网哈希值重新下载用aria2c -x 16 -s 16多线程下载SSH连接被拒绝port 22firewalld默认放行22端口但SELinux阻止sshdsudo ausearch -m avc -ts recent | audit2whysudo setsebool -P sshd_can_network_connect onyum update报错“Cannot retrieve metalink”mirrorlist URL过期国内镜像站未同步curl -I https://repo.openeuler.org/22.03/LTS/OS/x86_64/修改/etc/yum.repos.d/openEuler.repo将baseurl指向https://mirrors.huaweicloud.com/openeuler/22.03/LTS/OS/x86_64/systemctl start docker失败openEuler默认不预装docker需启用containerdsudo dnf install -y containerd.iosudo systemctl enable containerd sudo systemctl start containerdRK3588 HDMI无输出默认启用Wayland但HDMI驱动需Xorgloginctl show-session $(loginctl | grep current | awk {print $1}) -p Type编辑/etc/gdm3/custom.conf取消WaylandEnablefalse注释ping通但curl超时DNS解析失败resolv.conf被NetworkManager覆盖cat /etc/resolv.confsudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.confdf -h显示磁盘已满但du -sh *总和很小删除的文件仍被进程占用如nginx日志sudo lsof L1sudo kill -USR1 $(pgrep nginx)或重启相关服务journalctl -u kubelet报错“cgroup driver mismatch”Docker使用systemd cgroupkubelet使用cgroupfscat /var/lib/kubelet/config.yaml | grep cgroupDriver修改kubelet配置统一为systemd4.2 独家排查技巧从日志到内核的三层诊断法我处理过最棘手的一个案例某客户openEuler 22.03 SP3服务器每24小时随机宕机/var/log/messages只有一行kernel: watchdog: BUG: soft lockup - CPU#3 stuck for 23s!。常规思路是查CPU负载但top显示一切正常。最终用三层诊断法定位第一层用户态日志1分钟# 检查宕机前10分钟日志 sudo journalctl --since 2023-10-01 10:00:00 --until 2023-10-01 10:10:00 | grep -E (error|fail|panic) # 发现关键线索iscsi服务反复重启 Oct 01 10:05:22 server iscsid[1234]: Connection to [target: iqn.2023-01.com.example:storage] lost第二层内核日志5分钟# 提取内核环缓冲区dmesg sudo dmesg -T | grep -A 20 -B 5 soft lockup # 发现关联信息 [Mon Oct 1 10:05:22 2023] scsi host3: iSCSI Initiator over TCP/IP [Mon Oct 1 10:05:22 2023] iscsi: detected conn error (1020) [Mon Oct 1 10:05:22 2023] INFO: rcu_sched self-detected stall on CPU第三层硬件诊断30分钟# 检查iSCSI连接质量 sudo iscsiadm -m session -P 3 \| grep -A 10 connection # 发现TCP重传率5% # 进一步检查网卡 ethtool -S eth0 \| grep -i tx_errors\|rx_errors # 输出tx_fifo_errors: 1245 → 表明网卡FIFO缓冲区溢出 # 最终结论网卡驱动bugMarvell 88E6352升级固件解决这个案例教会我openEuler的“软锁定”错误90%以上源于硬件交互异常而非内核本身。排查时必须跳出“查软件日志”的惯性把dmesg、ethtool、smartctl作为第一响应工具。4.3 信创适配专项麒麟/UOS/统信系统的共性与差异openEuler与麒麟Kylin、UOS、统信UnionTech同属信创阵营但技术路线截然不同维度openEuler麒麟V10UOS V20统信Server内核来源Linux主线华为补丁Linux 4.19麒麟定制补丁Linux 5.10深度定制Linux 5.10统信定制包管理DNFRPMDPKGAPTDPKGAPTDNFRPM桌面环境GNOME/KDE可选UKUI自研DDE深度Unity自研安全框架SecGuardSELinux增强Kysec自主可控UOS-Sec等保强化UnionSec国密优先硬件认证鲲鹏/飞腾/海光/兆芯飞腾/龙芯/申威海光/兆芯/龙芯鲲鹏/飞腾/海光实际适配经验应用移植openEuler的RPM包可直接在统信Server上安装同源DNF但麒麟和UOS需转换为DEB包用alien工具驱动兼容openEuler的驱动模型更接近上游Linux而麒麟/UOS为适配龙芯LoongArch做了大量ABI修改导致同一驱动在openEuler编译成功在麒麟上需重写等保测评openEuler SP3已通过等保三级认证测评报告可直接用于麒麟/UOS项目但需补充“国产CPU适配证明”因麒麟/UOS强制要求龙芯支持。实操心得给客户做信创迁移时永远先问“你们现有系统是哪个厂商的用了什么CPU”。如果是飞腾D2000openEuler和麒麟都能跑但openEuler的ARM64生态更丰富如TensorRT支持如果是龙芯3A5000必须选麒麟因为openEuler尚未完成LoongArch 64位内核主线合并。5. 社区参与与技术贡献从使用者到共建者的跃迁路径openEuler社区最被低估的价值不是代码而是可复用的工程实践知识库。我观察到一个有趣现象GitHub上openEuler的PR数量年均12万远超Linux内核年均5万但真正被合并的PR不足15%。剩下的85%去哪了它们沉淀为社区Wiki、SIGSpecial Interest Group文档、以及无数个“已关闭但被引用”的Issue讨论——这才是新手最该学习的地方。第一步从Issue阅读开始0门槛不要一上来就fork代码。先去https://gitee.com/openeuler/community/issues按标签筛选good-first-issue找一个“文档补充”类任务。比如有个Issue标题是“补充RK3588 GPIO控制示例”里面已有开发者贴出Python代码但缺少接线图和电压说明。你只需拍一张开发板实物接线照用draw.io画个简图提交PR。这个过程你会学到openEuler的文档协作流程MarkdownGitee Pages如何用git am应用他人补丁社区Maintainer的review风格他们更关注可重现性而非代码优雅。第二步加入SIG实战1周上手openEuler有20个SIG小组每个聚焦一个垂直领域。新手推荐加入sig-cloud或sig-edgesig-cloud每周三20:00有线上会议议题是“iSulad在K8s 1.28的兼容性测试”你会听到一线运维吐槽“某个API变更导致helm install失败”然后看到Maintainer当场写patchsig-edge每月发布《边缘设备适配清单》包含RK3588/MT8666/Intel NUC的实测参数比官网文档更及时。第三步贡献代码3个月闭环真正的技术跃迁始于第一个功能PR。我的建议是选一个你正在用的功能如openeuler man命令发现它缺少某个手册页如man 3 clock_gettime查src-openeuler/man-pages仓库确认该页确实缺失按照CONTRIBUTING.md规范用mandoc语法编写提交PRMaintainer会要求你运行make test并附上man -l ./clock_gettime.3截图。这个过程看似简单但完成了从“使用者”到“共建者”的心理切换。你会发现社区Maintainer不是高高在上的“大神”而是和你一样会写错Makefile、也会被CI流水线打回的工程师。openEuler的活力正来自这种“人人可贡献、次次有反馈”的正向循环。最后分享一个小技巧在Gitee提交PR时标题务必包含[sig-xxx]前缀如[sig-cloud] Add iSulad metrics doc。这样Maintainer一眼就能分配给对应SIGReview速度提升3倍。这不是规则而是社区默契——就像老司机知道打转向灯不是给交警看的是给旁边车看的。