On Wed, Oct 12, 2011 at 10:14 PM, Eric Blake wrote: > tag 9734 notabug > thanks > > > On 10/12/2011 02:22 AM, Clark J. Wang wrote: > >> I'm not sure if it's a bug but it's not reasonable to me. On Solaris 11 >> (SunOS 5.11 snv_174, i86pc): >> >> $ uname -a >> SunOS sollab-242.cn.oracle.com 5.11 snv_174 i86pc i386 i86pc >> $ pkg list gnu-coreutils >> NAME (PUBLISHER) VERSION >> IFO >> file/gnu-coreutils 8.5-0.174.0.0.0.0.504 >> i-- >> $ /usr/gnu/bin/dd if=/dev/urandom of=file bs=1024k count=1 >> 0+1 records in >> > > Notice that this means you read a partial record - read() tried to read > 1024k bytes, but the read ended short at only 133120 bytes. > > 0+1 records out >> > > And because you didn't request dd to group multiple short reads before > doing a full write, you got a single (short) record written. I've never noticed what "0+1 records in/out" really means since dd always does what I mean. Thanks a lot for all the clarification. > > I'm new to Solaris but I've never seen this problem whe I use Linux so it >> really suprises me. >> > > Solaris and Linux kernels differ on when you will get short reads, and > magic files like /dev/urandom are more likely to display the issue than > regular files. That said, Linux also has the "problem" of short reads; it's > especially noticeable when passing the output of dd to a pipe. > > You probably wanted to use this GNU extension: > > dd if=/dev/urandom of=file bs=1024k count=1 iconv=fullblock > > where the iconv flag requests that dd pile together multiple read()s until > it has a full block, so that you no longer have a partial block output. > > > >> I found this in the man page of /dev/urandom on Solaris: "The limitation >> per >> read for /dev/random is 1040 bytes. The limit for /dev/urandom is (128 * >> 1040 = 133120)." That seems to be the reason but I think dd should handle >> that and check the return value of the read() system call and make sure >> 1024k bytes have really been read from /dev/urandom. >> > > Only if the iconv=fullblock flag is specified, since it is a violation of > POSIX to do more than one read() without an explicit flag requesting > multiple reads per block. > > -- > Eric Blake eblake@redhat.com +1-801-349-2682 > Libvirt virtualization library http://libvirt.org >