问题

本人昨天买了一块SSD, 结果后来发现原来这块SSD存在硬件质量问题, 造成了软件上的种种诡异问题, 如U盘时而识别时而不识别, 如触摸屏左键时而抽风, 如ghost安装win10时几乎到100%的进度时忽然来一个无响应, 重启系统后出现了"To interrupt normal start up, press the blue ThinkVantage button.", 此时键盘无反应, 既进不了系统, 也进不了BIOS. 拨CMOS电源也无效. 最后发现是这块SSD有质量问题. 估计是SSD有控制器主要是软件吧, 控制器软件有bug导致运行ghost这种软件时也能导致硬件挂住.
也正是因为这个问题吧, 七搞八搞, 一不小心在重试的过程中将之前的一块linux分区误删了, 于是之前打算的迁移双系统的想法泡汤(当然, 那些通过分区助手或者ghost来迁移分区的网上文章照着做没一个是成功的).
这样, 有机会事隔多年再一次重装双系统的机会, 但是发现世道变了, 之前百试不爽的方法现在行不通了. 后经查证, 主要原因是ubuntu 18.04开始默认采用UEFI, 而win10默认仍然是MBR. 这样会导致一系列的问题, 如报错: grub-efi-amd64-signed failed to install 18.04, 统一采用UEFI安装.

BIOS设置

在BIOS中将Boot Mode设置为UEFI Only, 如果有Secure Boot选项还要disable它(不做这一步可能会造成按F12键之后无法找到U盘)
注: 改成UEFI only之后, 运行双系统, 四系统都没问题, 但后来进不了U盘的livecd, 报: couldn’t get UEFI db list, 所以只得改回Both, 但UEFI优先.

安装win10

  • 下载大白菜UEFI专版 - http://www.bigbaicai.com/download.html?down2 (20210321更新,注:目前已没有UEFI专版,下载普通版即可。使用大白菜一般只能通过ghost iso安装,选择msdn iso原版时总是说无法选择iso,原版iso可以通过ultraiso写入usb即可。当然大白菜也提供了PE工具箱)
  • 下载win10 ghost - axel -n 10 http://xz.win10cjb.com/18.5/win10_64/DEEP_Win10x64_201805.rar
  • 制作大白菜启动U盘, 如果界面上有UEFI字眼就点上(不记得了, 有就点上), 还要注意一点, 记得点里面的格式转换, 将FAT32格式(HDD-FAT32)转换成NTFS(HDD-NTFS)转换, 否则HDD-FAT32格式不能拷贝大于4G的ghost文件哦,
  • 按F12选U盘启动进入大白菜后, 用DiskGenius工具重新分区, 必须将BIOS+MBR格式转UEFI+GPT格式. 分区表格式为GUID而不是MBR, window上管EFI分区叫ESP/MSR分区
  • 注意, 不要修改推荐的卷标, 这个卷就是指向的ESP/MSR分区.

安装win10后

安装win10后需要将禁用掉快速启动, 否则会造成按F12无法选择U盘启动. 菜单路径为: “设置 -> 系统 -> 电源与睡眠 -> 其他电源设置 -> 选择电源按钮的功能 -> 更改当前不可用的设置 -> 启动快速启动”
win11中是在:控制面板 -> 硬件与声音 -> 电源选项 -> 系统设置

安装ubuntu 18.04

像安装win10一样, 一样要注意重要一点, 需创建大概300M左右的UEF分区, 另外, 还可以创建一个根分区和一个备份文件用的bak分区.
注意, windows非常霸道, 它是总修改bios里的启动顺序, 将它的"Windows boot Manager"放在"ubuntu grub"的前面, 可以在bios里锁定启动顺序

安装win7

win7若没有sata的驱动, 所以得先改回IDE, 装完win7之后再改回AHCI, 否则也容易挂在启动界面不动了.
注: 我未遇到以上问题, 可能因为我装的win7并不是原版的, 已经带了sata驱动

加装SSD

如果加装了SSD之后呢? 那得注意:

  • 装win10时同样需要进大白菜或老毛桃后用DiskGenius在SSD上划分ESP/MSR分区
  • 装ubuntu时, 分区处也要创建EFI分区, 同时grub设置安装在SSD上, 相当于: grub-install /dev/sdX.
  • bios里选择哪块硬盘启动. 其实在SSD上安装grub后, 这个grub会连HDD上原先的win10与ubuntu一起放在启动列表里. 注意, windows非常霸道, 它是总修改bios里的启动顺序, 将它的"Windows boot Manager"放在"ubuntu grub"的前面, 可以在bios里锁定启动顺序
  • 有时候需要对ssd优化, 例如不要将swap分区放在ssd以延长寿命, 如更改i/o调度策略为noop, 如使用bcache

问题

装完之后进入win10发现thinkpad小红点左键失灵, 再切换进ubuntu发现小红点左键正常(实际上, 5次大概有一次有问题, 只是登录界面左键与右键似乎混乱了, 登录之后就正常了. 再换PE进系统发现小红点左键依然有问题. 所以基本断定和硬件没有关系, 应该是win10上的小红点驱动有问题.
但搜索了很多帖子, 没一个能解决问题的, 联想的小红点win10驱动做得太烂了. 所以决定回到win7, 回到win7之后该问题解决. 另外, PE回到win7的过程中不会伤害之前SSD上安装的ubuntu系统, 也不会伤害原HDD里的双系统.

数据迁移

现在在笔记本x220t上装了win10, 也装了ubuntu 18.04, 但是如何将工作机t440p的根分区迁移到x220t的根分区呢? 因为我们已经在x220t上安装了ubuntu 18.04, 这样省去了采用命令划分EFI分区, 以及最后填充EFI分区的步骤. 现在将精力集中在如何快速迁移根分区上.

  • 目的机x220t因为有写操作, 故要以livecd启动, 启动ssh server, 并将根分区加载到/mnt
sudo -i
apt install openssh-server
passwd
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
service ssh restart
fdisk -l
mount /dev/sdb4 /mnt

# backup 3 files
/mnt/boot/grub/grub.cfg
/mnt/etc/hostname
/mnt/etc/fstab
  • 源机t440p只有读操作故不需要以livecd启动. 但如果以livecd启动的话, 未加载根分区所依赖的分区如/bak分区, 此时如果又没挂载/bak分区的话, rsync命令迁移一些指向/bak分区的软链时会报错退出. 人工删除该软链重新运行即可. 且需要注意 rsync命令中的/mnt/后应该有/, 否则会将mnt目录迁移到根分区的mnt目录下.
sudo -i
fdisk -l
mount /dev/sda9 /mnt

# rsync will now copy all files, directories, permissions and owners over to the destination machine. 
# It also skips all files and directories that are not on the root filesystem, like /dev/, /sys/, /proc/. 
# If there are filesystems that are mounted separately on the source machine and your want those copied too, use rsync again on those mountpoints too.
# NOT USE livecd
rsync -xavP --numeric-ids --exclude='/nas' --exclude='/bak' --exclude='/tmp' --exclude='/EFI' --exclude='/media' --exclude='/mnt'  / root@192.168.99.128:/mnt/
# USE livecd, use '/mnt/
rsync -xavP --numeric-ids --exclude='tmp' / root@192.168.99.128:/mnt/
rsync -xavP --numeric-ids --exclude='/nas' --exclude='/bak' --exclude='/tmp' --exclude='/EFI' --exclude='/media' --exclude='/mnt'  /mnt/ root@192.168.99.128:/mnt/

# then restore above 3 files
/mnt/boot/grub/grub.cfg
/mnt/etc/hostname
/mnt/etc/fstab
  • 可选, 如果之前没有备份/mnt/boot/grub/grub.cfg, 这时也可以重新生成. 更新grub, 此时会报"canot find EFI directory", 这样会导致这时生成grub时无法找到原HDD中的双系统, 不要紧, 只要找到目前SSD中的双系统即可. 呆会下一步再运行一下grub命令即可解决
mount /dev/sdb8 /mnts
for d in dev sys proc; do mount --bind /$d /mnt/$d; done
chroot /mnt/ grub-install /dev/sdb   # canot find EFI directory
chroot /mnt/ update-grub
  • 可选, 如果之前没有备份/mnt/etc/fstab, 这时也可以重新生成. 修复fstab, 之前运行上述迁移命令前忘了备份x220t上的fstab系统, 导致它被覆盖, OK, 我们修复它.
blkid
e2label /dev/sdb8 "ROOT_SSD"
tee "/mnt/etc/fstab" <<EOF
#UUID can be found via blkid command
#LABEL=boot /boot ext2 sync 0 2
#UUID=735b3be3-779c-4d21-a944-b033225f3ab4 none   swap    sw      0       0
#LABEL=SWAP none swap sw 0 0
UUID=9401-D2EA /boot/efi vfat defaults 0 2
LABEL=ROOT_SSD / ext4 errors=remount-ro 0 1
EOF
  • 这时重启系统, 就可以以grub选择启动SSD上的双系统了, 如果还想把HDD的原有的双系统也加到grub的话, 那进ubuntu系统后再执行一次update-grub命令即可.
  • 这种迁移方式效果非常好, 一个rsync命令搞定, 各种工作软件不需要再重装了. 呵呵

bcache

sudo apt install bcache-tools
# sdb is ssd, sda is hdd
# bcache will refuse to instantiate if it looks like a filesystem already exists on the device
sudo umount /data
sudo umount /bak
sudo wipefs -a /dev/sdb5
sudo wipefs -a /dev/sda5
# creating the bcache, --discard flag is for TRIM
sudo make-bcache -C /dev/sdb5 -B /dev/sda5 --block 4k --discard --writeback
# creae and mount the filesystem
sudo mkfs.ext4 /dev/bcache0
sudo mkdir -p /bak

# remember to comment /bak and /data as well, or it will throw: Welcome to emergency mode
vi /etc/fstab
#UUID=85d5095b-4288-4cc3-8ac7-aae3ed8e872c /bak            ext4    defaults        0       2
#UUID=e246b3d0-6905-4602-a3ae-2f2162f9871f /data           ext4    defaults        0       2
/dev/bcache0 /bak           ext4    defaults        0       2

# other commands
ls -la /sys/fs/bcache/
umount /bak
echo 1 > /sys/block/bcache0/bcache/stop
echo f3e2ac40-5dc4-4e28-880c-4bbb6cd415e3 /sys/block/bcache0/bcache/detach
lsblk
cat /sys/block/bcache0/bcache/state
cat /sys/block/bcache0/bcache/cache_mode
cat /sys/block/bcache0/bcache/dirty_data
bcache-super-show /dev/sda5
bcache-super-show /dev/sdb5
lsblk

#其他, 测试虚机中ceph盘的性能
The IO path is:
VM -> RBD -> compute node -> network -> OSD(primary + 2 replicas) -> bcache (nvme + hdd)

Stage 1, exclude VM, check IO performance on RBD directly
Create a RBD in cinder-ceph pool and run rbd bench to check IOPS
rbd create cinder-ceph/canonical-test-rbd --size 20G
rbd bench cinder-ceph/canonical-test-rbd --io-size=4K --io-threads=1 --io-total=10G --io-pattern=rand --io-type=write
rbd bench cinder-ceph/canonical-test-rbd --io-size=4K --io-threads=1 --io-total=10G --io-pattern=rand --io-type=read
rbd bench cinder-ceph/canonical-test-rbd --io-size=4M --io-threads=1 --io-total=10G --io-pattern=rand --io-type=write
rbd bench cinder-ceph/canonical-test-rbd --io-size=4M --io-threads=1 --io-total=10G --io-pattern=rand --io-type=read
rbd rm cinder-ceph/canonical-test-rbd

Stage 2, check network between compute node and the nodes which store test RBD’s primary or replicas
This can be done by iperf

Stage 3, IO performance on OSD nodes hold the RBD’s primary and 2 replicas
We can not test IO performance on OSD devices directly, so need to find a way to test bcache performance on OSD node, we can use /var/lib/virt/image as test
We can possibly use this folder /var/lib/virt/images to verify IO performance, but there is ext4 built on this bcache, so file system cache could affect a bit, but we should be able to roughly see the overall performance
dd if=/dev/zero of=/var/lib/virt/images/fiotest-image bs=1M count=10240
fio --name=fiotest --rw=randwrite --bs=4k --runtime=30 --ioengine=libaio --iodepth=128 --numjobs=1 --filename=/var/lib/virt/images/canonical-fiotest-image --direct=1 --sync=1 --group_reporting --time_based=1 --eta-newline 1
fio --name=fiotest --rw=randread --bs=4k --runtime=30 --ioengine=libaio --iodepth=128 --numjobs=1 --filename=/var/lib/virt/images/canonical-fiotest-image --direct=1 --sync=1 --group_reporting --time_based=1 --eta-newline 1
fio --name=fiotest --rw=randwrite --bs=4m --runtime=30 --ioengine=libaio --iodepth=128 --numjobs=1 --filename=/var/lib/virt/images/canonical-fiotest-image --direct=1 --sync=1 --group_reporting --time_based=1 --eta-newline 1
fio --name=fiotest --rw=randread --bs=4m --runtime=30 --ioengine=libaio --iodepth=128 --numjobs=1 --filename=/var/lib/virt/images/canonical-fiotest-image --direct=1 --sync=1 --group_reporting --time_based=1 --eta-newline 1
rm -f /var/lib/virt/images/fiotest-image

两个参数:

  • sequential_cutoff默认为4k, 就是大于4k的就是绕开NVME直接往HDD写, 为0就是disable这个特性。所以这个要设置为0, 不然IO性能会很差。
  • 另外bcache的cache_available_percent(/sys/block/bcache0/bcache/cache/cache_available_percent)来看bacache的ssd/cache是不是被写满了,被写满了IO(没写时是100,降到30就差不多快满了)会直接写backing HDD,这样IO会很慢。
while true; do echo `date`; cat /sys/block/bcache0/bcache/cache/cache_available_percent; cat /sys/block/bcache0/bcache/dirty_data; cat /sys/block/bcache0/bcache/writeback_rate; sleep 5; done;
#!/bin/sh
# comes dongdong's patch - https://lkml.org/lkml/2021/1/8/110
while true; do echo "`date +%s`, `cat
/sys/block/bcache0/bcache/dirty_data`, `cat
/sys/block/bcache0/bcache/cache/cache_available_percent`, `cat
/sys/block/bcache0/bcache/writeback_rate`" >> $1; sleep 5; done;

恢复bak分区

bak分区存放数据, 由bcache加速

rsync -xavP --numeric-ids --exclude='images' /bak/ root@192.168.99.128:/bak/

调整分区

一个分区不够用时, 可以使用gpartd合并相邻的空闲分区.注意一点, 要合并的分区必须是umount状态时才能合并.

SSD优化

# disable scanning for btrfs filesystems when boot
sudo apt-get purge btrfs-tools
sudo update-initramfs -ukall

# enable TRIM feature by adding discard option
# what's TRIM - https://blog.csdn.net/quqi99/article/details/50963308
# the option noatime is used to disable access time for a file
sudo hdparm -I /dev/sdb |grep TRIM
vi /etc/fstab
LABEL=ROOT_SSD /               ext4    noatime,discard,errors=remount-ro 0       1
sudo mount -o remount /dev/sdb8
sudo mount |grep sdb8 |grep discard

# Try not to use swap space unless it's running out of memory.
echo 1 > /proc/sys/vm/swappiness

# avoid visiting ssd by using ramdisk for /tmp instead of tmpfs
vim /etc/fstab
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0
sudo mount -o remount /

# Set chrome to use ramdisk cache
cd ~/.cache/google-chrome/Default
rm -rf Cache 
sudo ln -s /tmp Cache 
rm -rf Media\ Cache/
sudo ln -s /tmp Media\ Cache

# Use noop for I/O elevator
cat /sys/block/sda/queue/scheduler
sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="elevator=noop"
sudo update-grub

# Test SSD speed
$ sudo hdparm -Tt /dev/sdb
/dev/sdb:
 Timing cached reads:   9128 MB in  2.00 seconds = 4569.28 MB/sec
 Timing buffered disk reads: 818 MB in  3.01 seconds = 272.07 MB/sec

# Make sure 4K align
$ sudo fdisk -lu |grep sdb |grep sectors
Disk /dev/sdb: 232.9 GiB, 250059350016 bytes, 488397168 sectors

# Health check
$ sudo smartctl -s on -a /dev/sdb |grep PASSED
SMART overall-health self-assessment test result: PASSED

20200808更新

为什么新电脑think x1 yoga这次又要安装双系统,那是因为win10上的cmder似乎丢失键盘按键, 见:https://github.com/cmderdev/cmder/issues/258
与: https://blog.csdn.net/quqi99/article/details/105598417
需关闭win10上的硬盘加密功能:

manage-bde -status
manage-bde -?
manage-bde -off c:
manage-bde -off d:

另外,用ubuntu上的Startup Disk Creation创建u盘启动盘时总不好使,后来证明是U盘质量问题.
目前ubuntu 20.4还遇到一个尚未解决的问题,锁屏时敲密码hang在那儿,日志似乎是:

Aug  8 18:34:03 x1 gsd-power[2533]: Error setting property 'PowerSaveMode' on interface org.gnome.Mutter.DisplayConfig: Timeout was reached (g-io-error-quark, 24)

20210321更新 - 安装工控机

今天买了一个典籍的工控机,安装win10时遇到如下问题:

  • 正常情况是按F2进BIOS
  • 但使用大白菜通过Ghost安装一个win10之后,无法进入BIOS
  • 在win10中禁用快速启动后仍然无法进入BIOS
  • 原来典籍现在默认的是UEFI而不是BIOS,win10对BIOS和UEFI都做了手脚,对于BIOS是禁用快速启动可按F2进BIOS,但对于win10是启动win10后再按shift不动再点击restart,这样再进入UEFI (也可在启动win10后在setting中搜索UEFI进入)。那问题来了,BIOS是可以设置来电启动的,现在使用UEFI如何设置此功能呢?
  • 如果删除win10之后,就再也没有键进入UEFI了,这时可以使用F11来选择usb或者进入UEFI
  • 从msdn下载的iso不是ghost,可通过UltraISO写入U盘中。密钥可通过skms + slmgr注册. 我们这里使用原版的iso (只是通过大白菜分区了)
  • 但是在安装win10选择分区时,报:windows canot be installed to this disk, the selected disk is of the GPT partiton style, 也许是因为用大白菜分区为GPT的原因吗?
  • 于是进UEFI将改成’UEFI only",但这会造成无法识别启动U盘,只好将"Boot option filter"又改回"UEFI and Legacy",但只是将Storage改为’UEFI only", 但问题依旧。
  • 然后在win10分区的界面按"shift + f10", 输入diskpart, 然后再输入’list disk’, ‘select disk 0’, ‘clean’, 'convert mbr’这样会将之前大白菜建的GPT分区全部删除再转化成MBR分区。
  • 这样就用msdn原版iso安装win10成功了。
  • 区域设置成US,这样microsoft store不会闪退(还不能用的话可以reset, 右键点击开始按钮>运行>输入wsreset回车,等待弹出的黑色窗口消失后自动打开Microsoft Store再进行使用),同时也可以安装Your Phone
  • 重置网络 - netsh int ip reset && netsh winsock reset
  • hyper-v下安装android-x86或Bliss OS(更好), 它不是anroid模拟器,而是基于x86的android

20210322更新 - Surface Pro3如何进入USB启动盘

对于Surface Pro3进入UEFI的方法是,关机,插USB启动盘,按住音量+键再按电源键,看到UEFI界面后松音量键,在UEFI中关闭可信计算,将启动顺序设置成"USB -> SSD",这样再Exit UEFI重启即可进入USB启动盘。但是实测:

  • 大白菜制作的PE + Ghost启动盘可以进入PE (UEFI格式)
  • UltraISO制作的MSDN ISO启动盘无法进入 (MBR格式)
    原因是UltraISO制作的是MBR格式,改为微软官方的MediaCreationTool20H2工具制作usb启动盘就OK了(不需要事先下载镜像,它会通过网络自动下载,速度还可以)。
    要将win10 1909升级到2004的话,直接点击usb启动盘或者ISO中中的setup.exe自动升级,升级要注意一点,之前的安装就应该采用中文版的,现在usb里也得是中文版,这样升级之前个人数据和应用数据才不会丢。否则,语言不同只能将个人数据留下来。
    使用MediaCreationTool20H2是不需要事先下载ISO的,当然如果一定要下载,下面有一个迅雷的链接,是win10 2004版 (包括home, pro等):
ed2k://|file|cn_windows_10_consumer_editions_version_2004_updated_may_2020_x64_dvd_5a83cf4e.iso|5260658688|7B09EFFC08DD0FBF1D8A5558DA8445F5|/
 有时候用PE工具制USB启动盘(当然这种方式是不需要的)使用NTFS模式是为了避免拷贝大于4G的ISO文件,ISO文件如果采用解压再拷贝的话可以解除这个限制,直接使用FAT32格式。

优化win10

1, 关闭安全,搜索"defen"打开windows安全中心,点"病毒与防护->管理设置"关闭所有的安全选项。然后搜索"services.msc"禁用"Security Center"服务。
2, 关闭IPv6, 禁用"IPHelper"服务.
3, 禁用"Windows Search"服务, 因为不会在这台电脑上search太多.
4, 修改电源计划为高性能模式,右击开始按钮,点击“电源选项”→“其他电源选项”,将首选计划修改为”高性能“。且将“性能和能量”项改为“最佳性能”。
5, 禁用Cortana, 搜索"gpedit.msc", 展开“计算机配置—管理模板—Windows 组件—搜索”, 找到“允许使用 Cortana”,右键选择“编辑”, 需重启电脑。
6, 禁用"Windows Update"服务。
7, 禁用OneDrive,搜索"gpedit.msc", 展开“计算机配置—管理模板—OneDrive"下列的一系列项。
8, 但那样设置之后,发生有一个叫Antimalware的服务占用CPU与内存都非常高,注册表中禁用:计算机管理->管理模板->Windows组件 >Windows Defender防病毒->实时保护->不论何时启用实时保护,都会启用进程扫描。 这样仍不生效,继续禁用:计算机管理->管理模板->Windows组件 >Windows Defender防病毒->关闭Microsoft Defender防病毒|关闭例程更新。同时msconfig禁用与安全相关的服务以非microsoft的服务。但还是不行,最后以管理员运行powershell然后运行(REG ADD "hklm\software\policies\microsoft\windows defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f)解决,它相当于在regedit下在HKEY_LOCAL_MACHINE/SOFTWARE/Policies/Microsoft/Windows Defender路径下添加了名为DisableAntiSpyware的DWORD32=1
9, win10设置系统默认编码为UTF-8

10, 打开Hyper-v, NFS, 虚拟机平台, 适用于Linux的Windows子系统,容器,Telent客户端,TFTP客户端等7个特性,在设置的程序里添加这些特性即可。
11, win10打开远程桌面, Ubuntu上使用Remmina连接RDP桌面。

配置Hyper-v

1, 新建虚拟交换机WAN(外部,连接第一块网卡, 为避免失去RDP连接应勾选允许管理操作系统共享此网络配置器)
2, 新建虚拟交换机LAN(内部,连接第二块网卡, 为避免失去RDP连接应勾选允许管理操作系统共享此网络配置器), 此时,win10的网络连接中,会多出三个虚拟网卡:vEthernet (Default Switch),vEthernet (WAN)和vEthernet (LAN)。
3, img格式转成vhdx格式(注:gz需先解压)

gunzip -d openwrt-gdq-v8-1[2021]-x86-64-generic-squashfs-uefi.img.gz
qemu-img convert openwrt-gdq-v8-1[2021]-x86-64-generic-squashfs-uefi.img -O vhdx -o subformat=dynamic router2021v8UEFI.vhdx

3, 新建虚机eSirLEDE, 第二代(下载的是EFI固件),1024M内存,使用existing eSirLEDE.vhd, 注:此时暂时不选择网络
4, 设置网络,先添加WAN再添加LAN, 顺序很重要,这样,WAN名为eth0,LAN名为eth1
5, 设置虚机,在安全性tab中取消“启用安全启动”(默认就是取消的),并设置始终自动启动此虚拟机。
6, 启动虚机后,编辑(vi etc/config/network)调整wan/lan与eth0/eth1的关系(将lan处的网络改成eth1, wan处的网卡改成eth0),修改lan的IP为:192.168.99.1, 然后用passwd root设置密码。
7, 敲入reboot重启虚机后,虚机里面的br-lan的IP将为192.168.99.1(它连的是eth1). 将电脑连向这第二块网卡(eth0)设置一个IP之后就可以进GUI界面去设置了

20210323更新 - 存储的安装

我们并不想使用黑群晖,只是想简单的将USB存储挂进win10或者OpenWrt虚机里然后通过rsync同步。
1, 若将USB存储挂载到虚机,需要先在win10下将该盘脱机。然后hyper-v里添加SCSI控制器就可以添加这块脱机的硬盘了

diskpart
list disk
select disk 1
offline disk
#list partition
#select partiion X
#active

但是将磁盘设置为offline之后,用下列命令active时却报:ACTIVE命令只能用于固定MBR磁盘

list partition
select partiion X
active

但在设置的磁盘管理处在磁盘(而非右侧的分区)点右键点”联机“就回来了。
2, 前提是win10能认出这个USB存储,由于之前移动硬盘用Ext4分区了,现在win10并不能挂载它。经过试用,唯一靠谱的是一个收费软件,叫Paragon ExtFS,见: https://www.jianshu.com/p/c9aeed724fb3
3, 虚机添加了硬盘之后,若硬盘消失,虚机会启动失败。
4, win10上能成功运行的nfs server开源软件只有haneWIN,但它和Paragon ExtFS不能结合,必须得将硬盘从Ext4转回NTFS。
5, 但通过虚机用硬盘提供nfs后,在其他机器通过(sudo mount -t nfs 192.168.99.1:/mnt/sdb1 /mnt/win/sdb1)时报错"mount(2) system call failed: No error information"。

mount(2) system call failed: No error information.
fsck.ext4 -y /dev/sdb2

之后如果在http://192.168.99.1/cgi-bin/luci/admin/nas/nfs页只mount /mnt会报下列错,应该mount /mnt/sdb1

mount.nfs: access denied by server while mounting 192.168.99.1:/mnt/sdb1

且在使用rsync时对中文处理不友好(deleting doc/me/xxx/#344#273#262#350#243#201/), 网上说可以通过“rsync -avzPu --iconv=“GBK,UTF-8” --size-only”解决。

/usr/bin/rsync -avztur --progress --delete --exclude 'windisk' /mnt/nas /mnt/sdb1
/usr/bin/rsync -avztur --progress --delete --exclude 'windisk' admin@192.168.2.103:/share/HDA_DATA/Public/ /mnt/sdb1

6, 另外,通过虚机使用USB硬盘,在USB抽拨之后,openwrt中原sda变成sdb了,导致usb原来的sdb无法加载。所以似乎在虚机里使用容易插拨的USB存储并不是一个好的选择。

附 - win10上使用haneWIN
20210829更新:haneWIN速度只在太慢了(只有1M每秒),现在换成使用windows共享文件夹也就是samba的模式(速度大概在15M每秒 )

# 在win10中在“电脑->管理->用户”创建一个名为nfs的本地用户,然后在要创建共享文件夹的目录上点击右键创建共享文件夹
# use share file instead of hanewin, hanewin is too slow  ( fuser -k /mnt/win_share/ && umount /mnt/win_share )
# sudo mount -t cifs -o username=nfs,password=password //win/win_share /mnt/tmp/
#/mnt/win_share    -fstype=cifs,rw,username=nfs,password=password,vers=1.0,file_mode=0777,dir_mode=0777 ://win/win_share
/mnt/win_share    -fstype=cifs,rw,username=nfs,password=password,file_mode=0777,dir_mode=0777 ://win/win_share
/mnt/win_bak    -fstype=cifs,rw,username=nfs,password=password,file_mode=0777,dir_mode=0777 ://win/win_bak

下面是 win10使用haneWIN的方法:
现在改用在win10上通过Paragon ExtFS + haneWIN (NFS Server)来提供共享存储(ubuntu要想访问需设置utf编码):
下载(https://r.hanewin.net/nfs1258.exe)安装后需以管理员打开(否则,配置项全是灰的)在设置一个exports (D:\ -alldirs -name:win_bak -public), 然后restart它即可, 它默认使用的就是utf-8编码。
ubuntu上用nfs client连接它:

D:\ -alldirs -name:win_bak -public -maproot:0
G:\ -alldirs -name:win_share -public -maproot:0
showmount -e 192.168.2.164
sudo mount -t nfs win:/win_bak  /mnt/win_bak -o vers=3 -o nolock
sudo mount -t nfs win:/win_share  /mnt/win_share -o vers=3 -o nolock

在"高级安全Windows Defender防火墙打开了111,1058,2049三个端口,但仍然报错“mount.nfs: access denied by server while mounting”。原因是它不能从Paragon ExtFS读取EXT4的文件,必须得将硬盘格式切换回NTFS啊。

NTFS盘挂载到ubuntu下遇到read-only问题:

sudo e2fsck /dev/sdd 
sudo hdparm -r0 /dev/sdd  #close write-protected
sudo ntfsfix /dev/sdd1
sudo mount -o rw /dev/sdd1 /media/hua/win/
sudo mount -o remount,rw /dev/sdd1 /media/hua/win/

在http://192.168.99.1/cgi-bin/luci/admin/nas/nfs使用nfs client挂载时报missing错误是因为输入框里没有填东西(只是提示误以为是默认值)。挂载了3个目录:

192.168.2.164:/win_bak/* -> /mnt/win_bak
192.168.2.164:/win_share/* -> /mnt/win_share
192.168.2.103:/Public -> /mnt/nas

或将上面的全删除就能启动了,然后再编辑:

root@OpenWrt:~# cat /etc/config/nfs 

config mount
	option enabled '1'
	option target '/mnt/win_bak'
	option options 'rw,nolock'
	option source 'win:/win_bak'
	option delay '1'

config mount
	option enabled '1'
	option target '/mnt/win_share'
	option options 'rw.nolock'
	option source 'win:/win_share'
	option delay '3'

config mount
	option enabled '1'
	option options 'rw,nolock'
	option delay '5'
	option source 'nas:/Public'
	option target '/nas'

  1. 数据统一从nas进,在路由器上将nas往win_bak里通过rsync同步 ( rsync -avztur --progress --delete --exclude ‘.Trash-1000’ /mnt/nas/ /mnt/win_bak , 可以先不带–delete测试)
  2. win_share在所有机器中共享,方便同步数据

但此时又报下列错, 解决这个问题的关键是在haneWIN中添加’-maproot:0’参数

root@OpenWrt:~# mkdir /mnt/win_bak/tmp
mkdir: can't create directory '/mnt/win_bak/tmp': Permission denied

同时安装openssh, 在"setting -> application -> optional function"安装openssh server即可.
ssh安装好之后,可以使用基于ssh的tftp了,在"电脑->管理->用户"中创建一个本地用户,之后如何将用户权限只限定在某个目录呢?答案是编辑隐藏文件(在view菜单中显示隐藏文件)(C:\ProgramData\ssh\sshd_config),同时要编辑这个文件先在这个文件的属性中将权限改成可编辑,然后添加:

Subsystem	sftp	sftp-server.exe	internal-sftp
...
Match User ftpuser
    ChrootDirectory G:\www\sftp
    # Disable tunneling, authentication agent, TCP and X11 forwarding.
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no
    PermitTTY no
    PermitTunnel no
    ForceCommand internal-sftp

最后,在服务中重启openssh即可,然后就可以通过tftp命令或者winscp来拷贝文件了.若要在外网访问的话记得添加端口映射.
注意:我之前一直失败,原因是将G\www\sftp写错成了G:\www\tftp,非常难查.

20210323更新 - 裸机安装

还有一个大问题是,在虚机里运行OpenWrt时,其他机器连接时经常会从br-lan的dhcp拿不到IP,而人工设置了网络又没问题。这块不是很稳定。

  1. 将OpenWRT直接安装裸机的方法,即需要将img的raw格式写到SSD(DiskImage GUI或physdiskwrite CLI - physdiskwrite -u xx.img均能写盘),将DiskImage和img拷到PE盘上,启动PE后直接打开DiskImage选择img写到SSD即可。我们使用physdiskwrite,写前用PE先将SSD的分区都删了,记住不要新建分区,直接cmd去raw镜像目录运行‘physdiskwrite -u xx.img’, 选0分区(即ssd分区),再按y写镜像即可。注意:如果bios(对于zero工控机是按Delete键进bios)里如果设置的是UEFI only即必须使用UEFI镜像,否则系统会反复重启。装完之后,进系统设置/etc/config/network即可(参考下面的)。
  2. 然后就是设置/etc/config/network了,如果有多个网卡可以都放到br-lan里
config interface 'lan'
	option type 'bridge'
	option proto 'static'
	option netmask '255.255.255.0'
	option _orig_ifname 'eth0'
	option _orig_bridge 'true'
	option ifname 'eth0 eth1 eth2 eth3 eth4'
	option ipaddr '192.168.99.1'
	option ip6assign '64'
config interface 'wan'
	option proto 'dhcp'
	option _orig_ifname 'eth1'
	option _orig_bridge 'false'
	option ifname 'eth5'

第一级路由器(192.168.2.0/24)到第二级路由器(192.168.99.0/24):

# cat /etc/rc.local 
route add -net 192.168.99.0 netmask 255.255.255.0 gw 192.168.2.47
exit 0

ssh设置:

mkdir ~/.ssh
dropbearkey -t rsa -f ~/.ssh/id_rsa
dropbearkey -y -f ~/.ssh/id_rsa |sed -n 2p > ~/.ssh/id_rsa.pub
# https://community.onion.io/topic/2538/resolved-ssh-from-omega-to-linux-server-without-password/9
ln -s ~/.ssh/id_rsa ~/.ssh/id_dropbear
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys && chmod 644 ~/.ssh/authorized_keys
ssh admin@192.168.2.103 "tee -a /root/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
#/usr/bin/rsync -avztur --progress --delete --exclude 'windisk' admin@192.168.2.103:/share/HDA_DATA/Public/ /mnt/sdb1

20210716 Update - sshfs + autofs + sshpass

cat << EOF | sudo tee /bak/bin/sshpass.sh
#!/bin/bash
sshpass -f /home/hua/.pwd ssh $*
EOF
chmod +x /bak/bin/sshpass.sh
#sshfs -o password_stdin hua@win:G:\share /mnt/win <<< 'your pass'
sshfs -o reconnect,allow_other,follow_symlinks,ssh_command='/bak/bin/sshpass.sh' hua@win:G:\share /mnt/win

#autofs
/mnt/win -fstype=fuse,port=22,reconnect,allow_other,follow_symlinks,ssh_command=/bak/bin/sshpass.sh :sshfs\#hua@win\:G:\share

#/etc/fstab
sshfs#hua@win:G:\share /mnt/win fuse ssh_command=/bak/bin/sshpass.sh 0 0
sudm mount -a

MaxTang J6412安装win11

入手了一个MaxTang J6412,安装win11的过程如下:

大唐nuc, 拆机安装内存(单根只能安装在最上面那槽否则开机时显示器不亮)和m.2 2280 ssd, 还支持一个2.5的sata硬盘(剩下的白铁条和插槽及线都是为它的).
0, 安装win11(Del键进BIOS), 填序列号,并激活
1, win11上打开远程桌面,然后在ubuntu上通过remmina来连接 (也可以使用rdesktop, 如: sudo rdesktop -z -r sound:local -g workarea -D -K -a 16 -u hua -p xxx 192.168.99.207). 但是有一个问题,即win11中一个用户仅支持一个session, 即使修改'gpedit.msc>计算机配置>管理模板>Windows组件>远程桌面服务>远程桌面会话主机>连接'也是没用的。 见: https://blog.csdn.net/weixin_45493092/article/details/123744524 , 及: https://www.technize.net/how-to-easily-enable-multiple-rdp-remote-desktop-sessions-in-windows-11/

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy
#then run the script https://github.com/maxbakhub/winposh/blob/main/termsrv_rdp_patch.ps1
#The current logged on user does not have ownership privileges on c:\windows\system32\termsrv.dll
#use powershell to run the script again:
net user administrator /active:yes
net user administrator xxxx

“c:\windows\system32\termsrv.dll” now owned by user “nuc\Administrator”

so we must to run this script in security mode (在锁屏界面一直一直按住shift键来重启进入安全模式, 或从setting -> Windows Update -> Advance -> Restore -> 高级启动(但这条路径并不存在))


另外,还有一个问题,通过HDMI与鸿蒙电视连接时,电脑不能设置休眠显示器,否则电视会说HDMI无信号. 或者将应用快速启动取消: https://answers.microsoft.com/zh-hans/windows/forum/all/windows10/6786f5b9-0456-4c4d-8263-1823383dcd24
2, 启用Hypev-v, NFS, Telnet Client, 容器,适用于Linux的Windows子系统,虚拟机平台等功能
3, 安装vim, git里集成了vim所以安装git即可, 然后将C:\Program files\Git\usr\bin加入环境变量即可. 这样可使用git下的vim/cat/scp等一系列命令.
4, win11上安装openssh-server (设置 -> 应用 -> 可选功能 -> 添加可选功能), 然后在services中启动它,最后ubuntu上连接它:ssh hua@xxx
    它是 可结合wsl命令和git中的vim/cat这些命令来方便操作的(注:要想ssh过来也能用vim也必须将C:\Program files\Git\usr\bin加入hua这个环境变量中)
  win11上也可以产生key(ssh-keygen, cat C:\Users\hua/.ssh/id_rsa.pub), 可在win11上用vim C:\Users\hua\.ssh\known_hosts将ubuntu的key加进去
5, 先安装ubuntu子系统方便使用wsl命令(https://learn.microsoft.com/zh-cn/windows/wsl/install-manual),先设置(wsl --set-default-version 2), 然后安装更新包(https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi), 最后appstore中安装ubuntu或者命令行安装(wsl --install -d Ubuntu-22.04)
6, 安装android子系统。在‘设置->时间和语言’将国家和地区改成美国, 不需要重启,这时才能在微软商店中搜到'Amazon Appstore'来安装bare, 但此时可能因为特殊国情打不开微软商店, 因为微软商店属于UWP应用运行在沙箱中,需要做如下设置允许UWP使用(具体方法可参考: https://oreo.moe/blog/%E8%BD%AF%E4%BB%B6/%E8%BF%90%E8%A1%8C%E9%94%99%E8%AF%AF/Microsoft%20Store%20%E8%AE%BF%E9%97%AE%E5%8A%A0%E9%80%9F%E6%95%99%E7%A8%8B@HoganTR/ )
CheckNetIsolation.exe loopbackexempt -a -p=SID (SID从HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings下一个个找)
     目前只能从amazon appstore里安装android应用,若想安装任意应用,搜索'andorid'打开'适用于Android的Windows子系统设置'启用'开发人员模式'与'高级网络'后,然后从ubuntu上通过adb连接它(adb connect 192.168.99.207:58526),然后可用adb install xx.apk来安装任意应用
7, 新建hypver-v虚机安装openwrt - https://blog.csdn.net/quqi99/article/details/82466639
8, 安装驱动总裁(它不限速)来安装wifi6无线网卡驱动. 但是这个wifi6网卡如何给openwrt来用呢?passthough必须是windows server才支持(https://blog.vlinyu.com/archives/windows-hyper-v-discrete-device-assignment-dda). 打开热点后会生成一个本地连接(eg: 本地连接10, 可搜索网络连接来查看本来连接), 假设以太网2是能上网的网卡,然后得在以太网2上点右键设置共享给本地连接10, 这样连热点的才能上网。
9, 远程wol唤醒,这款nuc的bios里并不需要做设置,但win11中需要在网卡适配器处将wol功能打开,另外在路由器上只能使用etherwake命令而不是wol命令来唤醒(之间一直不work, 是因为使用了wol命令)
10, 断开自动开机, 在bios->chipset -pci -> State After G3由S5 state(上电关机)改成(S0 state(上电自启)

关于一个帐号不能有多个session的问题,我试了下面在安全模式下通过脚本termsrv_rdp_patch.ps1修改termsrv.dll的方法,修改成功了,但测试功能时还是失败了。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy
#then run the script https://github.com/maxbakhub/winposh/blob/main/termsrv_rdp_patch.ps1
#The current logged on user does not have ownership privileges on c:\windows\system32\termsrv.dll
#use powershell to run the script again:
net user administrator /active:yes
net user administrator xxxx
#"c:\windows\system32\termsrv.dll" now owned by user "nuc\Administrator"
#so we must to run this script in security mode (在锁屏界面一直一直按住shift键来重启进入安全模式后直接找到这个脚本后右键点击在powershell中运行, 或从setting -> Windows Update -> Advance -> Restore -> 高级启动(但这条路径并不存在))

20230208 - 测试openwrt on wsl2 并配置wsl2使用bridge来固定IP

1, 在hyper-v中创建两个external vSwitch(WAN, LAN)分别与两个物理NIC关联 (此时,如果还用wifi热点的话,需要修改WAN网卡适配器的属性将其共享给wifi热点所在的本地网卡)

2, 新建~/.wslconfig文件设置其使用WAN这个vSwitch来代替之前默认的WSL vSwitch

hua@NUC C:\Users\hua>cat ~/.wslconfig
[wsl2]
networkingMode=bridged
vmSwitch=WAN

3, 网上一般说的上面就结束了,但上面的步骤并不work,后来发现了这个网页提到了(https://blog.gazer.win/essay/wsl2-bridged-network.html)并且'wsl -d Ubuntu22.04'在wsl容器内部配置/etc/wsl.conf
   NOTE: 现在似乎不要/etc/wsl.conf也行,不清楚之前是什么原因一直不work

vim /etc/wsl.conf
[network]
generateHosts=true
generateResolvConf=true

4, 然后回到powershell或window-termimal重启wsl (wsl --shutdown ; wsl), 此时wsl容器的IP才变成和物理网络同网段的192.168.99.0/24的IP

5, wsl2如何支持多网卡呢?答案是不支持,见: https://github.com/microsoft/WSL/issues/9113

6, openwrt也可以运行在wsl容器中,但有两个问题1)不支持多网卡 2)openwrt的init被wsl接管导致访问 GUI时看到很多rpc不work, 但可以用opkg安装包,确实只能做测试用,见: https://zhuanlan.zhihu.com/p/499799037

20230208 - 如何将wifi6无线网卡共享给hypver-v虚机使用

虚拟机无法直接使用host的无线网卡,因为虚拟机没有无线模块. 试了一下这样曲线救图(也可直接在hyper-v中创始external bridge时将无线网关接入,但也在虚机内部也不会呈现无线网卡):

a, 在hyper-v中创建一个名为vWireless的internal vSwitch,这样在host上多了一个vWireless的网卡适配器
b, 将vWireless与wifi6网卡适配器同时选中点右键再点桥接, 这样又多出一个桥接的网卡适配器
c, 虚机里添加一块从vWireless vSwitch的网卡

这样没成功,虚机里多出的eth2网卡没有IP。即使有IP它在虚机内部也不是无线网卡啊. 所以似乎基于虚机的soft router里无法使用wifi, 想要有wifi只能是将win11作路由器(做热点+网络共享给热点网卡或者直接将openwrt安装在硬件上(但需确实openwrt有无线网卡的驱动)

使用chfs作文件共享

cd /tmp & wget http://iscute.cn/tar/chfs/2.0/chfs-linux-arm-2.0.zip
unzip -o chfs-linux-arm-2.0.zip -d /usr/local/bin
chmod 777 /usr/local/bin/chfs
/bin/sh -c 'chfs --path="/mnt/sda4/chfs" --log="/var/log/chfs.log" --port=8080 --rule=":::share:r|admin:pass:rwd:hua_dir:rw|ying:pass::ying_dir:rw|upload:pass::upload:rw"'
cat << EOF |tee /etc/systemd/system/chfs.service
[Unit]
Description=chfs
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
Environment=password=passw0rd
ExecStart=/bin/sh -c 'chfs --path="/mnt/sda4/chfs" --log="/var/log/chfs.log" --port=8080 --rule=":::share:r|admin:pass:rwd:hua_dir:rw|ying:pass::ying_dir:rw|upload:pass::upload:rw"'
Restart=always
[Install]
WantedBy=multi-user.target
EOF
#Windows client supports raidrive webdev client - http://192.168.99.194:8080/webdav

20230822 - x220t安装win11

x220t不支持tpm不能安装win11,要想安装win11的话,可以在 Windows 11 安装界面按 Shift + F10 打开命令行界面,执行如下命令:

REG ADD HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1
REG ADD HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1

20240916 - win11中的android子系统 & bluestacks & 红手指模拟器

1, 安装hyper-v, 进入设置 → 系统 → 可选功能 → 更多 Windows 功能,找到并勾选开启Hyper-v虚拟机平台
2, 安装微软商店,中国没开放这个权限需将电脑设置为美国(设置 -> 时间与语言 -> 区域), 然后在应用商店里搜索'Windows Subsystem for Android', 或直接打开这个链接即可 - https://apps.microsoft.com/detail/9p3395vx91nr?hl=en-us&gl=US , 可能和这几个域名有关(logincdn.maauth.net login.live.com acocount.live.com acctcdn.msauth.net login.microsoftonline.com c.s-microsoft.com store-images.s-microsoft.com), 和UWP有关见(https://blog.csdn.net/CSDNITK/article/details/125772077), 这也麻烦了直接在gw上换一个即可。
3, 但是starting march 6, 2024, amazon appstore will no longer be availabe for download from Microsoft store on win11, 那在微软商店里搜WSA安装了一个非官方的版本
4, 测试了bluestacks,也需要开启虚拟机功能(不需要hyper-v), 相比腾讯手游助手它更慢些。
5,  试了无影云上安装bluestacks和腾讯手游助手失败,因为无影云不支持二次虚拟化
6, 最后发现红手指中文版(https://www.gc.com.cn/)里带的模拟器速度非常快,可以直接运行在surface pro3上, 然后安装abc reading (https://abctime.com/download/)

20240921 - 无影云上尝试黑神话

必须满足两大条件使用才能使用黑神话:1)用特定的image才不会报这个错(A D3D11-compatible GPU (Feature Level 11.0, Shader Model 5.0) s required to runthe engine) 2) 用windows客户端才有电竞模式的启动项 - https://www.aliyun.com/activity/wuying/dj?userCode=cb3vgkf5 ,但在玩黑神话的过程中鼠标总找不着,不清楚什么原因我之前也没怎么玩过游戏

20241010 - 压缩软件

peazip - 替代winrar的免费解压软件

20241025 - 删除360

我平时基本不用windows,更不会用360或者杀毒软件之类的,但媳妇的办公机用了,我也就安装了一个360做实验帮她解决问题。结果倒好,这个360真是流氓软件,安装了删除不了。控制面板时删除时,说进程没杀,杀进程时杀了没反应。重启机器后,控制面板可以打开卸载程序了,但卸载之后它还有。最后在360里的设置里一个个将所有的设置全部设置关闭,然后再删除,就OK了。

20241025 - 爱普生L3251打印机

之前通过lpadmin创建了myprinter这个打印机,怎么忽然不能用了,查了半天原因是不在同一个子网造成的,另外,安装装可以只需要安装cups就可以了。

sudo apt install cups printer-driver-escpr printer-driver-gutenprint -y                                                                                   
sudo journalctl -f -u cups                                                                                                                                
sudo lpadmin -x myprinter                                                                                                                                 
#如果它不work,是因为不在同一网段造成的, 在t440p上开wifi即可。                                                                                            
sudo lpadmin -p myprinter -E -v ipp://192.168.3.14/ipp/print -m everywhere  #not work now, don't know why. use windows first

爱普生L3251的其他一些tips. 打印不清楚时要无屏普通清洗打印机(按最右边的倒三角键3到5秒直到灯闪松开,然后要持续几分钟清洗,洗完了灯为常亮)
清洗完成后可验证(关机,同时按倒三角和开机键直到灯开始闪后松开会自动打印校验纸), 打印喷嘴检查,按一下关机后,同时按倒三角和关机键,灯亮后松开,会打印喷嘴页,这次是彩色嘴堵住(20240501)>或在win10上的驱动来做清洗: 打印管理 -> 找到我的打印机点属性 -> 首选项 -> 维护 -> 深度清洗

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐