Question: If I want to `tail` a 25 GB textfile, does the `tail` command read the whole file?

Since a file might be scattered on a disk I imagine it has to, but I do not understand such internals well.

Answer: 
> 
> Since a file might be scattered on a disk I imagine it has to [read the file sequentially], but I do not understand such internals well.
> 
> 
> 

As you now know, `tail` just seeks to the end of the file (with the system call `lseek`), and works backwards. But in the remark quoted above, you're wondering **"how does tail know where on disk to find the end of the file?"** 

The answer is simple: Tail does not know. User-level processes see files as continuous streams, so all `tail` can know is the offset from the start of the file. But in the filesystem, the file's "inode" (directory entry) is associated with a list of numbers denoting the physical location of the file's data blocks. When you read from the file, the kernel / the device driver figures out which part you need, works out its location on disk and fetches it for you. 

That's the kind of thing we have operating systems for: so you don't have to worry about where your file's blocks are scattered.
As you can see in the [source code](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c?id=a3d070fa3269e89dfad49fde8ea30758afa36f4b#n525) line 525, you can see the comments for the implementation.

```
 /* Print the last N_LINES lines from the end of file FD.
   Go backward through the file, reading 'BUFSIZ' bytes at a time (except
   probably the first), until we hit the start of the file or have
   read NUMBER newlines.
   START_POS is the starting position of the read pointer for the file
   associated with FD (may be nonzero).
   END_POS is the file offset of EOF (one larger than offset of last byte).
   Return true if successful.  */

```