初始化网卡信息失败,linux无盘工作站搭建

我打算让 volumio 运行在我 2009 年购买的老爷机笔记本上,也让它发挥一点余温热。正常操作是将 volumio 的系统镜像刷到 U 盘上,连接电脑后使用 U 盘启动系统即可。但是家里没有找到合适的 U 盘(穷~~),加上前段时间听了同事关于 linux 内核的分享,感慨自己对系统的理解不够。因此我决定使用无盘启动 volumio 顺便研究一下 linux 启动原理。

目标:无盘启动 volumio 系统0.2 方案正常 Linux 启动流程大体如下:BIOS 启动,完成自检,选择启动硬件如果是磁盘系统读取 MBR从 MBR 指示,找到 GRUB 所在分区,加载 GRUB 显示菜单加载 Linux 内核到内存中执行 INIT 程序进入用户界面

由于我需要从网络启动,过程会变得复杂一些,主要变化如下在 MBR 引导前,需要执行一系列的 PXE 流程,目的是挂载 iscsi 磁盘。在加载 linux 内核后,由于之前 iPXE 固件已经退出,还需要再次挂载 iscsi 磁盘。

0.3 准备工作无盘启动并不是说完全没有磁盘,只是客户端本身没有磁盘,我们需要在远端给机器提供一种文件存储和磁盘共享的方案。我这里选择的是 iscsi 共享,相比于 NFS 和 samba 共享,它更底层,对系统的兼容性更好。

iSCSI 利用了 TCP/IP 作为沟通的渠道。透过两部计算机之间利用 iSCSI 的协议来交换 SCSI 命令,让计算机可以透过高速的局域网集线来把 SAN 模拟成为本地的储存设备。

关于 iscsi 的配置不是本文重点,这里就不详细描述了,要完成 iscsi 磁盘的挂载需要接信息。

iscsi 服务器地址:我这里是 nas 服务的地址 192.168.3.5

target 名称:这个是服务端用来区分目标的,通常一个 target 服务一个客户端,并关联一块共享存储,例如:iqn.2005-10.org.freenas.ctl:yong-pc.volumio

initiator 名称:这个是客户端名称,用来告诉服务端谁来请求了。1 BIOS 和 UEFI准备工作做完,我们先来了解一下计算机的启动原理,这里就要说到 BIOS 和 UEFI,他们是计算机按下电源后最先被执行的程序。1.1 BIOS (Basic Input/Output System)上个世纪 70 年代初,”只读内存”(read-only memory,缩写为 ROM)发明,开机程序被刷入 ROM 芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序叫做”基本输入输出系统”(Basic Input/Output System),简称为 BIOS。

BIOS 程序首先检查,计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为 POST。硬件自检完成后,BIOS 把控制权转交给下一阶段的启动程序。

这时,BIOS 需要知道,”下一阶段的启动程序”具体存放在哪一个设备。也就是说,BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做”启动顺序”(Boot Sequence)。

1.2 UEFI (Unified Extensible Firmware Interface)不知道大家是否发现,这些年已经很难看到 BIOS 的身影了。

ROM 的存储能力有限,BIOS 能驱动的硬件类型和数量大大受限。导致大量新硬件无法在 PC 启动时被加载。最明显就是你无法在 BIOS 时使用鼠标。此外 BIOS 的代码历史悠久难以维护。

在 2005 年年中时候,包括 BIOS 供应商、OS 供应商、系统制造商以及芯片生产公司在内的行业参与者统一建立了统一的 EFI 联盟(UEFI,Unified Extensible Firmware Interface)并在 2006 年一月发行了 UEFI 规范 2.0。

从此你可以愉快地在 PC 启动初期使用鼠标,甚至像苹果一样加载网络,实现联网下载并安装操作系统。

UEFI 的启动流程和 BIOS 的启动流程不同,由于我 2009 年购买的老爷机还是 BIOS 结构,这里不详细展开,简单提一下。系统开机 – 上电自检(Power On Self Test 或 POST)。UEFI 固件被加载,并由它初始化启动要用的硬件。固件读取其引导管理器以确定从何处(比如,从哪个硬盘及分区)加载哪个 UEFI 应用。固件按照引导管理器中的启动项目,加载 UEFI 应用。已启动的 UEFI 应用还可以启动其他应用(对应于 UEFI shell 或 rEFInd 之类的引导管理器的情况)或者启动内核及 initramfs(对应于 GRUB 之类引导器的情况),这取决于 UEFI 应用的配置2. PXE回到我的 BIOS 老爷机,上电自检完成后 BIOS 按照设置的启动顺序应该交棒磁盘,但是 但是 但是 这个机器没有硬盘,也没有插入 U 盘,找不到任何启动设备的 BIOS 将控制权交给了网卡,BIOS 光荣退场进入了 PXE 阶段。

预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境) 提供了一种使用网络接口启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统

2.1 PXE 原理Client 向 DHCP 发送 IP 地址请求消息,DHCP 返回 Client 的 IP 地址,同时将启动文件(如:pxelinux.0)的位置信息(通常是 TFTP 路径)一并传送给 ClientClient 向 TFTP 发送获取启动文件请求消息,TFTP 接收到消息之后再向 Client 发送启动文件大小信息,试探 Client 是否满意,当 TFTP 收到 Client 发回的同意大小信息之后,正式向 Client 发送启动文件 Client 执行接收文件Client 向 TFTP 发送针对本机的配置信息文件请求,TFTP 将配置文件发回 Client,继而 Client 根据配置文件执行后续操作。Client 会加载启动文件,之后根据配置执行动作。这里有多重方案进行下一步操作。可以直接通过 Http 协议获取 Linux kernel 和 ramdisk 然后启动或者加载一块 iscsi 磁盘,将 linux kernel 和 ramdisk 等信息放在 iscsi 磁盘中,走正常磁盘引导。我用的是这种方案

2.2 iPXE上面说到了启动文件,普通的 pxe 启动文件功能有限,通常只能从 tftp 服务器上获取文件,不支持 HTTP 协议和其他共享协议,更别说我们要支持的 iscsi 磁盘挂载了。这里推荐一个高端开源 pxe 启动文件:iPXE(https://ipxe.org/)。它支持从 HTTP、iscsi SAN、 Fibre Channel SAN、AoE SAN 等多种方式启动,甚至还支持无线网卡。此外它还可以定制一个启动脚本和菜单。

iPXE 需要根据自己硬件对应的平台进行编译,编译前需要搞清楚几个要点:启动方式:BIOS 或者 EFI 前面已经说了。平台:X86 或 ARM,如果用树莓派等产品就是 ARM,PC 是 x86CPU 位:32 或 64,32 位机器只支持 32 位固件,64 位机器可以兼容 32 位和 64 位固件。注意:如果使用 64 位固件需要保证后续所有环节使用兼容 64 位的软件,我就遇到了 SysLinux 不支持 64 位,导致卡死的问题。使用如下命令编译(更多细节见:https://ipxe.org/appnote/buildtargets):

git clone git://git.ipxe.org/ipxe.git

make [platform]/[driver].[extension]

Platform 支持如下:按照上面说的启动方式、平台、CPU 情况选择。bin (alias for bin-i386-pcbios)bin-i386-pcbiosbin-i386-efibin-i386-linuxbin-x86_64-efibin-x86_64-linuxbin-x86_64-pcbiosbin-arm32-efibin-arm64-efiDriver:主要选择支持的网卡驱动类型,一般选 ipxe(表示所有支持的网卡,但可能导致生成的启动文件过大,如果过大可以酌情选其它)

Boot type:和启动方式、启动介质有关,参考下表:

编译时添加 EMBED={脚本名称} 可以关联一个启动脚本。推荐一个大佬做好的脚本 可以直接使用。

我最终命令如下:

git clone git://git.ipxe.org/ipxe.git

cd ./ipxe/src

wget

make bin-i386-pcbios/ipxe.pxe EMBED=menu.ipxe

完成之后在/data/ipxe/src/bin-i386-pcbios/ipxe.pxe 可以拿到最终的启动文件。2.3 DHCP、TFTP 配置如何配置 DHCP 和 TFTP 服务器不是本文重点,如果需要命令行方式配置可以参考这篇文章的前半部分https://blog.51cto.com/dyc2005/2068188

如今大部分高端路由器或开源路由器固件都内置了 DHCP 和 TFTP 配置功能。我家的 LEDE 路由器配置界面如下。

TFTP 服务器根目录:这个是启动文件、配置文件存放的目录路径(是在路由器上的路径,可以放在 u 盘挂上去,也可以直接放在路由器存储的目录)网络启动镜像:这是对客户端下发的启动文件名称。(不同 CPU 架构,不同平台的文件名不同)拷贝之前编译好的 ipxe.pxe 和 menu.ipxe 文件到/www/pxe/目录下,并设置网络启动镜像为:ipxe.pxe

配置正确,启动后就可以看到如下选择界面了:

3. 分区:MBR 和 GPTipxe 完成使命后,正式交棒给磁盘,如果你是硬盘启动,可以直接跳过第 2 部分,直接到这一步。这一阶段系统需要从磁盘上找到启动文件并加载。在说如何找到启动文件前,先要说说硬盘是如何划分区块的,主要有两大方式 MBR 和 GPT。我们先来聊一下机械硬盘的工作原理。

机械硬盘由坚硬金属材料制成的涂以磁性介质的盘片,盘片两面称为盘面或扇面。

假设磁头不动,硬盘旋转,那么磁头就会在磁盘表面画出一个圆形轨迹并将之磁化,数据就保存在这些磁化区中,称之为磁道,将每个磁道分段,一个弧段就是一个扇区。一个硬盘可以包含多个扇面,扇面同轴重叠放置,每个盘面磁道数相同,具有相同周长的磁道所形成的圆柱称之为柱面,柱面数与磁道数相等。如下图:

最初的寻址方式称为 CHS,所谓 CHS 即柱面(cylinder),磁头(header),扇区(sector),通过这三个变量描述磁盘地址。3.1 MBR说了这么多还是没说明白到底计算机怎么从磁盘上找到引导程序。答案是:它被固定写死在了 0 柱面,0 磁头,1 扇区的位置通常是 512byte,这个位置被称为主扇区(Master Boot Record, MBR)。

MBR 主要包含如下数据:主引导记录(bootloader),负责从活动分区加载并运行系统引导程序。446 字节硬盘分区表项(DPT——disk partition table),由四个分区表项组成,负责记录磁盘的分区情况。64 字节。硬盘有效标志(magic number),代表引导扇区结束,占用 2 字节

Bootloader:这部分记录了一段较小引导代码,用于去启动硬盘其他分区位置上更大的引导文件,例如 linux 操作系统的 grub 目录。

我们知道一个硬盘的每个分区的第一个扇区叫做 boot sector,这个扇区存放的就是操作系统的 loader。如上图,第一个分区的 boot sector 存放着 windows 的 loader,第二个分区放着 Linux 的 loader,第三个第四个由于没有安装操作系统所以空着。至于 MBR 的 bootloader 是干嘛呢, bootloader 有三个功能:提供选单:让用户选择进入哪个系统。读取内核文件:默认启动的 loader 会被拷贝一份到 MBR 中,这样就可以直接读取内核了,图中 1 部分转交给其他 loader:图中 2,3 部分Disk Partition table:这一部分 64 字节大小被均分为 4 份,每份大小 16 字节,每当我们在硬盘上创建出一个新的主分区或者扩展分区时,便会占用 1 个 16 字节的大小用于记录这个分区的相关信息(例如起始和截止柱面位置、分区文件系统类型等等)。这就是为什么 mbr 分区模式最多只能有 4 个主分区的原因。

MBR 的局限:最多只支持 4 个主分区,超过 4 个就需要使用扩展分区。磁盘的最大容量只能到 2.2TB如今我家的硬盘都 4T 了,MBR 早就不能满足需求了。你也不能怪 MBR,毕竟人家 1983 年就提出了,比我的年纪还大。3.2 GPT为了解决 MBR 的问题,GPT 分区诞生,GPT 全称 Globally Unique Identifier Partition Table,也叫 GUID 分区表,它是 UEFI 规范的一部分(但这并不是说它只支持 UEFI,它也支持 BIOS 方式的引导)。

GPT 分区结构如下:Protective MBR:GPT 分区表的最前面部分也保存了和 MBR 相同的格式和内容称为 Protective MBR,这极大地提高了 GPT 分区表的兼容性。主 GPT Header:这里记录了分区表项目数和每项目大小。主 GPT 分区表:包含分区的类型 GUID,名称,起始终止位置,该分区的 GUID 以及分区属性实际分区备份 GPT 分区表: 用于提高安全性,防止主 GPT 分区表损坏备份 GPT Header: 用于提高安全性,防止主 GPT Header 损坏3.3 Bootloader 写入使用 dd 命令结合 hexdump 可以输出 MBR 信息

dd if=~/Desktop/volumio-2.799-2020-07-16-x86.img ibs=512 count=1 | hexdump -C

同样的使用 dd 命令可以拷贝 MBR 信息从 img 文件到物理磁盘。(之前我是分分区写入到磁盘的,导致 MBR 信息丢失无法引导)

dd if=~/Desktop/volumio-2.799-2020-07-16-x86.img ibs=512 count=1 of=/dev/sda

也可以使用下载的 syslinux 中的 mbr.bin 写入

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sda //MBR分区表

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/bios/gptmbr.bin of=/dev/sda //GPT分区表4. 引导加载程序:Syslinux 和 GRUB前文说到 MBR 的 bootloader 主要功能是交棒内核,但是 bootloader 不会直接拉起 linux 内核,400K 太小,它没有能力将 linux 内核直接加载到内存。这时需要引导加载程序登场,它的主要目的就是将系统内核镜像和 initrd 镜像加载到内存并将控制权交给它们。目前常用的有两种 Syslinux 和 GRUB:Syslinux 是一个启动加载器集合,可以从硬盘、光盘或通过 PXE 的网络引导启动系统。支持的文件系统包括 FAT,ext2,ext3,ext4 和非压缩单设备 Btrfs 文件系统。GRUB?,即 GRand Unified Bootloader(大一统启动加载器),是一个多重启动加载器,承自 PUPA 项目。今的 GRUB 也被称作 GRUB 2,而 GRUB Legacy 表示 0.9x 版本。对于普通用户来说他们有什么用呢?它可以提供选单选择 Linux 内核版本,此外加载程序使得我们可以向 Linux 内核传递参数。这点很重要,在我的案例中 volumio 就是通过 Syslinux 向内核传递启动参数的。

Syslinux 已经不支持 bios64 位系统了,目前使用 GRUB2 的比较多。由于 volumio 使用的是 Syslinux 我没有对 GRUB 展开研究。

下图是 volumio 的默认 syslinux 配置。

LINUX 命令:指定了当前内核文件为 vmlinuz-3.18.5 版本;INITRD 命令:指定了 initrd 文件为 volumio.initrd(之后修改 initrd 也就是修改这个文件);APPEND 命令:是向内核传递的参数,在下文 initrd 的 init shell 中可以通过 cat /proc/cmdline 读取到。这里指定了 imgpart,bootpart 的 uuid 用于挂载分区,imgfile 名字用于确定当前真实 root 分区的文件名,还有 loglvevel、USE_KMSG 等参数。5. 内核:vmlinuz 和 initrd引导加载程序交棒之后系统进入内核引导阶段。这一步会在内存中运行系统内核和根文件系统。之后根目录下的 init shell 会被调用执行,完成进一步的初始化操作。5.1 vmlinuz 和 initrdvmlinuz 是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz 是可执行的 Linux 内核。

initrd 是“initial ramdisk”的简写。initrd 一般被用来临时的引导硬件到实际内核 vmlinuz 能够接管并继续引导的状态。initrd 字面上的意思就是”boot loader initialized RAM disk”,换言之,这是一块特殊的 RAM disk,在载入 Linux kernel 前,由 boot loader 予以初始化,启动过程会优先执行 initrd 的 init 程序,initrd 完成阶段性目标后,kernel 会挂载真正的 root file system ,并执行/sbin/init 程序。

采用这种分离的方式,使得我们有机会在内核引导阶段做一些我们自己的事情。简单读了 volumio.initrd 中的 init shell 发现它至少做了几件事情:读取 syslinux 传递来的环境变量根据变量决定是否在屏幕打印日志。USE_KMSG 参数决定加载各种内核驱动模块挂载 boot 分区使用 fdisk 处理磁盘,img 文件写入磁盘后大小不一致,首次启动需要使用 fdisk 命令调整分区大小挂载一个 imgpart 分区,这个不是真正的 root 分区,这里面的 volumio_current.sqsh 文件才是,这样做的目的是方便系统升级,在系统内替换 imgpart 分区的 volumio_current.sqsh 文件即可完成系统升级。volumio_current.sqsh 文件名也是通过 imgfile 参数决定的。处理 volumio_current.sqsh 升级问题,发现有新的 volumio.sqsh 文件会重命名旧的,然后将新的重命名 volumio_current.sqsh使用 overlay 方式结合 volumio_current.sqsh 文件挂载真正的 root 分区。执行 switch_root 命令,重定向新的根分区并执行/sbin/init 命令。5.2 initrd 编辑由于 linux 内核启动后,之前 ipxe 对应的环境已经退出,因此之前挂载的 iscsi 磁盘也无法访问,需要在 initrd 的 init shell 中重新挂载 iscsi 磁盘。因此我需要在上文的 4 步骤之前挂载 iscsi 磁盘,修改如下:加载网卡内核驱动启动网络启动 iscsi 客户端挂载网络磁盘。可以使用如下方式编辑已经生成好的 initrd 文件。

mount -o loop,offset=1048576 ./wrt/Build/Volumio2.799-2020-09-29-x86.img ./vboot/ //挂载img镜像的boot分区到目录

cp ../vboot/volumio.initrd volumio.initrd.gz //拷贝initrd文件,重命名一下

gunzip ./volumio.initrd.gz //解压gz文件

cpio -ivmd < volumio.initrd //展开initrd文件,在当前目录就可以看到整个rom disk的内容了 vim init //编辑init shell find . | cpio -c -o > ../volumio.initrd.img //重新打包成新的initrd

gzip volumio.initrd.img

mv volumio.initrd.img.gz volumio.initrd

还有另外一种方案,由于 volumio 是开源项目,编译 volumio 的脚本在 github 开源。我可以编辑编译脚本,直接修改 init 之后编译成新的 initrd 文件。

git clone

ls -la scripts/initramfs/init-x86

ls -la scripts/x86config.shx86config.sh 这是编译生成 x86 版本 volumio 镜像的脚本,在这个文件中,我们需要添加命令,使得生成的 initrd 文件中包含 iscsi 客户端init-x86 这个文件是 initrd 文件在系统启动后,需要执行的 init shell 脚本。这里我们需要添加 网卡驱动、初始化 iscsi 客户端。首先处理 x86config.sh 脚本,我们需要在 initrd 中添加 iscsi 客户端下图中:193-195 行安装 iscsi 客户端 231-232 行向 initrd 中添加 iscsi 模块

之后处理 init-x86,在 118 行左右的位置,脚本读取了配置在/proc/cmdline 中的根目录 uuid 并在之后挂载磁盘。这里的 cmdline 就是之前说到的在 syslinux 阶段向内核传递的参数。所以我们要在挂载磁盘前加载网卡驱动、启动网络、启动 iscsi 客户端、挂载 iscsi 磁盘

 

修改如下图:103 行 加载网卡驱动104 行 加载 iscsi 内核模块105 行 加载 iscsi ibft 模块107-108 行 通过 ibft 配置网络114-116 行 使用 ibft 配置连接 iscsi 服务器并挂载磁盘

这里要说一下 ibft 这是一种将 iscsi 配置信息传递到系统的方式,我们在 iPxe 阶段已经配置网络信息、iscsi 服务器地址、iscsi target 等信息了,这里可以使用 ibft 直接读取并使用。当然你也可以在这里再次手动启用 DHCP,手动初始化 iscsi 客户端。

修改完成后,iscsi 磁盘就可以像正常本地磁盘一样被挂载,之后的操作就和正常硬盘安装一样了,正常启动进入 volumio 系统。6. init 进程内核引导阶段完成以后,系统会挂载真实的 root 分区,执行/sbin/init 程序初始化系统环境。这一阶段已经和是否网络启动没有关系了,不过启动原理都研究到现在了就顺便一起看一下吧。

/sbin/init 会首先确定运行级别,这个配置在/etc/inittab 中,一般 Linux 有 7 种运行级别(0-6)。一般来说,0 是关机,1 是单用户模式(也就是维护模式),6 是重启。运行级别 2-5,各个发行版不太一样,对于 Debian 来说,都是同样的多用户模式(也就是正常模式)。确定运行级别后会访问/etc/rcN.d(这里的 N 就是运行级别)。

这里的文件都采用“字母 S 或 K+两位数字+程序名”的命名方式。其中 S 开头的表示在这个级别需要执行 start 命令,K 开头需要执行 Stop 命令,数字越小越优先执行。系统会依次执行相应的软件和服务,负责用户界面的程序也被启动你就有了 X11 界面,然后是 SSH 服务你就可以使用 ssh 登录。这样系统就完成了启动。

当然啦现在这种方式已经过时了,目前基本使用 systemd 方式用 systemctl 命令管理。篇幅已经很长了,这块有兴趣的同学自己搜索一下。7. 尾巴7.1 其他遇到的问题syslinux 卡死这个问题前面说到了,挂载 iscsi 磁盘后 ipxe 交棒磁盘引导,但是就卡死了。

经过很多的 google 和尝试之后最终发现,我使用了 64 位的 iPxe 引导固件,但是 syslinux 只有 32 位版本导致卡死,更换了 32 位的 iPxe 固件后解决。

可以启动无法关闭这个问题困扰了我很久,系统可以正常启动,但是在关机或者重启时会死机,按键没有任何反应但是系统应该还是活的(大小写灯正常切换)只能强制关机退出。经过排查原因可能是:关机时网络服务会关闭导致网卡关闭,进而导致 iscsi 网盘断开。但是此时系统根分区还没有 umount 导致系统无响应。

我禁用了网络服务的关机关闭,把 K06networking 从 rc0.d 目录中去掉就好了。

Airplay 服务无法找到Volumio 自带 shairport-sync 服务,手机可以通过 airplay 链接 volumio 系统播放音乐,但是在我折腾完以后发现怎么也搜不到。经过排查 shairport-sync 使用 mDns 发布组播告诉局域网内的所有设备自己的地址,使用的是 avahi-daemon 程序。排查日志发现它启动时没有识别到网卡。我猜原因应该是我们的网卡是在内核引导阶段自己拉起的,并不是进入系统后由 networking 服务拉起的,所以 avahi-daemon 无法查找到它对应的 ip。

我没有找到很好的解决方案,还好老爷机还有一块无线网卡,最后使用了无线网卡绑定 shairport-sync 服务。7.2 最终效果
万字详文干货:从无盘启动volumio看Linux启动原理

7.3 总结总结:为了省掉一块 U 盘,我开始折腾 iscsi 无盘启动没想到这一折腾就是好久,前后研究了好多资料好好的学习了一下 linux 的启动原理。

实际过程并没有文中展现的那么顺利,很多研究的弯路没有在文中一一展现出来。在不同的节点也有很多方案可以选择,比如:iPxe 本可以直接 http 下载 vmlinuz 和 initrd 引导,这样就可以省去 MBR 和 syslinux 引导。但是后来想想都研究了还是整理给大家。再比如 initrd 中 iscsi 客户端的启动和初始化有很多种方式,一开始我都手动初始化网卡,设置 dhcp 和 ip 路由。最后还是觉得太麻烦发现 ibft 的方案最简单,果断选择了它。

本文来自投稿,不代表展天博客立场,如若转载,请注明出处:https://www.me900.com/324183.html

(0)

相关推荐

  • 车载中控台软件安装教程,中控怎么加装软件

    X95原生车机内容中规中矩,没啥可玩儿的。但是面对这么大的屏幕,不利用真是有点儿不甘心,其实X95的12个喇叭我在听音乐时候没有觉的很好,这个音响系统放个迪曲儿都燥不起来,有点儿闷,调了也不行。但事实证明,这个音响看电影,看电视剧挺好,有点儿剧场环绕效果。 还是先看效果:       条件准备: 1、手机A,安装悟空遥控器。 2…

    2023-06-30
  • 怎么能挣钱(做什么行业能赚钱)

    俗话说得好,一技在手,天下可走,这句话就足以说明手艺的重要性了,所以说有自己的一门手艺,永远不用担心失业,那一辈子不失业的手艺有哪些?下面来我们就来给大家讲解一下。 1、厨师 好吃的食物都是经过厨师们钻研出来的,以后肯定会可以做做饭的机器人,但是它们只会根据冰冷的数据做出不会坏掉的食物,想让一种食物有多种口味,还是需要人类心中的爱。 2、汽车修理 现在马路上…

    2022-01-04
  • 拼多多领100元红包怎么操作更快,拼多多领100元红包怎么领取

    《拼多多领100元红包怎么操作更快?》 在如今的电商时代,拼多多以其低价优惠的策略吸引了众多消费者。 而领取100元红包更是让人心动,那么怎样操作才能更快地领到这100元红包呢?接下来我们一起深入探讨。 一、了解拼多多红包活动规则 也许你会疑惑,为什么要先了解活动规则呢?这就好像我们要参加一场比赛,必须先清楚比赛的规则和要求一样。 拼多多的红包活动通常有一些…

    2025-03-13
  • 十大公认最好用的洗发产品(国内洗发水十大排行榜)

    现在对洗发水的要求越来越高了 也不仅仅是清洁干净那么简单了 如果你还只知道海飞丝icon,飘柔这些 那么你就out了,掉发不在少数 国货正当前,自从换了国货洗发水掉头发也没几根了 这些好用的洗发水,你的洗发水上榜了吗?  

    2022-03-03
  • 珠宝软文营销文案(珠宝品牌推广文案范文)

    近年来,随着人们生活水平的迅速提高和审美观念的不断变化,时尚珠宝品牌在中国市场蓬勃发展。接下来,以珠宝品牌策划为主题,为珠宝公司提供一些珠宝品牌策划思路,成功的品牌不仅可以是成功的时期,而且必须具有长期的品牌生命力。任何品牌的成功都不是一步之遥,而是可持续的。随着时代的变迁,它会遇到各种各样的品牌问题。希望为珠宝品牌规划提供一些参考。   一、市场…

    2022-03-12
  • 郭晓婷刘诗诗最好的闺蜜,刘诗诗和谁是闺蜜

    郭晓婷刘诗诗最好的闺蜜,刘诗诗和谁是闺蜜郭晓婷刘诗诗最好的闺蜜,刘诗诗和谁是闺蜜郭晓婷刘诗诗最好的闺蜜,刘诗诗和谁是闺蜜郭晓婷刘诗诗最好的闺蜜,刘诗诗和谁是闺蜜

    无意点进了#郭晓婷花魁造型#的热搜,好家伙,一整个被惊艳住。   画着花魁妆容的明艳大美人,眼里含泪,侧着脸望着远方,似乎在等待着什么。 出场即惊艳,这谁看了不迷糊?   看惯了千篇一律的造型,喵妹被郭晓婷这个古装造型狠狠惊艳到。 不管是发型头饰,还是精美的花钿,都有一种难得的故事感,而眉眼之间又是风情万种的美,简直太蛊了。  …

    2023-06-30 投稿
  • 美乐家到底能不能做,美乐家为什么不好做

      如果有人跟你说,美乐家很容易经营,能够躺赚,那么,他要么就是个骗子,要么就是个傻子。因为这不可能。 但实际上,我们也总是看到很多貌似没有人脉资源、没有销售能力的人在美乐家经营得很好。反而,另外一些人,貌似资源充足,能力超强,却经营不起来。于是,我认真研究了这些人,对比他们的不同,结果,我发现了一个秘密。 他们仅仅是心态的不同,前者以投资的心态,…

    2022-03-23
  • 2021有效实名认证大全(2021最新实名认证)

    建议网络游戏开启实名制人脸识别”“建议未成年人网游每30分钟刷一次脸”“建议禁止明星代言网游”……今年两会期间,未成年人游戏相关话题成为部分代表委员关注的焦点。 在这背后,未成年人沉迷游戏、退款难等痼疾难解。3月17日,《中国经营报》记者在“黑猫投诉”平台检索发现,与“游戏”相关的投诉话题多达134447条,涉及“未成年人游戏”的搜索结果是6351条。《黑猫…

    2022-02-20
  • 清代驱邪符咒秘(辟邪的经文有哪些)

    迎欢您浏览《辟邪篇》,本篇将为大家介绍一些简单常见的驱邪避鬼物品和方法,毕竟看了这么多吓人的东西,总要学两招防防身啊。但神像、佛经、法器等宗教相关的辟邪物品和方法不在其中。 1.唾液:人阳气最为鬼之所惧,人之阳气最重在于唾液,古代驱魔师常用此法击鬼。紧张时可吐几口唾液驱邪气。 2.大蒜:此物烈性,气味香烈,百虫不招。且有避鬼妙用,西方人更是把它和十字架并列在…

    2022-01-16
  • 大航海时代4拉斐尔,大航海时代4华梅攻略详细

    大航海时代4拉斐尔,大航海时代4华梅攻略详细大航海时代4拉斐尔,大航海时代4华梅攻略详细大航海时代4拉斐尔,大航海时代4华梅攻略详细大航海时代4拉斐尔,大航海时代4华梅攻略详细

    在15世纪到18世纪的”大航海时代”,欧洲一批又一批的航海家,在梦想驱动和财富蛊惑下,前赴后继地扬帆于天海之间,探索于未知之地。大航海时代这个游戏即是以此为历史背景而展开的。 在《大航海时代2》中,玩家的舰队最多由10只船只组成。由于在《大航海时代2》中,玩家初期可以通过里斯本和马德拉维黄金贸易积累大量的资金,因此游戏的中后期根本不存…

    2023-07-11 投稿
  • 证书尺寸(教师资格证笔试报名照片尺寸)

    2021教师资格证报名照片尺寸大小是多少?9月2日起教师资格考试报名开始,网上报名上传的电子照片大小有何标准?教资报名照片什么背景?现整理往年照片要求以供参考,具体以今年当地公告为准。 电子版照片要求: 考生上传的照片将打印在考生准考证和考场签到表上,并将在中小学教师资格考试网保存以供使用成绩的单位核查。如使用不合格的照片,将无法通过报考审核。 (1)本人近…

    2022-05-10
  • 电脑安装各种色色的软件(你以为保护电脑的良心软件千万别装)

    只要用电脑就避免不了安装各种色色的软件,哦不对,是形形色色的软件。但是你有没有想过,有很多看似在保护电脑的软件,实际上是在利用你赚钱呢?下面我们就揪出4个“良心”软件,你可别被浓眉大眼的表象欺骗了。 01 全家桶典范:360安全卫士 360安全卫士恐怕是萌新电脑中都会安装的软件,常用的功能包括垃圾扫描,开机自启软件管理,网速测试,以及强力卸载。 全家桶就问你…

    2022-01-08