momo zone

调核人的blog

Monthly Archives: 六月 2014

透过usb-sata转接器读取 S.M.A.R.T信息问题

搞了一个SATA转USB3.0,发现无法使用smartctl读取S.M.A.R.T信息
这里的问题是这类转换器准确的叫法是”SATA to USB mass storage bridge” ,接在上面的硬盘被称作”USB mass storage”,也就是说和U盘一样了,它是无法读取ATA/SATA SMART信息的。但一些厂家的bridge芯片动了些脑筋,制定了一些私有协议,smartmontool按照该私有协议封装SMART请求。然后bridge去解封再转换成ATA/SATA请求发给硬盘,这样就解决了这个问题。

google了一下发觉用smartctl -d sat -a /dev/sdx就ok。-d用来指示上述的私有协议类型。
这里sat指的是scsi to ata translation:

What is SAT?
SAT (SCSI->ATA Translation) is a mechanism whereby ATA task register commands may be sent
to a device which is seen by the operating system as a SCSI device. This is most often the case
when SATA drives are connected to an add-in PCI bus type of SATA controller card. Even though
the card is a SATA controller in most cases Windows will see the controller as if it were a SCSI
HBA, and so will not allow you to issue ATA task register level commands to the connected
devices.
Documentation on SAT can be found at the T10.org site http://www.t10.org/drafts.htm#sat3
In short, SAT uses a 12 or 16 byte SCSI cdb which contains an embedded ATA task register
command.

桥接芯片是JMS567,vid:pid 为152d:0567,给/usr/share/smartmontools/drivedb.h增加如下内容就可以直接使用smartctl了:
{ “USB: ; JMicron JMS567”, // USB->SATA(SATL)
“0x152d:0x0567”,
“”, // 0x0100
“”,
“-d sat”
},

Advertisements

多线程程序中利用管道控制 select 行为

转自CU论坛

#include
#include
#include
#include

int fdctl[2];// 这个管道在建立线程之前建立。创建线程之后,两个线程各连接其中一端。因为不存在 fork 导致的 fd 复制,所以不需要像普通多进程环境一样 close 一端

// 控制线程,使用 fdctl[0]
void *thfun( void *arg )
{
int i;
for ( i = 0; i < 3; ++i )
{
printf( "%d sec\n", i );
sleep( 1 );
}

close( fdctl[0] );// 当一个 fd 被关闭的时候,会触发 readable / writable 事件。fdctl[0]是管道读取的一端
}

// 主线程 select 阻塞
int main()
{
fd_set rdset;
int maxfd = 2;
pipe( fdctl );
maxfd = fdctl[1];
FD_ZERO( &rdset );
FD_SET( STDIN_FILENO, &rdset ); // 需要被监测的 fd,通常为 socket。这里用 stdin 代替
FD_SET( fdctl[1], &rdset ); // 控制管道。虽然 close 管道一端会同时引发 readable / writable 事件,但是由于 pipe 有缓冲,默认情况下 pipe 就是 writable 的,所以使用 rdset 进行监测

pthread_t tid;
pthread_create( &tid, NULL, thfun, NULL );

int res = select( maxfd + 1, &rdset, NULL, NULL, NULL ); // 同时监测 socket 和控制管道。writable set 也可以同时监测其它 fd
printf( "select() returned with %d\n", res );
if ( res == 1 ) {
if ( FD_ISSET( fdctl[1], &rdset ) ) // 是否控制管道产生的事件?
printf( "Ctrled Exit\n" ); // 如果是,则是由于控制线程触发。select 阻塞被成功打断
else
deal_with_fd(); // 不是控制管道的信息;处理来自 socket 的信息
}
return 0;
}

使用dism维护windows7,8

使用DISM命令修复系统

注意:DISM命令只会修复系统自带的文件,第三方软件、驱动问题使用此命令修复是无效的,修复过程是比较漫长的,但是修复期间不会影响你系统正常使用、也不会卡什么的,占用资源比较低。

一、检查映像是否可修复

1.扫描映像来检查损坏。在管理员命令提示符下键入以下命令:

Dism /Online /Cleanup-Image /ScanHealth  [直接复制,手打的话请注意命令中的空格]

这条命令将扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一致情况,扫描完成后会有提示,扫描完成后的结果:

************************************************************************************************

PS C:\windows\system32> Dism /Online /Cleanup-Image /ScanHealth

部署映像服务和管理工具

版本: 6.3.9600.16384

映像版本: 6.3.9600.16384

[==========================100.0%==========================]
可以修复组件存储。
操作成功完成。

**************************************************************************************************

2.检查映像以查看是否有检测到损坏。在管理员命令提示符下键入:

                                   Dism /Online /Cleanup-Image /CheckHealth   [直接复制,手打的话请注意命令中的空格]

注意:这条命令必须在前一条命令执行完以后发现系统文件有损坏时使用

当使用 /CheckHealth 参数时,DISM 工具将报告映像是状态良好、可以修复、还是不可修复。如果映像不可修复,必须放弃该映像,并重新开始。如果映像可以修复,可以使用 /RestoreHealth 参数来修复映像。

比如博主测试 /CheckHealth命令的结果如下:

****************************************************************************************************

PS C:\windows\system32> Dism /Online /Cleanup-Image /CheckHealth

部署映像服务和管理工具
版本: 6.3.9600.16384

映像版本: 6.3.9600.16384

可以修复组件存储。
操作成功完成。

*****************************************************************************************************

二、修复映像

若扫描出系统中的不一致情况,检测到系统中存在损坏的文件,并报告映像是状态良好、可以修复等,就可以用 /RestoreHealth 参数进行修复。

1.若要修复映像,在管理员命令提示符下键入:

                            DISM /Online /Cleanup-image /RestoreHealth

这条命令是把那些不同的系统文件还原成官方系统源文件,其他的第三方软件和用户设置完全保留,比重装好多了。而且在扫描与修复的时候系统未损坏部分正常运行,电脑可以照常工作。

联网无法修复的多尝试几次,使用挂载本地文件较为繁琐

如果无法修复请多尝试几次或者挂着VPN试试,一般多尝试几次都能搞定。因为第二种比较繁琐

2.或者,若要使用你自己的一些来源,不使用 Windows 更新来修复一个联机映像,则键入:

    Dism /Online /Cleanup-Image /RestoreHealth /Source:c:\test\mount\windows /LimitAccess

前面的命令需要在连网的情况下执行,因为会自动连接服务器就行下载源文件,第二种用的是系统镜像进行修复,无需联网。

三、 分析组件存储并清理

C:\Windows\system32>Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

部署映像服务和管理工具
版本: 6.3.9600.17031

映像版本: 6.3.9600.17031

[===========================99.8%========================= ]

组件存储(WinSxS)信息:

Windows 资源管理器报告的组件存储大小 : 6.90 GB

组件存储的实际大小 : 6.73 GB

已与 Windows 共享 : 5.12 GB
备份和已禁用的功能 : 1.12 GB
缓存和临时数据 : 503.47 MB

上次清理的日期 : 2014-12-12 05:59:03

可回收的程序包数 : 1
推荐使用组件存储清理 : 是

操作成功完成。

执行组件 清理:

C:\Windows\system32>Dism.exe /online /Cleanup-Image /StartComponentCleanup

部署映像服务和管理工具
版本: 6.3.9600.17031

映像版本: 6.3.9600.17031

[==========================100.0%==========================]
操作成功完成。

四、重置系统镜像

C:\Windows\system32>Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

部署映像服务和管理工具
版本: 6.3.9600.17031

映像版本: 6.3.9600.17031

[==========================100.0%==========================]

如果 出现错误就:

[=============              23.8%                          ]
错误: 1726

远程过程调用失败。

可以在 C:\Windows\Logs\DISM\dism.log 上找到 DISM 日志文件

再执行一次组件清除:

Dism.exe /online /Cleanup-Image /StartComponentCleanup

并把windows search服务停掉

X window 30周年

The X.Org Foundation is proud to announce a special birthday: 30 years ago, on 19 June 1984, Bob Scheifler announced the X Window System.

https://en.wikipedia.org/wiki/X11#Introduction

Over these 30 years, X has come to be the base for Unix desktops everywhere. With desktop environments such as GNOME, KDE, XFCE, Unity, Enlightenment, millions of users are using X as the underlying technology today.

The X developers have pushed the boundaries and moved X from a system originally written to run on the CPU of a VAX VS100 to one that runs the GUI on today’s laptops with 3D rendering capabilities. Indeed, X predates the concept of a Graphics Processing Unit (GPU) as we currently know it, and even the company that popularized this term in 1999, Nvidia.

X continues to see improvements and despite its long service record, it will stay with us for a while longer.

And in case you’re wondering, X predates:
* Linux, FreeBSD, NetBSD, OpenBSD, Solaris, Microsoft Windows
* POSIX, C89, C99, C++, Java
* the World Wide Web
* the GPL and the FSF

X was one of the first major open source software projects, years before the terms Free Software and Open Source Software were commonplace. Celebrate with us, for without X, the desktop would not be what it is today.

– The X.Org Board of Director
s720px-X-Window-System

解决linux下百度网盘资源下载慢

最新发现使用wget和axel 不能下载百度网盘的资源了,或者就是前几秒有速度,但很快就降为0,但用浏览器正常。我想差别就在于http请求头了,我在wget 增加agent和referer参数后就ok了:

wget -U "Mozilla/5.0  AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36" --referer="http://pan.baidu.com/share/link?shareid=3046341&uk=2016435"

agent必须是有效的,baidu会进行一些正则匹配。referer只要是http://pan.baidu.com/share/link? 好像都可以

如果要进行多线程下载就要用axel了,同样也要增加参数:

axel -a -U "Mozilla/5.0  AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36" -n5 "http://nj.baidupcs.com/file/55abd3c198?fid=6397616-28-28010738&time=1403030&fn=abc.zip"  -H Referer:"http://pan.baidu.com/share/link?shareid=3046341&uk=2016435"